Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69b0a80684 | ||
|
|
48f0c56a9e | ||
|
|
83833a3693 | ||
|
|
18429d52d4 | ||
|
|
58cc90083b | ||
|
|
2772161144 | ||
|
|
0e95259b14 | ||
|
|
3d9f38f1e3 | ||
|
|
ba3accd834 | ||
|
|
0786e40ebd | ||
|
|
8a56393159 | ||
|
|
5ca8a6ecfa | ||
|
|
5c82edc4be | ||
|
|
093c04bc24 | ||
|
|
131dd46a38 | ||
|
|
6b1b4fdfbb | ||
|
|
e4ad779b37 | ||
|
|
65d817624e | ||
|
|
66501189c4 | ||
|
|
4303898bb8 | ||
|
|
7d76a9d3ed | ||
|
|
1cc42f341b | ||
|
|
0b41ee0a29 | ||
|
|
66b6c4d04f | ||
|
|
6502843d6c | ||
|
|
5ecfe72e19 | ||
|
|
f28cdefffe | ||
|
|
40494f2cf1 | ||
|
|
f2664c112b | ||
|
|
41d91df355 | ||
|
|
965671dd93 | ||
|
|
c8d08e4b2c | ||
|
|
2897a9b484 | ||
|
|
d190e59d83 | ||
|
|
0bb25e8773 | ||
|
|
37e1903cb1 | ||
|
|
b402846d43 | ||
|
|
c1a6dd385a |
@@ -15,6 +15,7 @@ d_log/*.txt
|
||||
d_log/*.zip
|
||||
sess_*
|
||||
*/logs/*.txt
|
||||
*/logs/*/*.txt
|
||||
err.txt
|
||||
che/.htaccess
|
||||
kwe/.htaccess
|
||||
@@ -43,3 +44,4 @@ test.php
|
||||
/twe
|
||||
|
||||
phpinfo.php
|
||||
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
|
||||
|
||||
Vendored
+1
-1
@@ -5,7 +5,7 @@
|
||||
"**/.hg": true,
|
||||
"**/CVS": true,
|
||||
"**/.DS_Store": true,
|
||||
"**/logs/*.txt": true,
|
||||
"**/logs/**/*.txt": true,
|
||||
"**/session/sess*":true,
|
||||
"/che":true,
|
||||
"/kwe":true,
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
* Apache2
|
||||
* <code>mpm_event</code> 권장
|
||||
* PHP 7.0 이상
|
||||
* PHP 7.2 이상
|
||||
* <code>php-fpm</code> 권장
|
||||
* php에서 curl을 실행가능해야 합니다.
|
||||
* MySQL 5.6 이상, 또는 MariaDB 10.0 이상
|
||||
@@ -32,13 +32,13 @@ sudo -u www-data git clone ssh://git@storage.hided.net:2525/devsam/core.git
|
||||
git clone ssh://git@storage.hided.net:2525/devsam/image.git
|
||||
```
|
||||
|
||||
> 이미지는 별도의 업데이트 기능을 제공하지 않습니다. 수동으로 <code>git pull</code>을 해야합니다.
|
||||
> 이미지는 git hook을 이용한 업데이트 기능을 제공하지만 아직 범용성 있는 설계가 되어있진 않습니다.
|
||||
|
||||
### 설치
|
||||
|
||||
이후 해당 경로를 웹 브라우저를 통해 접근하여 설치를 진행할 수 있습니다.
|
||||
|
||||
Database 수는 로그인 관리 서버 1개, 내부 서버 5개로, 총 6개의 Database가 필요합니다. 내부 설정을 고쳐서 서버 수를 늘리거나 줄일 경우 그에 맞는 Database 수가 필요합니다. 또한 Database마다 관리할 별도의 계정을 만드는 것을 추천합니다.
|
||||
Database 수는 로그인 관리 서버 1개, 내부 서버 7개로, 총 8개의 Database가 필요합니다. 내부 설정을 고쳐서 서버 수를 늘리거나 줄일 경우 그에 맞는 Database 수가 필요합니다. 또한 Database마다 관리할 별도의 계정을 만드는 것을 추천합니다.
|
||||
|
||||
설치 이후에는 서버관리 페이지에서 **업데이트** 명령을 통해 원 클릭 업데이트가 가능합니다.
|
||||
|
||||
|
||||
+3
-1
@@ -17,7 +17,9 @@
|
||||
"vlucas/valitron": "^1.4",
|
||||
"php-extended/php-tail": "^2.1",
|
||||
"pguardiario/phpuri": "^1.0",
|
||||
"symfony/lock": "^3.4"
|
||||
"symfony/lock": "^4.1",
|
||||
"ezyang/htmlpurifier": "^4.10",
|
||||
"xemlock/htmlpurifier-html5": "^0.1.7"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
||||
Generated
+135
-153
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "a329d39be5161c87438d41f9adf4417b",
|
||||
"content-hash": "43da7d5e9d8441faa4311f32b16ee1c0",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brandonwamboldt/utilphp",
|
||||
@@ -52,6 +52,53 @@
|
||||
],
|
||||
"time": "2015-02-02T17:56:14+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ezyang/htmlpurifier",
|
||||
"version": "v4.10.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ezyang/htmlpurifier.git",
|
||||
"reference": "d85d39da4576a6934b72480be6978fb10c860021"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
|
||||
"reference": "d85d39da4576a6934b72480be6978fb10c860021",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"simpletest/simpletest": "^1.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"HTMLPurifier": "library/"
|
||||
},
|
||||
"files": [
|
||||
"library/HTMLPurifier.composer.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"LGPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Edward Z. Yang",
|
||||
"email": "admin@htmlpurifier.org",
|
||||
"homepage": "http://ezyang.com"
|
||||
}
|
||||
],
|
||||
"description": "Standards compliant HTML filter written in PHP",
|
||||
"homepage": "http://htmlpurifier.org/",
|
||||
"keywords": [
|
||||
"html"
|
||||
],
|
||||
"time": "2018-02-23T01:58:20+00:00"
|
||||
},
|
||||
{
|
||||
"name": "firephp/firephp-core",
|
||||
"version": "v0.4.0",
|
||||
@@ -90,16 +137,16 @@
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/guzzle",
|
||||
"version": "6.3.2",
|
||||
"version": "6.3.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle.git",
|
||||
"reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90"
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/68d0ea14d5a3f42a20e87632a5f84931e2709c90",
|
||||
"reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -109,7 +156,7 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-curl": "*",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
||||
"psr/log": "^1.0"
|
||||
},
|
||||
"suggest": {
|
||||
@@ -151,7 +198,7 @@
|
||||
"rest",
|
||||
"web service"
|
||||
],
|
||||
"time": "2018-03-26T16:33:04+00:00"
|
||||
"time": "2018-04-22T15:46:56+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/promises",
|
||||
@@ -271,16 +318,16 @@
|
||||
},
|
||||
{
|
||||
"name": "leafo/scssphp",
|
||||
"version": "v0.7.5",
|
||||
"version": "v0.7.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/leafo/scssphp.git",
|
||||
"reference": "8b538d828bbb75276974605c4a1a435e939da74e"
|
||||
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/leafo/scssphp/zipball/8b538d828bbb75276974605c4a1a435e939da74e",
|
||||
"reference": "8b538d828bbb75276974605c4a1a435e939da74e",
|
||||
"url": "https://api.github.com/repos/leafo/scssphp/zipball/585f6ae84de62ffecf69c23805f25d78d7e4b794",
|
||||
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -319,7 +366,7 @@
|
||||
"scss",
|
||||
"stylesheet"
|
||||
],
|
||||
"time": "2018-02-09T02:04:21+00:00"
|
||||
"time": "2018-05-24T02:18:53+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/plates",
|
||||
@@ -454,54 +501,6 @@
|
||||
],
|
||||
"time": "2017-06-19T01:22:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "paragonie/random_compat",
|
||||
"version": "v2.0.12",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/paragonie/random_compat.git",
|
||||
"reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
|
||||
"reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.*|5.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"lib/random.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Paragon Initiative Enterprises",
|
||||
"email": "security@paragonie.com",
|
||||
"homepage": "https://paragonie.com"
|
||||
}
|
||||
],
|
||||
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||
"keywords": [
|
||||
"csprng",
|
||||
"pseudorandom",
|
||||
"random"
|
||||
],
|
||||
"time": "2018-04-04T21:24:14+00:00"
|
||||
},
|
||||
{
|
||||
"name": "pguardiario/phpuri",
|
||||
"version": "1.0",
|
||||
@@ -528,16 +527,16 @@
|
||||
},
|
||||
{
|
||||
"name": "php-extended/php-system",
|
||||
"version": "1.3.0",
|
||||
"version": "1.4.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-extended/php-system.git",
|
||||
"reference": "66727d5dc0a665916bd7e08bcfb9820e7be1d20c"
|
||||
"url": "https://gitlab.com/php-extended/php-system.git",
|
||||
"reference": "9e6b3c2009ef56dc123efc43900e40cdf217ace0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-extended/php-system/zipball/66727d5dc0a665916bd7e08bcfb9820e7be1d20c",
|
||||
"reference": "66727d5dc0a665916bd7e08bcfb9820e7be1d20c",
|
||||
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-system/repository/archive.zip?sha=9e6b3c2009ef56dc123efc43900e40cdf217ace0",
|
||||
"reference": "9e6b3c2009ef56dc123efc43900e40cdf217ace0",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
@@ -553,31 +552,31 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anastaszor",
|
||||
"role": "developer"
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A generic way to find informations about the running system",
|
||||
"homepage": "https://github.com/php-extended/php-system",
|
||||
"homepage": "https://gitlab.com/php-extended/php-system",
|
||||
"keywords": [
|
||||
"operating system",
|
||||
"os",
|
||||
"php",
|
||||
"system"
|
||||
],
|
||||
"time": "2017-01-14T11:56:24+00:00"
|
||||
"time": "2018-06-07T06:03:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "php-extended/php-tail",
|
||||
"version": "2.1.1",
|
||||
"version": "2.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-extended/php-tail.git",
|
||||
"reference": "eabf7bee64f8c30fe9b9e1176562fdb903c54ae7"
|
||||
"url": "https://gitlab.com/php-extended/php-tail.git",
|
||||
"reference": "19fbd3a79ccc071954f28296b2c44754335304a0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-extended/php-tail/zipball/eabf7bee64f8c30fe9b9e1176562fdb903c54ae7",
|
||||
"reference": "eabf7bee64f8c30fe9b9e1176562fdb903c54ae7",
|
||||
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-tail/repository/archive.zip?sha=19fbd3a79ccc071954f28296b2c44754335304a0",
|
||||
"reference": "19fbd3a79ccc071954f28296b2c44754335304a0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -596,11 +595,11 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anastaszor",
|
||||
"role": "developer"
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A smart way to tail files depending of the environment",
|
||||
"homepage": "https://github.com/php-extended/php-tail",
|
||||
"homepage": "https://gitlab.com/php-extended/php-tail",
|
||||
"keywords": [
|
||||
"cheat",
|
||||
"mighty",
|
||||
@@ -608,7 +607,7 @@
|
||||
"php",
|
||||
"tail"
|
||||
],
|
||||
"time": "2017-07-25T13:52:42+00:00"
|
||||
"time": "2018-06-07T06:04:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/http-message",
|
||||
@@ -752,22 +751,21 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/lock",
|
||||
"version": "v3.4.9",
|
||||
"version": "v4.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/lock.git",
|
||||
"reference": "3a707193326d31603824706e34a95af899a59788"
|
||||
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/lock/zipball/3a707193326d31603824706e34a95af899a59788",
|
||||
"reference": "3a707193326d31603824706e34a95af899a59788",
|
||||
"url": "https://api.github.com/repos/symfony/lock/zipball/a1df50492e927ad00ca271f29adb2949a14f2a5a",
|
||||
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.5.9|>=7.0.8",
|
||||
"psr/log": "~1.0",
|
||||
"symfony/polyfill-php70": "~1.0"
|
||||
"php": "^7.1.3",
|
||||
"psr/log": "~1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"predis/predis": "~1.0"
|
||||
@@ -775,7 +773,7 @@
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.4-dev"
|
||||
"dev-master": "4.1-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@@ -810,96 +808,40 @@
|
||||
"redlock",
|
||||
"semaphore"
|
||||
],
|
||||
"time": "2018-04-29T14:44:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php70",
|
||||
"version": "v1.8.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php70.git",
|
||||
"reference": "77454693d8f10dd23bb24955cffd2d82db1007a6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6",
|
||||
"reference": "77454693d8f10dd23bb24955cffd2d82db1007a6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"paragonie/random_compat": "~1.0|~2.0",
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.8-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php70\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"classmap": [
|
||||
"Resources/stubs"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"polyfill",
|
||||
"portable",
|
||||
"shim"
|
||||
],
|
||||
"time": "2018-04-26T10:06:28+00:00"
|
||||
"time": "2018-05-30T07:26:09+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vlucas/valitron",
|
||||
"version": "v1.4.2",
|
||||
"version": "v1.4.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vlucas/valitron.git",
|
||||
"reference": "87775d76268beda2afa085bdd6e44b17e98907c6"
|
||||
"reference": "3c5463315bfa23b17f8949b100a960d035234e43"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/87775d76268beda2afa085bdd6e44b17e98907c6",
|
||||
"reference": "87775d76268beda2afa085bdd6e44b17e98907c6",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/3c5463315bfa23b17f8949b100a960d035234e43",
|
||||
"reference": "3c5463315bfa23b17f8949b100a960d035234e43",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.5 || ^6.5"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "It can support the multiple bytes string length."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Valitron": "src/"
|
||||
"psr-4": {
|
||||
"Valitron\\": "src/Valitron"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD"
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
@@ -915,7 +857,47 @@
|
||||
"validation",
|
||||
"validator"
|
||||
],
|
||||
"time": "2017-10-30T23:15:06+00:00"
|
||||
"time": "2018-05-06T10:45:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "xemlock/htmlpurifier-html5",
|
||||
"version": "v0.1.7",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/xemlock/htmlpurifier-html5.git",
|
||||
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/xemlock/htmlpurifier-html5/zipball/b4b35e51ec75e0207c23035f7d9a354bdcdac359",
|
||||
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ezyang/htmlpurifier": "^4.7",
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.7.*|5.7.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"library/HTMLPurifier/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "xemlock",
|
||||
"email": "xemlock@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "HTML Purifier definitions for HTML5 elements",
|
||||
"time": "2018-06-07T14:30:17+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
|
||||
Binary file not shown.
+14
-1
@@ -13,11 +13,11 @@ if($session->userGrade < 5) {
|
||||
|
||||
$btn = Util::getReq('btn');
|
||||
$genlist = Util::getReq('genlist', 'array_int');
|
||||
$msg = Util::getReq('msg','string', '메시지');
|
||||
|
||||
extractMissingPostToGlobals();
|
||||
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
|
||||
//NOTE: 왜 기능이 admin2와 admin4가 같이 있는가?
|
||||
//NOTE: 왜 블럭 시 admin4에선 금쌀을 없애지 않는가?
|
||||
@@ -57,7 +57,20 @@ switch($btn) {
|
||||
case "메세지 전달":
|
||||
//TODO:새 갠메 시스템으로 변경
|
||||
$date = date('Y-m-d H:i:s');
|
||||
$src = MessageTarget::buildQuick($session->generalID);
|
||||
for($i=0; $i < count($genlist); $i++) {
|
||||
$msgObj = new Message(
|
||||
Message::MSGTYPE_PRIVATE,
|
||||
$src,
|
||||
MessageTarget::buildQuick($genlist[$i]),
|
||||
$msg,
|
||||
new DateTime(),
|
||||
new \DateTime('9999-12-31'),
|
||||
[]
|
||||
);
|
||||
if($msgObj){
|
||||
$msgObj->send(true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+135
-283
@@ -14,19 +14,9 @@ $userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$connect=$db->get();
|
||||
|
||||
increaseRefresh("명장일람", 2);
|
||||
increaseRefresh("명장일람", 1);
|
||||
|
||||
$query = "select con,turntime from general where owner='{$userID}'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$me = MYDB_fetch_array($result);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -36,14 +26,14 @@ if ($con >= 2) {
|
||||
<title><?=UniqueConst::$serverName?>: 명장일람</title>
|
||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||
<?=WebUtil::printCSS('css/common.css')?>
|
||||
|
||||
<?=WebUtil::printCSS('css/hallOfFame.css')?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr><td>명 장 일 람<br><?=closeButton()?></td></tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<form name=form1 action=a_bestGeneral.php method=post>
|
||||
<tr><td align=center>
|
||||
<input type=submit name=btn value='유저 보기'>
|
||||
@@ -51,294 +41,156 @@ if ($con >= 2) {
|
||||
</td></tr>
|
||||
</form>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<div style="margin:auto;width=1000px;">
|
||||
<?php
|
||||
if (isset($btn) && $btn == "NPC 보기") {
|
||||
//FIXME: query가 너무 적나라.
|
||||
$sel = "npc>=2";
|
||||
} else {
|
||||
$sel = "npc<2";
|
||||
}
|
||||
|
||||
$nationName = ['재야'];
|
||||
$nationColor = ['#000000'];
|
||||
|
||||
$nationName = [0=>'재야'];
|
||||
$nationColor = [0=>'#000000'];
|
||||
foreach (getAllNationStaticInfo() as $nation) {
|
||||
$nationName[$nation['nation']] = $nation['name'];
|
||||
$nationColor[$nation['nation']] = $nation['color'];
|
||||
}
|
||||
|
||||
$type = array(
|
||||
"명 성",
|
||||
"계 급",
|
||||
"계 략 성 공",
|
||||
"전 투 횟 수",
|
||||
"승 리",
|
||||
"승 률",
|
||||
"사 살",
|
||||
"살 상 률",
|
||||
"보 병 숙 련 도",
|
||||
"궁 병 숙 련 도",
|
||||
"기 병 숙 련 도",
|
||||
"귀 병 숙 련 도",
|
||||
"차 병 숙 련 도",
|
||||
"전 력 전 승 률",
|
||||
"통 솔 전 승 률",
|
||||
"일 기 토 승 률",
|
||||
"설 전 승 률",
|
||||
"베 팅 투 자 액",
|
||||
"베 팅 당 첨",
|
||||
"베 팅 수 익 금",
|
||||
"베 팅 수 익 률"
|
||||
);
|
||||
$types = [
|
||||
["명 성", "int", function($v){$v['value'] = $v['experience']; return $v; }],
|
||||
["계 급", "int", function($v){$v['value'] = $v['dedication']; return $v; }],
|
||||
["계 략 성 공", "int", function($v){
|
||||
$v['value'] = $v['firenum'];
|
||||
$v['nationName'] = '???';
|
||||
$v['pictureFullPath'] = GetImageURL(0)."/default.jpg";
|
||||
$v['name'] = '???';
|
||||
$v['owner_name'] = null;
|
||||
$v['bgColor'] = GameConst::$basecolor4;
|
||||
$v['fgColor'] = newColor($v['bgColor']);
|
||||
return $v;
|
||||
}],
|
||||
["전 투 횟 수", "int", function($v){$v['value'] = $v['warnum']; return $v; }],
|
||||
["승 리", "int", function($v){$v['value'] = $v['killnum']; return $v; }],
|
||||
["승 률", "percent", function($v){$v['value'] = $v['killnum'] / max(1, $v['warnum']); return $v; }],
|
||||
["사 살", "int", function($v){$v['value'] = $v['killcrew']; return $v; }],
|
||||
["살 상 률", "percent", function($v){$v['value'] = $v['killcrew'] / max(1, $v['deathcrew']); return $v; }],
|
||||
["보 병 숙 련 도", "int", function($v){$v['value'] = $v['dex0']; return $v; }],
|
||||
["궁 병 숙 련 도", "int", function($v){$v['value'] = $v['dex10']; return $v; }],
|
||||
["기 병 숙 련 도", "int", function($v){$v['value'] = $v['dex20']; return $v; }],
|
||||
["귀 병 숙 련 도", "int", function($v){$v['value'] = $v['dex30']; return $v; }],
|
||||
["차 병 숙 련 도", "int", function($v){$v['value'] = $v['dex40']; return $v; }],
|
||||
["전 력 전 승 률", "percent", function($v){$v['value'] = $v['ttw']/max(1, $v['ttw']+$v['ttd']+$v['ttl']); return $v; }],
|
||||
["통 솔 전 승 률", "percent", function($v){$v['value'] = $v['tlw']/max(1, $v['tlw']+$v['tld']+$v['tll']); return $v; }],
|
||||
["일 기 토 승 률", "percent", function($v){$v['value'] = $v['tpw']/max(1, $v['tpw']+$v['tpd']+$v['tpl']); return $v; }],
|
||||
["설 전 승 률", "percent", function($v){$v['value'] = $v['ttw']/max(1, $v['tiw']+$v['tid']+$v['til']); return $v; }],
|
||||
["베 팅 투 자 액", "int", function($v){$v['value'] = $v['betgold']; return $v; }],
|
||||
["베 팅 당 첨", "int", function($v){$v['value'] = $v['betwin']; return $v; }],
|
||||
["베 팅 수 익 금", "int", function($v){$v['value'] = $v['betwingold']; return $v; }],
|
||||
["베 팅 수 익 률", "percent", function($v){$v['value'] = $v['betwingold']/max(1, $v['betgold']); return $v; }],
|
||||
];
|
||||
|
||||
|
||||
for ($i=0; $i < 21; $i++) {
|
||||
$name = [];
|
||||
$data = [];
|
||||
$color = [];
|
||||
$pic = [];
|
||||
|
||||
//FIXME: 쿼리에 index를 사용할 수 없는 녀석들이 있다. 그냥 모두 받아서 일괄 처리하는게 더 나을 수도 있음.
|
||||
switch ($i) {
|
||||
case 0: $query = "select nation,no,name,picture,imgsvr,experience as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 1: $query = "select nation,no,name,picture,imgsvr,dedication as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 2: $query = "select nation,no,name,picture,imgsvr,firenum as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 3: $query = "select nation,no,name,picture,imgsvr,warnum as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 4: $query = "select nation,no,name,picture,imgsvr,killnum as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 5: $query = "select nation,no,name,picture,imgsvr,killnum/warnum*10000 as data from general where warnum>=10 and $sel order by data desc limit 0,10"; break;
|
||||
case 6: $query = "select nation,no,name,picture,imgsvr,killcrew as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 7: $query = "select nation,no,name,picture,imgsvr,killcrew/deathcrew*10000 as data from general where warnum>=10 and $sel order by data desc limit 0,10"; break;
|
||||
case 8: $query = "select nation,no,name,picture,imgsvr,dex0 as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 9: $query = "select nation,no,name,picture,imgsvr,dex10 as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 10: $query = "select nation,no,name,picture,imgsvr,dex20 as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 11: $query = "select nation,no,name,picture,imgsvr,dex30 as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 12: $query = "select nation,no,name,picture,imgsvr,dex40 as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 13: $query = "select nation,no,name,picture,imgsvr,ttw/(ttw+ttd+ttl)*10000 as data from general where $sel and (ttw+ttd+ttl)>=50 order by data desc limit 0,10"; break;
|
||||
case 14: $query = "select nation,no,name,picture,imgsvr,tlw/(tlw+tld+tll)*10000 as data from general where $sel and (tlw+tld+tll)>=50 order by data desc limit 0,10"; break;
|
||||
case 15: $query = "select nation,no,name,picture,imgsvr,tpw/(tpw+tpd+tpl)*10000 as data from general where $sel and (tpw+tpd+tpl)>=50 order by data desc limit 0,10"; break;
|
||||
case 16: $query = "select nation,no,name,picture,imgsvr,tiw/(tiw+tid+til)*10000 as data from general where $sel and (tiw+tid+til)>=50 order by data desc limit 0,10"; break;
|
||||
case 17: $query = "select nation,no,name,picture,imgsvr,betgold as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 18: $query = "select nation,no,name,picture,imgsvr,betwin as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 19: $query = "select nation,no,name,picture,imgsvr,betwingold as data from general where $sel order by data desc limit 0,10"; break;
|
||||
case 20: $query = "select nation,no,name,picture,imgsvr,betwingold/betgold*10000 as data from general where $sel and betgold >= 1000 order by data desc limit 0,10"; break;
|
||||
$generals = array_map(function($general) use($nationColor, $nationName) {
|
||||
$general['bgColor'] = $nationColor[$general['nation']]??GameConst::$basecolor4;
|
||||
$general['fgColor'] = newColor($general['bgColor']);
|
||||
$general['nationName'] = $nationName[$general['nation']];
|
||||
|
||||
if(key_exists('picture', $general)){
|
||||
$imageTemp = GetImageURL($general['imgsvr']);
|
||||
$general['pictureFullPath'] = "$imageTemp/{$general['picture']}";
|
||||
}
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
|
||||
echo "
|
||||
<tr><td align=center colspan=10 id=bg1><font size=4>$type[$i]</font></td></tr>
|
||||
<tr align=center id=bg2><td>1위</td><td>2위</td><td>3위</td><td>4위</td><td>5위</td><td>6위</td><td>7위</td><td>8위</td><td>9위</td><td>10위</td></tr>
|
||||
<tr>";
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
$gen = MYDB_fetch_array($result);
|
||||
|
||||
if ($i != 2) {
|
||||
if (isset($gen)) {
|
||||
$name[$k] = $gen['name'];
|
||||
$nation[$k] = $nationName[$gen['nation']];
|
||||
$data[$k] = $gen['data'];
|
||||
$color[$k] = $nationColor[$gen['nation']];
|
||||
$pic[$k] = $gen['picture'];
|
||||
} else {
|
||||
$name[$k] = "-";
|
||||
$nation[$k] = "-";
|
||||
$data[$k] = "-";
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
$pic[$k] = "";
|
||||
}
|
||||
} else {
|
||||
$name[$k] = "???";
|
||||
$nation[$k] = "???";
|
||||
$data[$k] = $gen['data'];
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
$gen['imgsvr'] = 0;
|
||||
$pic[$k] = "9999.jpg";
|
||||
}
|
||||
if ($color[$k] == "") {
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
}
|
||||
if ($nation[$k] == "") {
|
||||
$nation[$k] = " ";
|
||||
}
|
||||
if ($pic[$k] == "") {
|
||||
echo "<td align=center> </td>";
|
||||
} else {
|
||||
$imageTemp = GetImageURL($gen['imgsvr']);
|
||||
echo "<td align=center><img width='64' height='64' src={$imageTemp}/{$pic[$k]}></td>";
|
||||
}
|
||||
else{
|
||||
$general['pictureFullPath'] = GetImageURL(0)."/default.jpg";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
return $general;
|
||||
}, $db->query(
|
||||
"SELECT nation,no,name,name2 as owner_name, picture, imgsvr,
|
||||
experience, dedication, firenum, warnum, killnum, killcrew, deathcrew,
|
||||
dex0, dex10, dex20, dex30, dex40,
|
||||
ttw, ttd, ttl, tlw, tld, tll, tpw, tpd, tpl, tiw, tid, til,
|
||||
betgold, betwin, betwingold,
|
||||
horse, weap, book, item
|
||||
FROM general WHERE %l", $btn == "NPC 보기"?"npc>=2":"npc<2"));
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$nation[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
$templates = new \League\Plates\Engine('templates');
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$name[$k]}</td>";
|
||||
}
|
||||
foreach($types as $idx=>[$typeName, $typeValue, $typeFunc]){
|
||||
$typeGenerals = array_map(function($general) use($typeValue, $typeFunc){
|
||||
$general = ($typeFunc)($general);
|
||||
$value = $general['value'];
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
if($data[$k] === '-'){
|
||||
//do Nothing
|
||||
if($typeValue == 'percent'){
|
||||
$general['printValue'] = number_format($value*100, 2).'%';
|
||||
}
|
||||
else if ($i == 5 || $i == 7 || $i == 20) {
|
||||
$data[$k] = intdiv($data[$k], 100).".".($data[$k]%100)." %";
|
||||
else {
|
||||
$general['printValue'] = number_format($value);
|
||||
}
|
||||
else if ($i >= 13 && $i <= 16) {
|
||||
$data[$k] = intdiv($data[$k], 100).".".($data[$k]%100)." %";
|
||||
}
|
||||
echo "<td align=center>{$data[$k]}</td>";
|
||||
}
|
||||
echo "</tr><tr><td colspan=10 height=5 id=bg1></td></tr>";
|
||||
return $general;
|
||||
}, $generals);
|
||||
|
||||
usort($typeGenerals, function($lhs, $rhs){
|
||||
//내림차순
|
||||
return -($lhs['value'] - $rhs['value']);
|
||||
});
|
||||
|
||||
echo $templates->render('hallOfFrame', [
|
||||
'typeName'=>$typeName,
|
||||
'generals'=>array_slice($typeGenerals, 0, 10, true)
|
||||
]);
|
||||
}
|
||||
|
||||
echo "
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
";
|
||||
|
||||
$type = array(
|
||||
"명 마",
|
||||
"명 검",
|
||||
"명 서",
|
||||
"도 구"
|
||||
);
|
||||
|
||||
$call = array(
|
||||
"horse",
|
||||
"weap",
|
||||
"book",
|
||||
"item"
|
||||
);
|
||||
|
||||
$func = array(
|
||||
"\\sammo\\getHorseName",
|
||||
"\\sammo\\getWeapName",
|
||||
"\\sammo\\getBookName",
|
||||
"\\sammo\\getItemName"
|
||||
);
|
||||
|
||||
for ($i=0; $i < 4; $i++) {
|
||||
$name = [];
|
||||
$data = [];
|
||||
$color = [];
|
||||
$pic = [];
|
||||
|
||||
echo "
|
||||
<tr><td align=center colspan=10 id=bg1><font size=4>$type[$i]</font></td></tr>
|
||||
<tr align=center id=bg2>";
|
||||
for ($k=26; $k > 16; $k--) {
|
||||
$str = $func[$i]($k);
|
||||
echo "<td>".$str."</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=26; $k > 16; $k--) {
|
||||
$query = "select nation,no,name,picture,imgsvr from general where {$call[$i]}={$k}";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$gen = MYDB_fetch_array($result);
|
||||
if (isset($gen)) {
|
||||
$name[$k] = $gen['name'];
|
||||
$nation[$k] = $nationName[$gen['nation']];
|
||||
$color[$k] = $nationColor[$gen['nation']];
|
||||
$pic[$k] = $gen['picture'];
|
||||
} else {
|
||||
$name[$k] = "미발견";
|
||||
$nation[$k] = "-";
|
||||
$color[$k] = "";
|
||||
$pic[$k] = "";
|
||||
}
|
||||
if ($color[$k] == "") {
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
}
|
||||
if ($nation[$k] == "") {
|
||||
$nation[$k] = " ";
|
||||
}
|
||||
if ($pic[$k] == "") {
|
||||
echo "<td align=center> </td>";
|
||||
} else {
|
||||
$imageTemp = GetImageURL($gen['imgsvr']??0);
|
||||
echo "<td align=center><img width='64' height='64' src={$imageTemp}/{$pic[$k]}></img></td>";
|
||||
}
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=26; $k > 16; $k--) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$nation[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=26; $k > 16; $k--) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$name[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr><td colspan=10 height=5 id=bg1></td></tr>";
|
||||
|
||||
echo "
|
||||
<tr align=center id=bg2>";
|
||||
for ($k=16; $k > 6; $k--) {
|
||||
$str = $func[$i]($k);
|
||||
echo "<td>".$str."</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=16; $k > 6; $k--) {
|
||||
$query = "select nation,no,name,picture,imgsvr from general where {$call[$i]}={$k}";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$gen = MYDB_fetch_array($result);
|
||||
if (isset($gen)) {
|
||||
$name[$k] = $gen['name'];
|
||||
$nation[$k] = $nationName[$gen['nation']];
|
||||
$color[$k] = $nationColor[$gen['nation']];
|
||||
$pic[$k] = $gen['picture'];
|
||||
} else {
|
||||
$name[$k] = "미발견";
|
||||
$nation[$k] = "-";
|
||||
$color[$k] = "";
|
||||
$pic[$k] = "";
|
||||
}
|
||||
if ($color[$k] == "") {
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
}
|
||||
if ($nation[$k] == "") {
|
||||
$nation[$k] = " ";
|
||||
}
|
||||
if ($pic[$k] == "") {
|
||||
echo "<td align=center> </td>";
|
||||
} else {
|
||||
$imageTemp = GetImageURL($gen['imgsvr']??0);
|
||||
echo "<td align=center><img width='64' height='64' src={$imageTemp}/{$pic[$k]}></img></td>";
|
||||
}
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=16; $k > 6; $k--) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$nation[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=16; $k > 6; $k--) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$name[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr><td colspan=10 height=5 id=bg1></td></tr>";
|
||||
}
|
||||
|
||||
?>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
</div>
|
||||
<div style="margin:auto;width=1000px;margin-top:5px;">
|
||||
<?php
|
||||
//유니크 아이템 소유자
|
||||
$itemTypes = [
|
||||
["명 마", 'horse', function($v){return getHorseName($v);}, 7, 26, []],
|
||||
["명 검", 'weap', function($v){return getWeapName($v);}, 7, 26, []],
|
||||
["명 서", 'book', function($v){return getBookName($v);}, 7, 26, []],
|
||||
["도 구", 'item', function($v){return getItemName($v);}, 7, 26, []],
|
||||
];
|
||||
|
||||
$simpleItemTypes = array_map(function($itemType){return $itemType[1];}, $itemTypes);
|
||||
|
||||
foreach($generals as $general){
|
||||
foreach($itemTypes as $itemIdx=>[,$itemType, $itemFunc,,,]){
|
||||
$itemCode = $general[$itemType];
|
||||
if($itemCode <= 6){
|
||||
continue;
|
||||
}
|
||||
|
||||
$itemName = ($itemFunc)($itemCode);
|
||||
$general['rankName'] = $itemName;
|
||||
$general['value'] = $itemCode;
|
||||
$itemTypes[$itemIdx][5][$itemCode] = $general;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($itemTypes as [$itemNameType, $itemType, $itemFunc, $itemMinCode, $itemMaxCode, $itemOwners]){
|
||||
$itemRanker = [];
|
||||
for($itemCode = $itemMaxCode; $itemCode >= $itemMinCode; $itemCode--){
|
||||
if(!key_exists($itemCode, $itemOwners)){
|
||||
$emptyCard = [
|
||||
'rankName' => ($itemFunc)($itemCode),
|
||||
'pictureFullPath' => GetImageURL(0)."/default.jpg",
|
||||
'value'=>$itemCode,
|
||||
'name'=>'미발견',
|
||||
'bgColor'=>GameConst::$basecolor4,
|
||||
'fgColor'=>newColor(GameConst::$basecolor4),
|
||||
];
|
||||
$itemRanker[$itemCode] = $emptyCard;
|
||||
continue;
|
||||
}
|
||||
|
||||
$general = $itemOwners[$itemCode];
|
||||
$itemRanker[$itemCode] = $general;
|
||||
}
|
||||
|
||||
echo $templates->render('hallOfFrame', [
|
||||
'typeName'=>$itemNameType,
|
||||
'generals'=>$itemRanker
|
||||
]);
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr><td><?=closeButton()?></td></tr>
|
||||
<tr><td><?=banner()?> </td></tr>
|
||||
</table>
|
||||
|
||||
+99
-85
@@ -4,10 +4,29 @@ namespace sammo;
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$session = Session::getInstance()->setReadOnly();
|
||||
$scenarioIdx = Util::getReq('scenarioIdx', 'int', null);
|
||||
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
|
||||
increaseRefresh("명예의전당", 1);
|
||||
|
||||
$scenarioList= [];
|
||||
foreach($db->query('SELECT distinct(scenario_name) as name, count(scenario) as cnt, scenario from ng_games order by scenario asc') as $scenarioInfo){
|
||||
$scenarioList[$scenarioInfo['scenario']] = $scenarioInfo;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if($scenarioIdx !== null || key_exists($scenarioIdx, $scenarioList)){
|
||||
$searchScenarioName = $scenarioList[$scenarioIdx]['name'];
|
||||
$searchFilter = $db->sqleval('scenario = %i', $scenarioIdx);
|
||||
}
|
||||
else{
|
||||
$searchScenarioName = '* 모두 *';
|
||||
$searchFilter = $db->sqleval(true);
|
||||
}
|
||||
|
||||
increaseRefresh("명예의전당", 2);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -17,104 +36,99 @@ increaseRefresh("명예의전당", 2);
|
||||
<title><?=UniqueConst::$serverName?>: 명예의 전당</title>
|
||||
<?=WebUtil::printCSS('../d_shared/common.css')?>
|
||||
<?=WebUtil::printCSS('css/common.css')?>
|
||||
|
||||
<?=WebUtil::printCSS('css/hallOfFame.css')?>
|
||||
<?=WebUtil::printJS('../e_lib/jquery-3.2.1.min.js')?>
|
||||
<?=WebUtil::printJS('../e_lib/jquery.redirect.js')?>
|
||||
<?=WebUtil::printJs('js/hallOfFame.js')?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr><td>명 예 의 전 당<br><?=closeButton()?></td></tr>
|
||||
<tr><td>
|
||||
시나리오 검색 : <select id="by_scenario" name="by_scenario">
|
||||
<option value="" <?=$scenarioIdx?"selected='selected'":''?>>* 종합 *</option>
|
||||
<?php foreach($scenarioList as $info): ?>
|
||||
<option
|
||||
value="<?=$info['scenario']?>"
|
||||
<?=($info['scenario']===$scenarioIdx)?"selected='selected'":''?>
|
||||
><?=$info['name']?>(<?=$info['cnt']?>회)</option>
|
||||
<?php endforeach; ?>
|
||||
?>
|
||||
</select>
|
||||
</td></tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<div style="margin:auto;width=1100px;">
|
||||
<?php
|
||||
$type = array(
|
||||
"명 성",
|
||||
"계 급",
|
||||
"계 략 성 공",
|
||||
"전 투 횟 수",
|
||||
"승 리",
|
||||
"승 률",
|
||||
"사 살",
|
||||
"살 상 률",
|
||||
"보 병 숙 련 도",
|
||||
"궁 병 숙 련 도",
|
||||
"기 병 숙 련 도",
|
||||
"귀 병 숙 련 도",
|
||||
"차 병 숙 련 도",
|
||||
"전 력 전 승 률",
|
||||
"통 솔 전 승 률",
|
||||
"일 기 토 승 률",
|
||||
"설 전 승 률",
|
||||
"베 팅 투 자 액",
|
||||
"베 팅 당 첨",
|
||||
"베 팅 수 익 금",
|
||||
"베 팅 수 익 률"
|
||||
);
|
||||
for ($i=0; $i < 21; $i++) {
|
||||
$name = [];
|
||||
$nation = [];
|
||||
$data = [];
|
||||
$color = [];
|
||||
$pic = [];
|
||||
|
||||
$query = "select * from hall where type={$i} order by rank";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$types = [
|
||||
["명 성", 'int'],
|
||||
["계 급", 'int'],
|
||||
["계 략 성 공", 'int'],
|
||||
["전 투 횟 수", 'int'],
|
||||
["승 리", 'int'],
|
||||
["승 률", 'percent'],
|
||||
["사 살", 'int'],
|
||||
["살 상 률", 'percent'],
|
||||
["보 병 숙 련 도", 'int'],
|
||||
["궁 병 숙 련 도", 'int'],
|
||||
["기 병 숙 련 도", 'int'],
|
||||
["귀 병 숙 련 도", 'int'],
|
||||
["차 병 숙 련 도", 'int'],
|
||||
["전 력 전 승 률", 'percent'],
|
||||
["통 솔 전 승 률", 'percent'],
|
||||
["일 기 토 승 률", 'percent'],
|
||||
["설 전 승 률", 'percent'],
|
||||
["베 팅 투 자 액", 'int'],
|
||||
["베 팅 당 첨", 'int'],
|
||||
["베 팅 수 익 금", 'int'],
|
||||
["베 팅 수 익 률", 'percent'],
|
||||
];
|
||||
|
||||
echo "
|
||||
<tr><td align=center colspan=10 id=bg1><font size=4>$type[$i]</font></td></tr>
|
||||
<tr align=center id=bg2><td>1위</td><td>2위</td><td>3위</td><td>4위</td><td>5위</td><td>6위</td><td>7위</td><td>8위</td><td>9위</td><td>10위</td></tr>
|
||||
<tr>";
|
||||
$templates = new \League\Plates\Engine('templates');
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
$gen = MYDB_fetch_array($result);
|
||||
$name[$k] = $gen['name'];
|
||||
$nation[$k] = $gen['nation'];
|
||||
$data[$k] = $gen['data'];
|
||||
$color[$k] = $gen['color'];
|
||||
$pic[$k] = $gen['picture'];
|
||||
if ($color[$k] == "") {
|
||||
$color[$k] = GameConst::$basecolor4;
|
||||
foreach($types as $idx=>[$typeName, $typeValue]) {
|
||||
$hallResult = $db->query('SELECT * FROM ng_hall WHERE `type`=%i AND %? ORDER BY `value` DESC LIMIT 10', $idx, $searchFilter);
|
||||
|
||||
$hallResult = array_map(function($general)use($typeValue){
|
||||
$aux = Json::decode($general['aux']);
|
||||
$general += $aux;
|
||||
if(!key_exists('color', $general)){
|
||||
$general['bgColor'] = GameConst::$basecolor4;
|
||||
|
||||
}
|
||||
if ($nation[$k] == "") {
|
||||
$nation[$k] = " ";
|
||||
if(!key_exists('fgColor', $general)){
|
||||
$general['fgColor'] = newColor($general['bgColor']);
|
||||
}
|
||||
/*
|
||||
if($pic[$k] == "") {
|
||||
echo "<td align=center> </td>";
|
||||
} else {
|
||||
$imageTemp = GetImageURL($gen['imgsvr']);
|
||||
echo "<td align=center><img width='64' height='64' src={$imageTemp}/{$pic[$k]}></img></td>";
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// echo "</tr><tr>";
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$nation[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
echo "<td align=center style=background-color:{$color[$k]};font-size:80%;color:".newColor($color[$k]).">{$name[$k]}</td>";
|
||||
}
|
||||
|
||||
echo "</tr><tr>";
|
||||
|
||||
for ($k=0; $k < 10; $k++) {
|
||||
if ($i == 5 || $i == 7 || $i == 20) {
|
||||
$data[$k] = intdiv($data[$k], 100).".".($data[$k]%100)." %";
|
||||
if(key_exists('picture', $general)){
|
||||
$imageTemp = GetImageURL($general['imgsvr']);
|
||||
$general['pictureFullPath'] = "$imageTemp/{$general['picture']}";
|
||||
}
|
||||
if ($i >= 13 && $i <= 16) {
|
||||
$data[$k] = intdiv($data[$k], 100).".".($data[$k]%100)." %";
|
||||
else{
|
||||
$general['pictureFullPath'] = GetImageURL(0)."/default.jpg";
|
||||
}
|
||||
echo "<td align=center>{$data[$k]}</td>";
|
||||
}
|
||||
echo "</tr><tr><td colspan=10 height=5 id=bg1></td></tr>";
|
||||
|
||||
if(!key_exists('printValue', $general)){
|
||||
$value = $general['value'];
|
||||
if($typeValue == 'percent'){
|
||||
$general['printValue'] = number_format($value*100, 2).'%';
|
||||
}
|
||||
else {
|
||||
$general['printValue'] = number_format($value);
|
||||
}
|
||||
}
|
||||
|
||||
return $general;
|
||||
}, $hallResult);
|
||||
|
||||
echo $templates->render('hallOfFrame', [
|
||||
'typeName'=>$typeName,
|
||||
'generals'=>$hallResult
|
||||
]);
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
</div>
|
||||
<table align=center width=1100 class='tb_layout bg0'>
|
||||
<tr><td><?=closeButton()?></td></tr>
|
||||
<tr><td><?=banner()?> </td></tr>
|
||||
</table>
|
||||
|
||||
+11
-20
@@ -30,15 +30,11 @@ if ($con >= 2) {
|
||||
exit();
|
||||
}
|
||||
|
||||
$query = "select year,month from history order by no limit 1";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$history = MYDB_fetch_array($result);
|
||||
$s = ($history['year']*12) + $history['month'];
|
||||
[$s_year, $s_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year ASC, month ASC LIMIT 1', UniqueConst::$serverID);
|
||||
$s = $s_year * 12 + $s_month;
|
||||
|
||||
$query = "select year,month from history order by no desc limit 1";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$history = MYDB_fetch_array($result);
|
||||
$e = ($history['year']*12) + $history['month'];
|
||||
[$e_year, $e_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year DESC, month DESC LIMIT 1', UniqueConst::$serverID);
|
||||
$e = $e_year * 12 + $e_month;
|
||||
|
||||
//FIXME: $yearmonth가 올바르지 않을 경우에 처리가 필요.
|
||||
if (!$yearmonth) {
|
||||
@@ -98,24 +94,19 @@ if ($month <= 0) {
|
||||
<input type=submit name=btn value="◀◀ 이전달">
|
||||
<select name=yearmonth size=1>
|
||||
<?php
|
||||
$query = "select year,month from history";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$histCount = MYDB_num_rows($result);
|
||||
for ($i=0; $i < $histCount; $i++) {
|
||||
$history = MYDB_fetch_array($result);
|
||||
$value = "".$history['year'].StringUtil::padStringAlignRight($history['month'], 2, "0");
|
||||
if ($history['year'] == $year && $history['month'] == $month) {
|
||||
$dates = $db->queryAllLists('SELECT year, month FROM history WHERE server_id = %s ORDER BY year ASC, month DESC', UniqueConst::$serverID);
|
||||
foreach($dates as [$hYear, $hMonth]){
|
||||
$value = "".$hYear.StringUtil::padStringAlignRight($hMonth, 2, "0");
|
||||
if ($hYear == $year && $hMonth == $month) {
|
||||
echo "
|
||||
<option selected value={$value}>{$history['year']}년 {$history['month']}월</option>";
|
||||
<option selected value={$value}>{$hYear}년 {$hMonth}월</option>";
|
||||
} else {
|
||||
echo "
|
||||
<option value={$value}>{$history['year']}년 {$history['month']}월</option>";
|
||||
<option value={$value}>{$hYear}년 {$hMonth}월</option>";
|
||||
}
|
||||
}
|
||||
|
||||
$query = "select log,genlog,nation,power,gen,city from history where year='$year' and month='$month'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
|
||||
$history = MYDB_fetch_array($result);
|
||||
$history = $db->queryFirstRow('SELECT log,genlog,nation,power,gen,city FROM history WHERE server_id = %s AND year = %i AND month = %i', UniqueConst::$serverID, $year, $month);
|
||||
?>
|
||||
</select>
|
||||
<input type=submit name=btn value='조회하기'>
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ increaseRefresh("갱신정보", 2);
|
||||
|
||||
$admin = $gameStor->getValues(['year','month','refresh','maxrefresh','maxonline']);
|
||||
|
||||
$log = getRawFileLogRecent(__dir__.'/logs/_traffic.txt', 11, 100);
|
||||
$log = getRawFileLogRecent(__dir__.'/logs/'.UniqueConst::$serverID.'/_traffic.txt', 11, 100);
|
||||
|
||||
$date = [];
|
||||
$year = [];
|
||||
|
||||
+1
-1
@@ -280,7 +280,7 @@ for ($i=0; $i < $count; $i++) {
|
||||
ㆍ악용 방지를 위해 50% ~ 200%의 가격에서 거래시작이 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 110% 이상, 즉시구매가는 90% 이하의 시세로 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 시작판매가의 110% 이상, 즉시구매가는 시작구매가의 90% 이하로 가능합니다.<br>
|
||||
ㆍ1인당 도합 1건의 거래와 입찰이 가능합니다. 거상 특기 소유자는 1인당 도합 3건입니다.<br>
|
||||
ㆍ1인당 도합 1건의 거래와 입찰이 가능합니다.<br>
|
||||
ㆍ기본금쌀 1000은 거래에 사용되지 못합니다.<br>
|
||||
ㆍ유찰될 때는 거래 과실자에게 거래금의 1%가 벌금으로 부과됩니다.<br>
|
||||
ㆍ<font color=magenta>10단위로 거래가 가능합니다. 1자리는 반올림 처리 됩니다.</font><br>
|
||||
|
||||
+7
-1
@@ -297,7 +297,13 @@ for ($i=0; $i < 16; $i++) {
|
||||
}
|
||||
|
||||
for ($i=0; $i < 16; $i++) {
|
||||
$gold[$i] = Util::round($myBet[$i] * $bet[$i]);
|
||||
if(!is_numeric($bet[$i])){
|
||||
$gold[$i] = 0;
|
||||
}
|
||||
else{
|
||||
$gold[$i] = Util::round($myBet[$i] * $bet[$i]);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
|
||||
+3
-3
@@ -216,9 +216,9 @@ if ($budgetricediff > 0) {
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form name=form1 method=post action=c_dipcenter.php>
|
||||
<tr><td colspan=2 height=10></td></tr>
|
||||
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 & 임관 권유 메세지</td></tr>
|
||||
<tr><td colspan=2 class=bg1>국가 방침 <textarea <?=$read?> maxlength=1000 rows="5" style="color:white;background-color:black;width:830px;" name=msg><?=$nation['msg']?></textarea><input type=<?=$btn?> name=btn value=국가방침></td></tr>
|
||||
<tr><td colspan=2 class=bg1>임관 권유 <input type=text <?=$read?> maxlength=500 style=color:white;background-color:black;width:830px; name=scoutmsg value='<?=$nation['scoutmsg']?>'><input type=<?=$btn?> name=btn value=임관권유></td></tr>
|
||||
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 & 임관 권유 메시지</td></tr>
|
||||
<tr><td colspan=2 class=bg1>국가 방침 <textarea <?=$read?> maxlength=16000 rows="5" style="color:white;background-color:black;width:830px;" name=msg><?=$nation['msg']?></textarea><input type=<?=$btn?> name=btn value=국가방침></td></tr>
|
||||
<tr><td colspan=2 class=bg1>임관 권유 <input type=text <?=$read?> maxlength=1000 style=color:white;background-color:black;width:830px; name=scoutmsg value='<?=$nation['scoutmsg']?>'><input type=<?=$btn?> name=btn value=임관권유></td></tr>
|
||||
<tr><td colspan=2>870 x 200px 넘는 크기를 점유할 시 통보없이 제한될 수 있습니다.</td></tr>
|
||||
<tr><td colspan=2 height=10></td></tr>
|
||||
<tr><td colspan=2 align=center bgcolor=green>예 산 & 정 책</td></tr>
|
||||
|
||||
+2
-2
@@ -91,11 +91,11 @@ if ($btn == "판매") {
|
||||
$msg = "ㆍ<span class='ev_warning'>시작판매가는 50% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv < $amount*1.1 || $topv > $amount * 2) {
|
||||
if ($topv * 10 < $amount * 11 || $topv > $amount * 2) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 110% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv < $cost*1.1) {
|
||||
if ($topv * 10 < $cost * 11) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 시작판매가의 110% 이상이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
|
||||
+12
-14
@@ -19,11 +19,8 @@ $session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
|
||||
$query = "select no,nation,level from general where owner='{$userID}'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$me = MYDB_fetch_array($result);
|
||||
$me = $db->queryFirstRow('SELECT `no`,nation,`level` FROM general WHERE `owner`=%i', $userID);
|
||||
|
||||
//내가 수뇌부이어야함
|
||||
if($me['level'] < 5) {
|
||||
@@ -32,21 +29,21 @@ if($me['level'] < 5) {
|
||||
}
|
||||
|
||||
if($btn == "국가방침") {
|
||||
$msg == mb_substr($msg, 0, 1000);
|
||||
$msg = mb_substr($msg, 0, 16384);
|
||||
//$msg = StringUtil::
|
||||
$db->update('nation', [
|
||||
'msg'=>BadTag2Code($msg)
|
||||
'msg'=>WebUtil::htmlPurify($msg)
|
||||
], 'nation=%i',$me['nation']);
|
||||
} elseif($btn == "임관권유") {
|
||||
$scoutmsg == mb_substr($msg, 0, 500);
|
||||
$scoutmsg = mb_substr($scoutmsg, 0, 1000);
|
||||
$db->update('nation', [
|
||||
'scoutmsg'=>BadTag2Code($scoutmsg)
|
||||
'scoutmsg'=>WebUtil::htmlPurify($scoutmsg)
|
||||
], 'nation=%i',$me['nation']);
|
||||
} elseif($btn == "세율") {
|
||||
if($rate < 5) { $rate = 5; }
|
||||
if($rate > 30) { $rate = 30; }
|
||||
$query = "update nation set rate='$rate' where nation='{$me['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$rate = Util::valueFit($rate, 5, 30);
|
||||
$db->update('nation', [
|
||||
'rate'=>$rate,
|
||||
], 'nation=%i', $me['nation']);
|
||||
} elseif($btn == "지급율") {
|
||||
$bill = Util::valueFit($bill, 20, 200);
|
||||
$db->update('nation', [
|
||||
@@ -70,8 +67,9 @@ if($btn == "국가방침") {
|
||||
'war'=>1
|
||||
], 'nation=%i',$me['nation']);
|
||||
} elseif($btn == "전쟁 허가") {
|
||||
$query = "update nation set war='0' where nation='{$me['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$db->update('nation', [
|
||||
'war'=>0
|
||||
], 'nation=%i',$me['nation']);
|
||||
}
|
||||
|
||||
header('location:b_dipcenter.php');
|
||||
|
||||
+7
-18
@@ -44,12 +44,8 @@ $comStr = EncodeCommand($fourth, $third, $double, $command);
|
||||
|
||||
// 건국
|
||||
if($command == 46) {
|
||||
$name = addslashes(SQ2DQ($name));
|
||||
$name = str_replace("|", "", $name);
|
||||
$name = str_replace(" ", "", $name);
|
||||
$name = str_replace(" ", "뷁", $name);
|
||||
$name = StringUtil::neutralize($name);
|
||||
if($name == "") { $name = "무명"; }
|
||||
$name = StringUtil::subStringForWidth($name, 0, 18);
|
||||
|
||||
$db->update('general', [
|
||||
'makenation'=>$name
|
||||
@@ -72,15 +68,12 @@ if($command == 53) {
|
||||
$me = MYDB_fetch_array($result);
|
||||
|
||||
if($me['level'] >= 5) {
|
||||
$nationname = addslashes(SQ2DQ($nationname));
|
||||
$nationname = str_replace("|", "", $nationname);
|
||||
$nationname = str_replace(" ", "", $nationname);
|
||||
$nationname = str_replace(" ", "뷁", $nationname);
|
||||
$nationname = StringUtil::neutralize($nationname, 18);
|
||||
if($nationname == "") { $nationname = "무명"; }
|
||||
$nationname = StringUtil::subStringForWidth($nationname, 0, 18);
|
||||
|
||||
$query = "update general set makenation='{$nationname}' where level>=5 and nation='{$me['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
$db->update('general', [
|
||||
'makenation'=>$nationname
|
||||
], 'level>=5 and nation=%i', $me['nation']);
|
||||
|
||||
$count = count($turn);
|
||||
$str = "type=type";
|
||||
@@ -101,11 +94,7 @@ if($command == 61) {
|
||||
$me = MYDB_fetch_array($result);
|
||||
|
||||
if($me['level'] >= 5) {
|
||||
$note = addslashes(SQ2DQ($note));
|
||||
$note = str_replace("|", "", $note);
|
||||
$note = str_replace(" ", "", $note);
|
||||
$note = str_replace(" ", "뷁", $note);
|
||||
$note = StringUtil::subStringForWidth($note, 0, 90);
|
||||
$note = StringUtil::neutralize($note, 90);
|
||||
|
||||
$query = "update diplomacy set reserved='{$note}' where me='{$me['nation']}' and you='$double'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
+8
-11
@@ -39,23 +39,20 @@ if($meLevel < 5){
|
||||
}
|
||||
|
||||
if($btn == "임명") {
|
||||
if(!$genlist){
|
||||
header('location:b_myBossInfo.php');
|
||||
exit();
|
||||
if($genlist==0){
|
||||
$general = [];
|
||||
}
|
||||
else{
|
||||
$general = $db->queryFirstRow('SELECT `no`,nation,`level`,leader,`power`,intel FROM general WHERE no = %i', $genlist);
|
||||
}
|
||||
|
||||
$query = "select no,nation,level,leader,power,intel from general where no='$genlist'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$general = MYDB_fetch_array($result);
|
||||
|
||||
if(!$general){
|
||||
if($genlist != 0 && !$general){
|
||||
header('location:b_myBossInfo.php');
|
||||
exit();
|
||||
}
|
||||
|
||||
//임명할사람이 군주이면 불가, 내가 수뇌부이어야함, 공석아닌때는 국가가 같아야함
|
||||
if($meLevel < 5 || ($general['nation'] != $me['nation'] && $genlist != 0) || ($general['level'] == 12 && $genlist != 0)) {
|
||||
|
||||
if($meLevel < 5 || ($genlist != 0 && $general['nation'] != $me['nation']) || ($genlist != 0 && $general['level'] == 12)) {
|
||||
header('location:b_myBossInfo.php');
|
||||
exit();
|
||||
}
|
||||
@@ -241,7 +238,7 @@ if($btn == "임명" && $level >= 5 && $level <= 11) {
|
||||
$nation['chemi'] -= 1;
|
||||
if($nation['chemi'] < 0) { $nation['chemi'] = 0; }
|
||||
|
||||
$query = "update nation set chemi='{$nation['chemi']}' where nation='{$general['nation']}'";
|
||||
$query = "update nation set chemi='{$nation['chemi']}' where nation='{$me['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
//기존 장수 일반으로
|
||||
|
||||
+2
-2
@@ -58,14 +58,14 @@ if(!$isVoteAdmin){
|
||||
|
||||
if($btn == "수정") {
|
||||
if($title != "") {
|
||||
$gameStor->vote_title = $title;
|
||||
$gameStor->vote_title = WebUtil::htmlPurify($title);
|
||||
}
|
||||
} elseif($btn == "추가") {
|
||||
if($str != "") {
|
||||
if(!$admin['vote']){
|
||||
$admin['vote'] = [];
|
||||
}
|
||||
$admin['vote'][] = $str;
|
||||
$admin['vote'][] = WebUtil::htmlPurify($str);
|
||||
$gameStor->vote=$admin['vote'];
|
||||
}
|
||||
} elseif($btn == "리셋") {
|
||||
|
||||
@@ -181,3 +181,39 @@ div.bar_out div.bar_in{
|
||||
float:left;
|
||||
}
|
||||
|
||||
.tooltip{
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tooltip .tooltiptext {
|
||||
visibility: hidden;
|
||||
width: 120px;
|
||||
background-color: #555;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 6px;
|
||||
padding: 5px 0;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
bottom: 125%;
|
||||
left: 50%;
|
||||
margin-left: -60px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
}
|
||||
|
||||
.tooltip .tooltiptext::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
border-width: 5px;
|
||||
border-style: solid;
|
||||
border-color: #555 transparent transparent transparent;
|
||||
}
|
||||
|
||||
.tooltip:hover .tooltiptext {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
|
||||
.rankView {
|
||||
width:1100px;
|
||||
margin:auto;
|
||||
position:relative;
|
||||
font-size:13px;
|
||||
}
|
||||
|
||||
.rankView h3{
|
||||
text-align:center;
|
||||
margin:0;
|
||||
padding:2px;
|
||||
border-bottom:1px solid gray;
|
||||
}
|
||||
|
||||
.rankView ul{
|
||||
list-style:none;
|
||||
margin:0;
|
||||
padding:0;
|
||||
box-sizing: border-box;
|
||||
margin-top:-1px;
|
||||
margin-bottom:-1px;
|
||||
}
|
||||
|
||||
.rankView li{
|
||||
display:inline-block;
|
||||
vertical-align: top;
|
||||
width:110px;
|
||||
height:149px;
|
||||
text-align:center;
|
||||
border-right:1px solid gray;
|
||||
border-top:1px solid gray;
|
||||
margin:0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.rankView li.no_value{
|
||||
height:128px;
|
||||
}
|
||||
|
||||
.rankView li.has_server {
|
||||
height:168px;
|
||||
}
|
||||
|
||||
.rankView li.no_value.has_server {
|
||||
height:146px;
|
||||
}
|
||||
|
||||
.rankView .hall_server{
|
||||
border-top:1px solid gray;
|
||||
}
|
||||
|
||||
.rankView .tooltip .tooltiptext{
|
||||
width:220px;
|
||||
margin-left: -110px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.rankView .no_value .hall_value{
|
||||
display:none;
|
||||
}
|
||||
|
||||
.rankView .hall_nation{
|
||||
font-size:11px;
|
||||
border-top:1px solid gray;
|
||||
border-bottom:1px solid gray;
|
||||
}
|
||||
|
||||
.rankView .hall_name{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
resize: vertical;
|
||||
font-size:11px;
|
||||
height:28px;
|
||||
}
|
||||
|
||||
.rankView .hall_name p{
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.rankView .hall_owner{
|
||||
font-size:95%;
|
||||
}
|
||||
|
||||
.rankView .hall_value{
|
||||
line-height:13px;
|
||||
box-sizing: border-box;
|
||||
border-top:1px solid gray;
|
||||
padding-top:3px;
|
||||
padding-bottom:3px;
|
||||
}
|
||||
+65
-58
@@ -1116,15 +1116,12 @@ function nationMsg() {
|
||||
$connect=$db->get();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$query = "select no,nation from general where owner='{$userID}'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$me = MYDB_fetch_array($result);
|
||||
$msg = $db->queryFirstField(
|
||||
'SELECT msg FROM nation WHERE nation = (SELECT nation FROM general WHERE `owner` = %i)',
|
||||
$userID
|
||||
);
|
||||
|
||||
$query = "select msg from nation where nation='{$me['nation']}'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$nation = MYDB_fetch_array($result);
|
||||
|
||||
echo "<font color=orange>".$nation['msg']."</font>";
|
||||
return $msg?:'';
|
||||
}
|
||||
|
||||
function msgprint($msg, $name, $picture, $imgsvr, $when, $num, $type) {
|
||||
@@ -1269,7 +1266,7 @@ function increaseRefresh($type="", $cnt=1) {
|
||||
$date2 = substr($date, 0, 10);
|
||||
$online = getOnlineNum();
|
||||
file_put_contents(
|
||||
__dir__."/logs/_{$date2}_refresh.txt",
|
||||
__dir__."/logs/".UniqueConst::$serverID."/_{$date2}_refresh.txt",
|
||||
sprintf(
|
||||
"%s, %s, %s, %s, %s, %d\n",
|
||||
$date,
|
||||
@@ -1306,7 +1303,7 @@ function increaseRefresh($type="", $cnt=1) {
|
||||
}
|
||||
if($str != "") {
|
||||
file_put_contents(
|
||||
__dir__."/logs/_{$date2}_ipcheck.txt",
|
||||
__dir__."/logs/".UniqueConst::$serverID."/_{$date2}_ipcheck.txt",
|
||||
sprintf(
|
||||
"%s, %s, %s%s\n",
|
||||
$session->userName,
|
||||
@@ -1341,7 +1338,7 @@ function updateTraffic() {
|
||||
|
||||
$date = date('Y-m-d H:i:s');
|
||||
//일시|년|월|총갱신|접속자|최다갱신자
|
||||
file_put_contents(__dir__."/logs/_traffic.txt",
|
||||
file_put_contents(__dir__."/logs/".UniqueConst::$serverID."/_traffic.txt",
|
||||
Json::encode([
|
||||
$date,
|
||||
$admin['year'],
|
||||
@@ -1919,10 +1916,6 @@ function updateTurntime($no) {
|
||||
$josaYi = JosaUtil::pick($general['name2'], '이');
|
||||
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name2']}</>{$josaYi} <Y>{$general['name']}</>의 육체에서 <S>유체이탈</>합니다!";
|
||||
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
|
||||
|
||||
if($admin['isunited'] == 0) {
|
||||
CheckHall($no);
|
||||
}
|
||||
} else {
|
||||
// 군주였으면 유지 이음
|
||||
if($general['level'] == 12) {
|
||||
@@ -2063,9 +2056,9 @@ function updateTurntime($no) {
|
||||
|
||||
function CheckHall($no) {
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$type = array(
|
||||
$types = array(
|
||||
"experience",
|
||||
"dedication",
|
||||
"firenum",
|
||||
@@ -2089,59 +2082,73 @@ function CheckHall($no) {
|
||||
"betrate"
|
||||
);
|
||||
|
||||
$query = "select name,nation,picture,
|
||||
experience,dedication,warnum,firenum,killnum,
|
||||
killnum/warnum*10000 as winrate,killcrew,killcrew/deathcrew*10000 as killrate,
|
||||
dex0,dex10,dex20,dex30,dex40,
|
||||
ttw/(ttw+ttd+ttl)*10000 as ttrate, ttw+ttd+ttl as tt,
|
||||
tlw/(tlw+tld+tll)*10000 as tlrate, tlw+tld+tll as tl,
|
||||
tpw/(tpw+tpd+tpl)*10000 as tprate, tpw+tpd+tpl as tp,
|
||||
tiw/(tiw+tid+til)*10000 as tirate, tiw+tid+til as ti,
|
||||
betgold, betwin, betwingold, betwingold/betgold*10000 as betrate
|
||||
from general where no='$no'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$general = MYDB_fetch_array($result);
|
||||
$general = $db->queryFirstRow('SELECT name,name2,owner,nation,picture,imgsvr,
|
||||
experience,dedication,warnum,firenum,killnum,
|
||||
killnum/warnum as winrate,killcrew,killcrew/deathcrew as killrate,
|
||||
dex0,dex10,dex20,dex30,dex40,
|
||||
ttw/(ttw+ttd+ttl) as ttrate, ttw+ttd+ttl as tt,
|
||||
tlw/(tlw+tld+tll) as tlrate, tlw+tld+tll as tl,
|
||||
tpw/(tpw+tpd+tpl) as tprate, tpw+tpd+tpl as tp,
|
||||
tiw/(tiw+tid+til) as tirate, tiw+tid+til as ti,
|
||||
betgold, betwin, betwingold, betwingold/betgold as betrate
|
||||
from general where no=%i', $no);
|
||||
|
||||
if(!$general){
|
||||
return;
|
||||
}
|
||||
|
||||
$unitedDate = date('Y-m-d H:i:s');
|
||||
$nation = getNationStaticInfo($general['nation']);
|
||||
|
||||
for($k=0; $k < 21; $k++) {
|
||||
$query = "select * from hall where type='$k' order by data desc";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$count = MYDB_num_rows($result);
|
||||
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
|
||||
|
||||
[$scenarioIdx, $scenarioName, $startTime] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']);
|
||||
|
||||
foreach($types as $idx=>$typeName) {
|
||||
|
||||
|
||||
//승률,살상률인데 10회 미만 전투시 스킵
|
||||
if(($k == 5 || $k == 7) && $general['warnum']<10) { continue; }
|
||||
if(($typeName === 'winrate' || $typeName === 'killrate') && $general['warnum']<10) { continue; }
|
||||
//토너승률인데 50회 미만시 스킵
|
||||
if($k == 13 && $general['tt'] < 50) { continue; }
|
||||
if($typeName === 'ttrate' && $general['tt'] < 50) { continue; }
|
||||
//토너승률인데 50회 미만시 스킵
|
||||
if($k == 14 && $general['tl'] < 50) { continue; }
|
||||
if($typeName === 'tlrate' && $general['tl'] < 50) { continue; }
|
||||
//토너승률인데 50회 미만시 스킵
|
||||
if($k == 15 && $general['tp'] < 50) { continue; }
|
||||
if($typeName === 'tprate' && $general['tp'] < 50) { continue; }
|
||||
//토너승률인데 50회 미만시 스킵
|
||||
if($k == 16 && $general['ti'] < 50) { continue; }
|
||||
if($typeName === 'tirate' && $general['ti'] < 50) { continue; }
|
||||
//수익률인데 1000미만시 스킵
|
||||
if($k == 20 && $general['betgold'] < 1000) { continue; }
|
||||
if($typeName === 'betrate' && $general['betgold'] < 1000) { continue; }
|
||||
|
||||
$rank = 10;
|
||||
for($i=0; $i < $count; $i++) {
|
||||
$ranker = MYDB_fetch_array($result);
|
||||
$aux = [
|
||||
'name'=>$general['name'],
|
||||
'nationName'=>$nation['name'],
|
||||
'bgColor'=>$nation['color'],
|
||||
'fgColor'=>newColor($nation['color']),
|
||||
'picture'=>$general['picture'],
|
||||
'imgsvr'=>$general['imgsvr'],
|
||||
'startTime'=>$startTime,
|
||||
'unitedTime'=>$unitedDate,
|
||||
'owner_name'=>$general['name2'],
|
||||
'serverID'=>UniqueConst::$serverID,
|
||||
'serverIdx'=>$serverCnt,
|
||||
'serverName'=>UniqueConst::$serverName,
|
||||
'scenarioName'=>$scenarioName,
|
||||
];
|
||||
$jsonAux = Json::encode($aux);
|
||||
|
||||
if($general[$type[$k]] >= $ranker['data']) {
|
||||
$rank = $i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for($i=8; $i >= $rank; $i--) {
|
||||
$j = $i + 1;
|
||||
$query = "select * from hall where type='$k' and rank='$i'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$ranker = MYDB_fetch_array($result);
|
||||
|
||||
$query = "update hall set name='{$ranker['name']}', nation='{$ranker['nation']}', data='{$ranker['data']}', color='{$ranker['color']}', picture='{$ranker['picture']}' where type='$k' and rank='$j'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
}
|
||||
$query = "update hall set name='{$general['name']}', nation='{$nation['name']}', data='{$general[$type[$k]]}', color='{$nation['color']}', picture='{$general['picture']}' where type='$k' and rank='$rank'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$db->insertUpdate('ng_hall', [
|
||||
'server_id'=>UniqueConst::$serverID,
|
||||
'scenario'=>$scenarioIdx,
|
||||
'general_no'=>$no,
|
||||
'type'=>$idx,
|
||||
'value'=>$general[$typeName]??0,
|
||||
'owner'=>$general['owner']??null,
|
||||
'aux'=>$jsonAux
|
||||
],[
|
||||
'value'=>$general[$typeName]??0,
|
||||
'aux'=>$jsonAux
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -583,7 +583,7 @@ function processCommand($no) {
|
||||
case 17: process_17($general); break; //소집해제
|
||||
|
||||
case 21: process_21($general); break; //이동
|
||||
case 22: process_22($general); break; //등용 //TODO:등용장 재 디자인
|
||||
case 22: process_22($general); break; //등용
|
||||
case 25: process_25($general); break; //임관
|
||||
case 26: process_26($general); break; //집합
|
||||
case 28: process_28($general); break; //귀환
|
||||
|
||||
@@ -144,7 +144,7 @@ function SetNationFront($nationNo) {
|
||||
$db = DB::db();
|
||||
$enemyCities = $db->queryFirstColumn(
|
||||
'SELECT city from city where nation IN
|
||||
(SELECT you from diplomacy where me = %i and (state=0 or (state=1 and term<=3)))'
|
||||
(SELECT you from diplomacy where me = %i and (state=0 or (state=1 and term<=5)))'
|
||||
, $nationNo
|
||||
);
|
||||
if($enemyCities) {
|
||||
@@ -1126,7 +1126,7 @@ function checkEmperior() {
|
||||
$gameStor->isunited = 2;
|
||||
$gameStor->conlimit = $gameStor->conlimit*100;
|
||||
|
||||
$query = "select no from general where npc<2 and age>=45";
|
||||
$query = "select no from general where npc<2 and age>=40";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$count = MYDB_num_rows($result);
|
||||
|
||||
|
||||
+47
-18
@@ -5,7 +5,7 @@ namespace sammo;
|
||||
|
||||
function delStepLog() {
|
||||
$date = date('Y_m_d');
|
||||
@unlink(__dir__."/logs/_{$date}_steplog.txt");
|
||||
@unlink(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt");
|
||||
}
|
||||
|
||||
function pushRawFileLog($path, $lines){
|
||||
@@ -50,81 +50,109 @@ function eraseTnmtFightLogAll(){
|
||||
}
|
||||
|
||||
function eraseTnmtFightLog(int $group){
|
||||
$filepath = __dir__."/logs/fight{$group}.txt";
|
||||
$filepath = __dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt";
|
||||
if(file_exists($filepath)){
|
||||
@unlink($filepath);
|
||||
}
|
||||
}
|
||||
|
||||
function pushTnmtFightLog(int $group, $log) {
|
||||
pushRawFileLog(__dir__."/logs/fight{$group}.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt", $log);
|
||||
}
|
||||
|
||||
function getTnmtFightLogAll(int $group) {
|
||||
return join('<br>',getFormattedFileLogAll(__dir__."/logs/fight{$group}.txt"));
|
||||
return join('<br>',getFormattedFileLogAll(__dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt"));
|
||||
}
|
||||
|
||||
function pushSabotageLog($log) {
|
||||
pushRawFileLog(__dir__."/logs/_sabotagelog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $log);
|
||||
}
|
||||
|
||||
function getSabotageLogRecent($count) {
|
||||
return join('<br>', getFormattedFileLogRecent(__dir__."/logs/_sabotagelog.txt", $count, 150));
|
||||
return join('<br>', getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $count, 150));
|
||||
}
|
||||
|
||||
function pushProcessLog($log) {
|
||||
$date = date('Y_m_d');
|
||||
pushRawFileLog(__dir__."/logs/_{$date}_processlog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_processlog.txt", $log);
|
||||
}
|
||||
|
||||
|
||||
function pushStepLog($log) {
|
||||
$date = date('Y_m_d');
|
||||
pushRawFileLog(__dir__."/logs/_{$date}_steplog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt", $log);
|
||||
}
|
||||
|
||||
function pushLockLog($log) {
|
||||
$date = date('Y_m_d');
|
||||
pushRawFileLog(__dir__."/logs/_{$date}_locklog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_locklog.txt", $log);
|
||||
}
|
||||
|
||||
function pushAdminLog($log) {
|
||||
pushRawFileLog(__dir__."/logs/_adminlog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_adminlog.txt", $log);
|
||||
}
|
||||
|
||||
function pushAuctionLog($log) {
|
||||
pushRawFileLog(__dir__."/logs/_auctionlog.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $log);
|
||||
}
|
||||
|
||||
function getAuctionLogRecent(int $count) {
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/_auctionlog.txt", $count, 300)));
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
|
||||
}
|
||||
|
||||
function pushGenLog($general, $log) {
|
||||
$no = Util::toInt($general['no']);
|
||||
pushRawFileLog(__dir__."/logs/gen{$no}.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $log);
|
||||
}
|
||||
|
||||
function getGenLogRecent(int $no, int $count) {
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/gen{$no}.txt", $count, 300)));
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $count, 300)));
|
||||
}
|
||||
|
||||
function pushBatRes($general, $log) {
|
||||
$no = Util::toInt($general['no']);
|
||||
pushRawFileLog(__dir__."/logs/batres{$no}.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $log);
|
||||
}
|
||||
|
||||
function getBatResRecent(int $no, int $count) {
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/batres{$no}.txt", $count, 300)));
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $count, 300)));
|
||||
}
|
||||
|
||||
function pushBatLog($general, $log) {
|
||||
$no = Util::toInt($general['no']);
|
||||
pushRawFileLog(__dir__."/logs/batlog{$no}.txt", $log);
|
||||
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $log);
|
||||
}
|
||||
|
||||
function getBatLogRecent(int $no, int $count) {
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/batlog{$no}.txt", $count, 300)));
|
||||
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $count, 300)));
|
||||
}
|
||||
|
||||
function pushOldNationStop(int $no, int $nationNo){
|
||||
$logPrefixList = ['batres', 'gen', 'batlog'];
|
||||
|
||||
$result = [];
|
||||
foreach($logPrefixList as $logPrefix){
|
||||
$path = __dir__."/logs/".UniqueConst::$serverID."/{$logPrefix}{$no}.txt";
|
||||
if(file_exists($path)){
|
||||
$fileLen = @filesize($path);
|
||||
}
|
||||
else{
|
||||
$fileLen = 0;
|
||||
}
|
||||
$result[$logPrefix] = $fileLen;
|
||||
}
|
||||
|
||||
$baseStopPath = __dir__."/logs/".UniqueConst::$serverID."/stop{$no}.txt";
|
||||
if(file_exists($baseStopPath)){
|
||||
$oldValues = Json::decode(file_get_contents($baseStopPath));
|
||||
}
|
||||
else{
|
||||
$oldValues = [];
|
||||
}
|
||||
|
||||
$oldValues[$nationNo] = $result;
|
||||
|
||||
file_put_contents($baseStopPath, Json::encode($oldValues, Json::PRETTY));
|
||||
}
|
||||
|
||||
//DB-based
|
||||
@@ -298,6 +326,7 @@ function LogHistory($isFirst=0) {
|
||||
if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', contents collected');
|
||||
|
||||
$db->insert('history', [
|
||||
'server_id' => UniqueConst::$serverID,
|
||||
'year' => $year,
|
||||
'month' => $month,
|
||||
'map' => $map_json,
|
||||
|
||||
+11
-3
@@ -1,12 +1,14 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
class MapRequest{
|
||||
public $serverID;
|
||||
public $year;
|
||||
public $month;
|
||||
public $aux;
|
||||
public $neutralView;
|
||||
public $showMe;
|
||||
function __construct($obj){
|
||||
$this->serverID = Util::array_get($obj['serverID'], null);
|
||||
$this->year = Util::array_get($obj['year']);
|
||||
$this->month = Util::array_get($obj['month']);
|
||||
$this->aux = Util::array_get($obj['aux'],[]);
|
||||
@@ -19,14 +21,20 @@ class MapRequest{
|
||||
/**
|
||||
* @param int $year
|
||||
* @param int $month
|
||||
* @param string|null $serverID
|
||||
* @return mixed
|
||||
*/
|
||||
function getHistoryMap($year, $month){
|
||||
function getHistoryMap($year, $month, ?string $serverID=null){
|
||||
if(!$year || !$month){
|
||||
return ['result'=>false, 'reason'=>'연 월이 지정되지 않음'];
|
||||
}
|
||||
|
||||
$map = DB::db()->queryFirstField('select map from history where year=%i and month=%i',
|
||||
if($serverID === null){
|
||||
$serverID = UniqueConst::$serverID;
|
||||
}
|
||||
|
||||
$map = DB::db()->queryFirstField('SELECT map FROM history WHERE server_id = %s AND year=%i and month=%i',
|
||||
$serverID,
|
||||
$year,
|
||||
$month);
|
||||
|
||||
@@ -47,7 +55,7 @@ function getWorldMap($req){
|
||||
}
|
||||
|
||||
if($req->year && $req->month){
|
||||
return getHistoryMap($req->year, $req->month);
|
||||
return getHistoryMap($req->year, $req->month, $req->serverID??null);
|
||||
}
|
||||
|
||||
$session = Session::getInstance();
|
||||
|
||||
@@ -44,15 +44,3 @@ function getMailboxList(){
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//Legacy
|
||||
|
||||
function moveMsg($table, $msgtype, $msgnum, $msg, $type, $who, $when, $column, $value) {
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
|
||||
//TODO: moveMsg 쓰는 곳 모두 고쳐!!!
|
||||
$query = "update {$table} set {$msgtype}{$msgnum}='$msg',{$msgtype}{$msgnum}_type='$type',{$msgtype}{$msgnum}_who='$who',{$msgtype}{$msgnum}_when='$when' where {$column}='$value'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
}
|
||||
|
||||
+460
-195
@@ -228,7 +228,7 @@ function processAI($no) {
|
||||
// 전쟁준비 선포중이면 2상태
|
||||
if($dipCount > 0) { $dipState = 2; }
|
||||
|
||||
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term<=3";
|
||||
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term<=5";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
|
||||
$dipCount = MYDB_num_rows($result);
|
||||
// 교전 직전이면 3상태
|
||||
@@ -484,184 +484,11 @@ function processAI($no) {
|
||||
|
||||
//방랑군 아니고, 입력된 턴이 없을때 수뇌부가 할일
|
||||
if($nation['level'] != 0 && $general['level'] >= 5 && $rulerCommand == 0) {
|
||||
$query = "select A.no,A.name,A.nation,B.nation from general A, city B where A.city=B.city and A.nation='{$general['nation']}' and B.nation!='{$general['nation']}' and A.no!='{$general['no']}' order by rand() limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI11 ".MYDB_error($connect),"");
|
||||
$curGen = MYDB_fetch_array($result);
|
||||
|
||||
if($curGen['no'] != 0) { // 타도시에 있는 경우 국내로 발령
|
||||
if($dipState >= 3) {
|
||||
$query = "select city from city where nation='{$general['nation']}' and front=1 and supply=1 order by rand() limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$selCity = MYDB_fetch_array($result);
|
||||
if($selCity['city'] > 0) {
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $curGen['no'], $selCity['city'], 27);
|
||||
} else {
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $curGen['no'], $city['city'], 27);
|
||||
}
|
||||
} else {
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $curGen['no'], $city['city'], 27);
|
||||
}
|
||||
$query = "update nation set l{$general['level']}turn0='$command' where nation='{$general['nation']}'";
|
||||
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
|
||||
} elseif($dipState <= 1) { // 평시엔 균등 발령만
|
||||
//발령, 최소장수 도시 선택, 최다장수도시의 장수 선택
|
||||
$query = "select B.city,count(*) as cnt,((B.agri+B.comm+B.secu+B.def+B.wall)/(B.agri2+B.comm2+B.secu2+B.def2+B.wall2)+(B.pop/B.pop2))/2*100 as dev from general A, city B where A.city=B.city and A.nation='{$general['nation']}' and B.nation='{$general['nation']}' and B.supply=1 group by A.city";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$cityCount = MYDB_num_rows($result);
|
||||
//도시 2개 이상일때만
|
||||
if($cityCount > 1) {
|
||||
$min = 500; $minCity = 0;
|
||||
$max = 0; $maxCity = 0;
|
||||
$devCity = 0;
|
||||
for($i=0; $i < $cityCount; $i++) {
|
||||
$curCity = MYDB_fetch_array($result);
|
||||
if($curCity['cnt'] >= $max) { $max = $curCity['cnt']; $maxCity = $curCity['city']; }
|
||||
if($curCity['cnt'] <= $min) { $min = $curCity['cnt']; $minCity = $curCity['city']; }
|
||||
if($curCity['dev'] < 70) { $devCity = $curCity['city']; } // 개발이 안된 곳 우선
|
||||
}
|
||||
if($devCity != 0) { $minCity = $devCity; }
|
||||
if($maxCity != $minCity) {
|
||||
$query = "select no from general where city='$maxCity' and nation='{$general['nation']}' and no!='{$general['no']}' and npc>=2 limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI11 ".MYDB_error($connect),"");
|
||||
$curGen = MYDB_fetch_array($result);
|
||||
|
||||
if($curGen['no'] != 0) {
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $curGen['no'], $minCity, 27);
|
||||
$query = "update nation set l{$general['level']}turn0='$command' where nation='{$general['nation']}'";
|
||||
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
|
||||
}
|
||||
//계속 진행
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 병사있고 쌀있고 후방에 있는 장수
|
||||
$query = "select A.no from general A, city B where A.city=B.city and A.nation='{$general['nation']}' and B.nation='{$general['nation']}' and B.front=0 and A.crew>700 and A.rice>700*{$tech} order by A.npc,A.crew desc limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$selGen = MYDB_fetch_array($result);
|
||||
// 전방 도시, 30% 확률로 태수 있는 전방으로 발령
|
||||
if(rand()%100 < 30) {
|
||||
$query = "select city from city where nation='{$general['nation']}' and front=1 and supply=1 order by gen1 desc,rand() limit 0,1";
|
||||
} else {
|
||||
$query = "select city from city where nation='{$general['nation']}' and front=1 and supply=1 order by rand() limit 0,1";
|
||||
}
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$selCity = MYDB_fetch_array($result);
|
||||
if($selGen['no'] > 0 && $selCity['city'] > 0 && rand() % 100 < 80) { // 80% 확률
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $selGen['no'], $selCity['city'], 27);
|
||||
} else {
|
||||
//병사 없고 인구없는 전방에 있는 장수
|
||||
$query = "select A.no from general A, city B where A.city=B.city and A.nation='{$general['nation']}' and B.nation='{$general['nation']}' and B.pop<40000 and B.front=1 and A.crew<700 order by A.npc,A.crew limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$selGen = MYDB_fetch_array($result);
|
||||
// 인구많은도시
|
||||
$query = "select city from city where nation='{$general['nation']}' and supply=1 order by pop desc limit 0,1";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
|
||||
$selCity = MYDB_fetch_array($result);
|
||||
if($selGen['no'] > 0 && $selCity['city'] > 0 && rand() % 100 < 80) { // 80% 확률
|
||||
// 발령
|
||||
$command = EncodeCommand(0, $selGen['no'], $selCity['city'], 27);
|
||||
} else {
|
||||
// 발령할 장수 없으면 몰포
|
||||
if(rand() % 2 == 0) { $type = "gold"; $type2 = 1; }
|
||||
else { $type = "rice"; $type2 = 2; }
|
||||
|
||||
if($nation[$type] < $type2*3000) { // 몰수
|
||||
// 몰수 대상
|
||||
list($npcGenID, $npcGenValue) = $db->queryFirstList(
|
||||
'SELECT `no`, %b FROM general WHERE nation=%i AND `no`!=%i AND %b>3000 AND npc >= 2 ORDER BY %b DESC LIMIT 1',
|
||||
$type,
|
||||
$general['nation'],
|
||||
$general['no'],
|
||||
$type,
|
||||
$type
|
||||
);
|
||||
|
||||
list($userGenID, $userGenValue) = $db->queryFirstList(
|
||||
'SELECT `no`, %b FROM general WHERE nation=%i AND `no`!=%i AND %b>3000 AND npc < 2 ORDER BY %b DESC LIMIT 1',
|
||||
$type,
|
||||
$general['nation'],
|
||||
$general['no'],
|
||||
$type,
|
||||
$type
|
||||
);
|
||||
|
||||
if($npcGenID === null && $userGenID === null){
|
||||
$genID = 0;
|
||||
$genValue = 0;
|
||||
}
|
||||
else if($npcGenID === null || $userGenValue > $npcGenValue * 4){
|
||||
$genID = $userGenID;
|
||||
$genValue = $userGenValue;
|
||||
}
|
||||
else{
|
||||
$genID = $npcGenID;
|
||||
$genValue = $npcGenValue;
|
||||
}
|
||||
|
||||
if($genID){
|
||||
$amount = min(100, intdiv($genValue, 5000)*10 + 10);
|
||||
// 몰수
|
||||
$command = EncodeCommand($type2, $genID, $amount, 24); // 금,쌀 1000단위 몰수
|
||||
}
|
||||
} else { // 포상
|
||||
// 포상 대상
|
||||
list($npcGenID, $npcGenValue, $npcLeadership) = $db->queryFirstList(
|
||||
'SELECT `no`, %b, leader FROM general WHERE nation=%i AND `no`!=%i AND npc >= 2 AND killturn > 5 AND (leader >= 40 OR %b < %i) ORDER BY %b ASC LIMIT 1',
|
||||
$type,
|
||||
$general['nation'],
|
||||
$general['no'],
|
||||
$type,
|
||||
$resrc,
|
||||
$type
|
||||
);
|
||||
|
||||
list($userGenID, $userGenValue) = $db->queryFirstList(
|
||||
'SELECT `no`, %b FROM general WHERE nation=%i AND `no`!=%i AND npc < 2 AND killturn > 5 AND (leader >= 40 OR %b < %i) ORDER BY %b ASC LIMIT 1',
|
||||
$type,
|
||||
$general['nation'],
|
||||
$general['no'],
|
||||
$type,
|
||||
($type=='gold')?21000:3000,
|
||||
$type
|
||||
);
|
||||
|
||||
if($npcGenID === null && $userGenID === null){
|
||||
$genID = 0;
|
||||
}
|
||||
else if($npcGenID === null || ($userGenValue !== null && $userGenValue < $npcGenValue * 3)){
|
||||
$genID = $userGenID;
|
||||
}
|
||||
else{
|
||||
$genID = $npcGenID;
|
||||
}
|
||||
|
||||
if ($genID) {
|
||||
if($genID === $npcGenID){
|
||||
$amount = min(100, intdiv(($nation[$type]-($type=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
|
||||
if($npcLeadership < 40){
|
||||
$amount = min($amount, intdiv($resrc, 1000)*10 + 10);
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
$amount = min(100, intdiv(($nation[$type]-($type=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 2000)*10 + 10);
|
||||
}
|
||||
|
||||
// 포상
|
||||
$command = EncodeCommand($type2, $genID, $amount, 23); // 금,쌀 1000단위 포상
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(isset($command)){
|
||||
$query = "update nation set l{$general['level']}turn0='$command' where nation='{$general['nation']}'";
|
||||
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
|
||||
}
|
||||
$command = NPCStaffWork($general, $nation, $dipState);
|
||||
if($command){
|
||||
$db->update('nation', [
|
||||
"l{$general['level']}turn0"=>$command
|
||||
], 'nation=%i', $general['nation']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -709,7 +536,7 @@ function processAI($no) {
|
||||
){
|
||||
//쌀을 많이 들고 있다면
|
||||
$amount = $general['rice'] * 0.9;
|
||||
$amount = intdiv(Util::valueFit($amount, $resrc + 700, 10000), 100);
|
||||
$amount = intdiv(Util::valueFit($amount, $resrc + 1000, 10000), 100);
|
||||
|
||||
$command = EncodeCommand(0, 2, $amount, 44); //헌납
|
||||
$db->update('general', [
|
||||
@@ -724,7 +551,7 @@ function processAI($no) {
|
||||
){
|
||||
//금을 많이 들고 있다면
|
||||
$amount = $general['gold'] * 0.9;
|
||||
$amount = intdiv(Util::valueFit($amount, $resrc + 700, 10000), 100);
|
||||
$amount = intdiv(Util::valueFit($amount, $resrc + 1000, 10000), 100);
|
||||
|
||||
$command = EncodeCommand(0, 1, $amount, 44); //헌납
|
||||
$db->update('general', [
|
||||
@@ -746,12 +573,12 @@ function processAI($no) {
|
||||
|
||||
// R
|
||||
// ┃ ┃ 공격/내정
|
||||
// 700┃쌀┣━━━━┓
|
||||
// 500┃쌀┣━━━━┓
|
||||
// ┃팜┃ ┃
|
||||
// 100┣━┫ 내정 ┣━━━
|
||||
// 100┣━┫ 내정 ┣━━━
|
||||
// ┃조┃ ┃쌀삼
|
||||
// 0┗━┻━━━━┻━━━> G
|
||||
// 100 700
|
||||
// 100 500
|
||||
|
||||
$target = array();
|
||||
// 평시거나 초반아니면서 공격가능 없으면서 병사 있으면 해제(25%)
|
||||
@@ -764,7 +591,7 @@ function processAI($no) {
|
||||
elseif($general['gold'] < 100) { //금없으면 쌀팜
|
||||
$amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위
|
||||
$command = EncodeCommand(0, 1, $amount, 49); //팜
|
||||
} elseif($general['gold'] < 700 && $general['rice'] < 700) { $command = EncodeCommand(0, 0, 0, 1); } //금쌀되면 내정
|
||||
} elseif($general['gold'] < 500 && $general['rice'] < 500) { $command = EncodeCommand(0, 0, 0, 1); } //금쌀되면 내정
|
||||
elseif($general['rice'] < 100) { //쌀없으면 쌀삼
|
||||
$amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위
|
||||
$command = EncodeCommand(0, 2, $amount, 49); //삼
|
||||
@@ -837,7 +664,7 @@ function processAI($no) {
|
||||
// 700t
|
||||
|
||||
} else { // 공격인 경우
|
||||
if($general['crew'] < 700 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) { //자원되고, 병사없을때
|
||||
if($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) { //자원되고, 병사없을때
|
||||
if($city['pop'] > 40000) { $command = EncodeCommand(0, 0, 0, 11); }
|
||||
else { $command = EncodeCommand(0, 0, 0, 1); }
|
||||
} elseif($general['rice'] < $resrc && $general['rice'] <= $general['gold']) {
|
||||
@@ -851,9 +678,9 @@ function processAI($no) {
|
||||
if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }//팜
|
||||
else { $command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); } // 내정, 조달
|
||||
//자원, 병사 모두 충족
|
||||
} elseif($general['crew'] >= 700 && $general['train'] < 90) {
|
||||
} elseif($general['crew'] >= 1000 && $general['train'] < 90) {
|
||||
$command = EncodeCommand(0, 0, 0, 13); //훈련
|
||||
} elseif($general['crew'] >= 700 && $general['atmos'] < 90) {
|
||||
} elseif($general['crew'] >= 1000 && $general['atmos'] < 90) {
|
||||
$command = EncodeCommand(0, 0, 0, 14); //사기진작
|
||||
} else {
|
||||
//공격
|
||||
@@ -866,25 +693,25 @@ function processAI($no) {
|
||||
// ┃ ┃
|
||||
// ┃쌀┃
|
||||
// ┃팜┃ 공격
|
||||
// 700t┣━╋━━━━━
|
||||
//1000t┣━╋━━━━━
|
||||
// ┃조┃ 쌀삼
|
||||
// 0┗━┻━━━━━> G
|
||||
// 700t
|
||||
// 1000t
|
||||
|
||||
//전시일때
|
||||
if($general['gold'] + $general['rice'] < $resrc*2) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달
|
||||
elseif($general['rice'] > $resrc && $city['rate'] < 95 && $city['front'] == 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
|
||||
elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] == 1) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
|
||||
elseif($general['gold'] < $resrc) { // 금없으면 쌀팜
|
||||
elseif($general['gold'] < $resrc || ($general['gold'] < $resrc *2 && $general['rice'] > $resrc * 6)) { // 금없으면 쌀팜
|
||||
$amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위
|
||||
if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }// 팜
|
||||
else { $command = EncodeCommand(0, 0, 0, 9); } // 조달
|
||||
} elseif($general['rice'] < $resrc) { // 쌀없으면 쌀삼
|
||||
} elseif($general['rice'] < $resrc || ($general['rice'] < $resrc *2 && $general['gold'] > $resrc * 6)) { // 쌀없으면 쌀삼
|
||||
$amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위
|
||||
if($amount > 0) { $command = EncodeCommand(0, 2, $amount, 49); }// 팜
|
||||
else { $command = EncodeCommand(0, 0, 0, 9); } // 조달
|
||||
} elseif($genType >= 2) { $command = EncodeCommand(0, 0, 0, 1); } //내정장일때 내정
|
||||
elseif($general['crew'] < 700 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) {
|
||||
elseif($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) {
|
||||
$query = "select no from general where nation='{$general['nation']}'";
|
||||
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
|
||||
$genCount = MYDB_num_rows($result);
|
||||
@@ -923,13 +750,13 @@ function processAI($no) {
|
||||
$command = EncodeCommand(0, 0, 0, 7); //인구 안되면 정장
|
||||
}
|
||||
}
|
||||
} elseif($general['crew'] >= 700 && $general['train'] < 90) {
|
||||
} elseif($general['crew'] >= 1000 && $general['train'] < 90) {
|
||||
if($general['atmos'] >= 90 && $general['train'] >= 60 && $general['mode'] == 0) {
|
||||
$query = "update general set mode=1 where no='{$general['no']}'";
|
||||
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
|
||||
}
|
||||
$command = EncodeCommand(0, 0, 0, 13); //훈련
|
||||
} elseif($general['crew'] >= 700 && $general['atmos'] < 90) {
|
||||
} elseif($general['crew'] >= 1000 && $general['atmos'] < 90) {
|
||||
if($general['atmos'] >= 60 && $general['train'] >= 90 && $general['mode'] == 0) {
|
||||
$query = "update general set mode=1 where no='{$general['no']}'";
|
||||
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
|
||||
@@ -1024,6 +851,444 @@ function processAI($no) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function NPCStaffWork($general, $nation, $dipState){
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$connect=$db->get();
|
||||
|
||||
$admin = $gameStor->getValues(['startyear','year','month','turnterm','scenario','gold_rate','rice_rate', 'develcost']);
|
||||
|
||||
$nationCities = [];
|
||||
$frontCitiesID = [];
|
||||
$frontImportantCitiesID = [];
|
||||
$supplyCitiesID = [];
|
||||
$backupCitiesID = [];
|
||||
|
||||
$tech = getTechCost($nation['tech']);
|
||||
|
||||
foreach ($db->query('SELECT * FROM city WHERE nation = %i', $general['nation']) as $nationCity) {
|
||||
$nationCity['generals'] = [];
|
||||
$cityID = $nationCity['city'];
|
||||
$dev =
|
||||
($nationCity['agri'] + $nationCity['comm'] + $nationCity['secu'] + $nationCity['def'] + $nationCity['wall'])/
|
||||
($nationCity['agri'] + $nationCity['comm'] + $nationCity['secu'] + $nationCity['def'] + $nationCity['wall']);
|
||||
$dev += $nationCity['pop'] / $nationCity['pop2'];
|
||||
$dev /= 50;
|
||||
|
||||
$nationCity['dev'] = $dev;
|
||||
|
||||
$nationCities[$cityID] = $nationCity;
|
||||
|
||||
if($nationCity['supply']){
|
||||
$supplyCitiesID[] = $cityID;
|
||||
if($nationCity['front']){
|
||||
$frontCitiesID[] = $cityID;
|
||||
if($nationCity['gen1']){
|
||||
$frontImportantCitiesID[] = $cityID;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$backupCitiesID[] = $cityID;
|
||||
}
|
||||
}
|
||||
}
|
||||
Util::shuffle_assoc($nationCities);
|
||||
shuffle($frontCitiesID);
|
||||
shuffle($supplyCitiesID);
|
||||
|
||||
$nationGenerals = [];
|
||||
$lostGeneralsID = [];
|
||||
|
||||
$userGeneralsID = [];
|
||||
$npcWarGeneralsID = [];
|
||||
$npcCivilGeneralsID = [];
|
||||
|
||||
|
||||
$commandList = [];
|
||||
|
||||
foreach($db->query('SELECT `no`, nation, city, npc, `gold`, `rice`, leader, `power`, intel, killturn, crew, train, atmos, `level` FROM general WHERE nation = %i', $general['nation']) as $nationGeneral) {
|
||||
$cityID = $nationGeneral['city'];
|
||||
$generalID = $nationGeneral['no'];
|
||||
|
||||
if($generalID == $general['no']){
|
||||
continue;
|
||||
}
|
||||
|
||||
if(key_exists($cityID, $nationCities)){
|
||||
$nationCities[$cityID]['generals'][] = $generalID;
|
||||
if(!$nationCities[$cityID]['supply']){
|
||||
$lostGeneralsID[] = $generalID;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$lostGeneralsID[] = $generalID;
|
||||
}
|
||||
|
||||
if($nationGeneral['npc']<2 && $nationGeneral['killturn'] >= 5){
|
||||
$userGeneralsID[] = $generalID;
|
||||
}
|
||||
else if($nationGeneral['leader']>=40 && $nationGeneral['killturn'] >= 5){
|
||||
$npcWarGeneralsID[] = $generalID;
|
||||
}
|
||||
else{
|
||||
//삭턴이 몇 안남은 장수는 '내정장 npc'로 처리
|
||||
$npcCivilGeneralsID[] = $generalID;
|
||||
}
|
||||
|
||||
$nationGenerals[$generalID] = $nationGeneral;
|
||||
}
|
||||
Util::shuffle_assoc($nationGenerals);
|
||||
shuffle($lostGeneralsID);
|
||||
|
||||
uasort($nationCities, function($lhs, $rhs){
|
||||
//키 순서를 지키지 않지만, 원래부터 random order를 목표로 하므로 크게 신경쓰지 않는다.
|
||||
return count($lhs['generals']) - count($rhs['generals']);
|
||||
});
|
||||
|
||||
|
||||
//타 도시에 있는 '유저장' 발령
|
||||
foreach($lostGeneralsID as $lostGeneralID){
|
||||
$lostGeneral = $nationGenerals[$lostGeneralID];
|
||||
if($lostGeneral['npc'] < 2){
|
||||
if($dipState >= 3 && $frontCitiesID){
|
||||
$selCityID = Util::choiceRandom($frontCitiesID);
|
||||
}
|
||||
else{
|
||||
$selCityID = Util::choiceRandom($supplyCitiesID);
|
||||
}
|
||||
$commandList[EncodeCommand(0, $lostGeneralID, $selCityID, 27)] = 200;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$resBaseType = [['gold', 1], ['rice', 2]];
|
||||
[$resName, $resType] = Util::choiceRandom($resBaseType);
|
||||
|
||||
usort($userGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
|
||||
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
|
||||
});
|
||||
|
||||
usort($npcWarGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
|
||||
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
|
||||
});
|
||||
|
||||
usort($npcCivilGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
|
||||
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
|
||||
});
|
||||
|
||||
$avgUserRes = 0;
|
||||
foreach ($userGeneralsID as $id){
|
||||
$avgUserRes += $nationGenerals[$id][$resName];
|
||||
}
|
||||
$avgUserRes /= max(1, count($userGeneralsID));
|
||||
|
||||
$avgNpcWarRes = 0;
|
||||
foreach ($npcWarGeneralsID as $id){
|
||||
$avgNpcWarRes += $nationGenerals[$id][$resName];
|
||||
}
|
||||
$avgNpcWarRes /= max(1, count($npcWarGeneralsID));
|
||||
|
||||
$avgNpcCivilRes = 0;
|
||||
foreach ($npcCivilGeneralsID as $id){
|
||||
$avgNpcCivilRes += $nationGenerals[$id][$resName];
|
||||
}
|
||||
$avgNpcCivilRes /= max(1, count($npcCivilGeneralsID));
|
||||
|
||||
|
||||
|
||||
//금쌀이 부족한 '유저장' 먼저 포상
|
||||
while ($nation[$resName] > ($resName=='gold'?1:2)*3000 && $userGeneralsID) {
|
||||
$isWarUser = null;
|
||||
|
||||
foreach($userGeneralsID as $userGeneralID){
|
||||
$compUser = $nationGenerals[$userGeneralID];
|
||||
if($compUser['leader'] >= 50){
|
||||
$isWarUser = true;
|
||||
break;
|
||||
}
|
||||
if(Util::randF(0.2)){
|
||||
$isWarUser = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if($isWarUser === null){
|
||||
break;
|
||||
}
|
||||
|
||||
$compRes = $compUser[$resName];
|
||||
|
||||
$work = false;
|
||||
if(!$isWarUser){
|
||||
$work = false;
|
||||
} else if ($compRes < $avgNpcWarRes*3) {
|
||||
$work = true;
|
||||
} elseif ($compRes < $avgNpcCivilRes * 4) {
|
||||
$work = true;
|
||||
}
|
||||
|
||||
if((($isWarUser || $resName == 'gold') && $compUser[$resName] < 21000) || ($compUser[$resName] < 5000)){
|
||||
if($work){
|
||||
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 3000)*10 + 10);
|
||||
$commandList[EncodeCommand($resType, $userGeneralsID[0], $amount, 23)] = 10; // 금,쌀 1000단위 포상
|
||||
}
|
||||
else{
|
||||
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
|
||||
$commandList[EncodeCommand($resType, $userGeneralsID[0], $amount, 23)] = 1; // 금,쌀 1000단위 포상
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$minRes = $admin['develcost'] * 24 * $tech;
|
||||
|
||||
if($nation[$resName] < ($resName=='gold'?1:2)*3000) { // 몰수
|
||||
// 몰수 대상
|
||||
$compUser = $userGeneralsID?$nationGenerals[end($userGeneralsID)]:null;
|
||||
$compNpcWar = $npcWarGeneralsID?$nationGenerals[end($npcWarGeneralsID)]:null;
|
||||
$compNpcCivil = $npcCivilGeneralsID?$nationGenerals[end($npcCivilGeneralsID)]:null;
|
||||
|
||||
$compUserRes = $compUser[$resName]??0;
|
||||
$compNpcWarRes = $compNpcWar[$resName]*5??0;
|
||||
$compNpcCivilRes = $compNpcCivil[$resName]*10??0;
|
||||
|
||||
[$compRes, $compGenID] = max(
|
||||
[$compNpcCivilRes, $compNpcCivil['no']??null],
|
||||
[$compNpcWarRes, $compNpcWar['no']??null],
|
||||
[$compUserRes, $compUser['no']??null]
|
||||
);
|
||||
|
||||
if($compGenID){
|
||||
$targetGeneral = $nationGenerals[$compGenID];
|
||||
if($compGenID === ($compNpcCivil['no']??null)){
|
||||
$amount = intdiv($targetGeneral[$resName] - $minRes * 3, 100);
|
||||
}
|
||||
else{
|
||||
$amount = min(100, intdiv($targetGeneral[$resName], 5000)*10 + 10);
|
||||
}
|
||||
|
||||
if($amount > 0){
|
||||
$commandList[EncodeCommand($resType, $compGenID, $amount, 24)] = 3;
|
||||
}
|
||||
|
||||
}
|
||||
} else{ // 포상
|
||||
$compNpcWar = $npcWarGeneralsID?$nationGenerals[$npcWarGeneralsID[0]]:null;
|
||||
$compNpcCivil = $npcCivilGeneralsID?$nationGenerals[$npcCivilGeneralsID[0]]:null;
|
||||
|
||||
if($compNpcWar && $compNpcWar[$resName] < 21000){
|
||||
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
|
||||
$commandList[EncodeCommand($resType, $compNpcWar['no'], $amount, 23)] = 3;
|
||||
}
|
||||
if($compNpcCivil && $compNpcCivil[$resName] < $minRes){
|
||||
$amount = intdiv($minRes+99, 100);
|
||||
$commandList[EncodeCommand($resType, $compNpcCivil['no'], $amount, 23)] = 2;
|
||||
}
|
||||
}
|
||||
|
||||
//고립 도시 장수 발령
|
||||
foreach($lostGeneralsID as $lostGeneralID){
|
||||
$lostGeneral = $nationGenerals[$lostGeneralID];
|
||||
if($lostGeneral['npc']<2){
|
||||
//고립 유저 장수는 이미 세팅했음
|
||||
continue;
|
||||
}
|
||||
if($dipState >= 3 && $frontCitiesID){
|
||||
$selCityID = Util::choiceRandom($frontCitiesID);
|
||||
}
|
||||
else{
|
||||
$selCityID = Util::choiceRandom($supplyCitiesID);
|
||||
}
|
||||
//고립된 장수가 많을 수록 발령 확률 증가
|
||||
$commandList[EncodeCommand(0, $lostGeneralID, $selCityID, 27)] = sqrt(count($lostGeneralsID)) * 10;
|
||||
}
|
||||
|
||||
// 평시엔 균등 발령만
|
||||
if($dipState <= 1 && count($supplyCitiesID) > 1) {
|
||||
$targetCity = null;
|
||||
$minCity = null;
|
||||
$maxCity = null;
|
||||
$maxDevCity = null;
|
||||
foreach($nationCities as $nationCity){
|
||||
if($nationCity['dev']>=95){
|
||||
continue;
|
||||
}
|
||||
if($nationCity['supply']){
|
||||
$minCity = $nationCity;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//reverse_order T_T
|
||||
$maxCity = end($nationCities);
|
||||
if(!$minCity){
|
||||
$minCity = $maxCity;
|
||||
}
|
||||
while($maxCity['city'] !== $minCity['city']){
|
||||
if($nationCity['supply']){
|
||||
break;
|
||||
}
|
||||
$maxCity = prev($nationCities);
|
||||
}
|
||||
|
||||
foreach($nationCities as $nationCity){
|
||||
if($nationCity['city'] == $maxCity['city']){
|
||||
break;
|
||||
}
|
||||
if(!$nationCity['supply']){
|
||||
continue;
|
||||
}
|
||||
if($nationCity['dev'] < 70){
|
||||
$targetCity = $nationCity;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($nationCities as $nationCity) {
|
||||
if(!$nationCity['supply']){
|
||||
continue;
|
||||
}
|
||||
if(count($nationCity['generals']) == 0){
|
||||
continue;
|
||||
}
|
||||
if($maxDevCity === null || $maxDevCity['dev'] < $nationCity['dev']){
|
||||
$maxDevCity = $nationCity;
|
||||
}
|
||||
}
|
||||
|
||||
if($targetCity === null || (count($targetCity['generals']) >= count($maxCity['generals']) - 1)){
|
||||
$targetCity = $minCity;
|
||||
}
|
||||
|
||||
if($maxDevCity['dev'] >= 95 && $targetCity['city'] != $maxDevCity['city'] && $targetCity['dev'] <= 70){
|
||||
$targetGeneral = $nationGenerals[Util::choiceRandom($maxDevCity['generals'])];
|
||||
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 2;
|
||||
}
|
||||
|
||||
if(count($targetCity['generals']) < count($maxCity['generals']) - 2){
|
||||
//세명 이상 차이나야 함
|
||||
$targetGeneral = $nationGenerals[Util::choiceRandom($maxCity['generals'])];
|
||||
if($targetGeneral['npc']>=2 || $maxCity['dev'] >= 95){
|
||||
//유저장은 의도가 있을 것이므로 삽나지 않는 이상 발령 안함!
|
||||
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 5;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 병사있고 쌀있고 후방에 있는 장수
|
||||
if($frontCitiesID){
|
||||
$workRemain = 3;
|
||||
foreach($nationGenerals as $nationGeneral){
|
||||
$generalCity = $nationCities[$nationGeneral['city']]??null;
|
||||
if(!$generalCity){
|
||||
continue;
|
||||
}
|
||||
if($nationGeneral['crew'] < 2000){
|
||||
continue;
|
||||
}
|
||||
if($nationGeneral['rice'] < 700 * $tech){
|
||||
continue;
|
||||
}
|
||||
if($generalCity['front']){
|
||||
continue;
|
||||
}
|
||||
if($nationGeneral['train'] * $nationGeneral['atmos'] < 75 * 75){
|
||||
continue;
|
||||
}
|
||||
|
||||
$score = 5;
|
||||
if($nationGeneral['npc']<2){
|
||||
$score *= 4;
|
||||
}
|
||||
|
||||
if(Util::randF(0.3) && $frontImportantCitiesID){
|
||||
$targetCityID = Util::choiceRandom($frontImportantCitiesID);
|
||||
}
|
||||
else{
|
||||
$targetCityID = Util::choiceRandom($frontCitiesID);
|
||||
}
|
||||
|
||||
$command = EncodeCommand(0, $nationGeneral['no'], $targetCityID, 27);
|
||||
|
||||
if($nationGeneral['npc']<2 && ($workRemain&2)){
|
||||
$workRemain ^= 2;
|
||||
$commandList[$command] = $score;
|
||||
}
|
||||
else if($nationGeneral['npc']>=2 && ($workRemain&1)){
|
||||
$workRemain ^= 1;
|
||||
$commandList[$command] = $score;
|
||||
}
|
||||
|
||||
if($workRemain <= 0){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//병사 없고 인구없는 전방에 있는 장수
|
||||
if($frontCitiesID && $backupCitiesID){
|
||||
$workRemain = 3;
|
||||
foreach($nationGenerals as $nationGeneral){
|
||||
$generalCity = $nationCities[$nationGeneral['city']]??null;
|
||||
if(!$generalCity){
|
||||
continue;
|
||||
}
|
||||
if($nationGeneral['crew'] >= 1000){
|
||||
continue;
|
||||
}
|
||||
if($nationGeneral['rice'] < 700 * $tech){
|
||||
continue;
|
||||
}
|
||||
if(!$generalCity['front']){
|
||||
continue;
|
||||
}
|
||||
if($generalCity['pop'] - 33000 > $nationGeneral['leader']){
|
||||
continue;
|
||||
}
|
||||
|
||||
$score = 5;
|
||||
if($nationGeneral['npc']<2){
|
||||
$score *= 4;
|
||||
}
|
||||
|
||||
$popTrial = 5;
|
||||
for($popTrial = 0; $popTrial < 5; $popTrial++){
|
||||
$targetCity = $nationCities[Util::choiceRandom($backupCitiesID)];
|
||||
if($targetCity['pop'] < 33000 + $nationGeneral['leader']){
|
||||
continue;
|
||||
}
|
||||
if (Util::randF($targetCity['pop'] / $targetCity['pop2'])) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$command = EncodeCommand(0, $nationGeneral['no'], $targetCity['city'], 27);
|
||||
|
||||
if($nationGeneral['npc']<2 && ($workRemain&2)){
|
||||
$workRemain ^= 2;
|
||||
$commandList[$command] = $score;
|
||||
}
|
||||
else if($nationGeneral['npc']>=2 && ($workRemain&1)){
|
||||
$workRemain ^= 1;
|
||||
$commandList[$command] = $score;
|
||||
}
|
||||
|
||||
if($workRemain <= 0){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!$commandList)return 0;
|
||||
return Util::choiceRandomUsingWeight($commandList);
|
||||
}
|
||||
|
||||
//종전하기, 지급율
|
||||
//$command = $fourth * 100000000 + $type * 100000 + $crew * 100 + 11;
|
||||
|
||||
|
||||
@@ -663,8 +663,13 @@ function process_46(&$general) {
|
||||
} elseif($city['level'] != 5 && $city['level'] != 6) {
|
||||
$log[] = "<C>●</>{$admin['month']}월:중, 소 도시에서만 가능합니다. 건국 실패. <1>$date</>";
|
||||
} else {
|
||||
$query = "update nation set name='{$general['makenation']}',color='$color',level=1,type='$type',capital='{$general['city']}' where nation='{$general['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$db->update('nation', [
|
||||
'name'=>$general['makenation'],
|
||||
'color'=>$color,
|
||||
'level'=>1,
|
||||
'type'=>$type,
|
||||
'capital'=>$general['city'],
|
||||
], 'nation=%i', $general['nation']);
|
||||
|
||||
refreshNationStaticInfo();
|
||||
$nation = getNationStaticInfo($general['nation']);
|
||||
|
||||
@@ -24,13 +24,6 @@ function Tag2Code(string $str) {
|
||||
return nl2br($str);
|
||||
}
|
||||
|
||||
function BadTag2Code(string $str) {
|
||||
/* FIXME: 제대로된 tag 변환 코드 사용 */
|
||||
$str = str_replace("<script", "<sorry", $str);
|
||||
$str = str_replace("</script", "</sorry", $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
function tab(string $str, $maxsize, $ch) {
|
||||
$size = strlen($str);
|
||||
|
||||
|
||||
@@ -172,4 +172,15 @@ function getMapHtml(){
|
||||
$templates = new \League\Plates\Engine(__dir__.'/templates');
|
||||
|
||||
return $templates->render('map');
|
||||
}
|
||||
|
||||
function getInvitationList(array $nationList){
|
||||
$templates = new \League\Plates\Engine(__dir__.'/templates');
|
||||
|
||||
foreach($nationList as &$nation){
|
||||
$nation['textColor'] = newColor($nation['color']);
|
||||
}
|
||||
return $templates->render('invitationList', [
|
||||
'nationList'=>$nationList
|
||||
]);
|
||||
}
|
||||
+4
-4
@@ -44,7 +44,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
||||
], 'owner=%i', $userID);
|
||||
}
|
||||
|
||||
$admin = $gameStor->getValues(['develcost','online','conlimit','tournament','tnmt_type','turnterm','scenario','scenario_text','extended_general','fiction','npcmode','vote']);
|
||||
$admin = $gameStor->getValues(['develcost','online','conlimit','tournament','tnmt_type','turnterm','scenario','scenario_text','extended_general','fiction','npcmode','vote','vote_title']);
|
||||
|
||||
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
|
||||
|
||||
@@ -181,11 +181,11 @@ echo "
|
||||
";
|
||||
|
||||
$vote = $admin['vote']?:[''];
|
||||
$vote[0] = Tag2Code($vote[0]);
|
||||
$vote_title = Tag2Code($admin['vote_title']??'-');
|
||||
if ($vote[0] == "") {
|
||||
echo "<font color=magenta>진행중 설문 없음</font>";
|
||||
} else {
|
||||
echo "<marquee scrollamount=3><font color=cyan>설문 진행중</font> : $vote[0]</marquee>";
|
||||
echo "<marquee scrollamount=3><font color=cyan>설문 진행중</font> : $vote_title</marquee>";
|
||||
}
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ echo "
|
||||
?>
|
||||
<tr><td colspan=5 style="text-align:left;">접속중인 국가: <?=onlinenation()?></td></tr>
|
||||
<tr><td colspan=5 style="text-align:left;"><?=adminMsg()?></td></tr>
|
||||
<tr><td colspan=5 style="text-align:left;">【 국가방침 】<?php nationMsg(); ?></td></tr>
|
||||
<tr><td colspan=5 style="text-align:left;"><div>【 국가방침 】</div><div style="color:orange;"><?=nationMsg()?></div></td></tr>
|
||||
<tr><td colspan=5 style="text-align:left;">【 접속자 】<?=onlinegen()?></td></tr>
|
||||
<?php
|
||||
if ($session->userGrade >= 5) {
|
||||
|
||||
@@ -6,6 +6,7 @@ include "func.php";
|
||||
|
||||
$year = Util::getReq('year', 'int');
|
||||
$month = Util::getReq('month', 'int');
|
||||
$serverID = Util::getReq('server_id', 'string', null);
|
||||
|
||||
extractMissingPostToGlobals();
|
||||
|
||||
@@ -26,13 +27,17 @@ if(!$year || !$month) {
|
||||
}
|
||||
|
||||
|
||||
if(!$serverID){
|
||||
$serverID = UniqueConst::$serverID;
|
||||
}
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin([])->setReadOnly();
|
||||
|
||||
$db = DB::db();
|
||||
$connect=$db->get();
|
||||
|
||||
$map = $db->queryFirstField('SELECT map FROM history WHERE year=%i AND month=%i', $year, $month);
|
||||
$map = $db->queryFirstField('SELECT map FROM history WHERE server_id=%s AND year=%i AND month=%i', $serverID, $year, $month);
|
||||
|
||||
if(!$map){
|
||||
Json::die([
|
||||
|
||||
+3
-19
@@ -63,27 +63,11 @@ if ($gencount >= $admin['maxgeneral']) {
|
||||
echo "<script>history.go(-1);</script>";
|
||||
exit();
|
||||
}
|
||||
?>
|
||||
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr><td align=center colspan=2 id=bg1>임관 권유 메세지</td></tr>
|
||||
<?php
|
||||
$query = "select name,scoutmsg,color from nation";
|
||||
$nationresult = MYDB_query($query, $connect) or Error("join ".MYDB_error($connect), "");
|
||||
$nationcount = MYDB_num_rows($nationresult);
|
||||
$nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation ORDER BY rand()');
|
||||
|
||||
for ($i=0; $i < $nationcount; $i++) {
|
||||
$nation = MYDB_fetch_array($nationresult);
|
||||
if ($nation['scoutmsg'] == "") {
|
||||
echo "
|
||||
<tr><td align=center width=98 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>{$nation['name']}</td><td width=898 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>-</td></tr>";
|
||||
} else {
|
||||
echo "
|
||||
<tr><td align=center width=98 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>{$nation['name']}</td><td width=898 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>{$nation['scoutmsg']}</td></tr>";
|
||||
}
|
||||
}
|
||||
echo getInvitationList($nationList);
|
||||
?>
|
||||
</table>
|
||||
|
||||
<form name=form1 method=post action=join_post.php>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
@@ -161,7 +145,7 @@ if ($admin['show_img_level'] >= 1 && $member['grade'] >= 1 && $member['picture']
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center colspan=3>
|
||||
<font color=orange>모든 능력치는 ( 10 <= 능력치 <= <?=GameConst::$defaultStatMax?> ) 사이로 잡으셔야 합니다.<br>
|
||||
<font color=orange>모든 능력치는 ( <?=GameConst::$defaultStatMin?> <= 능력치 <= <?=GameConst::$defaultStatMax?> ) 사이로 잡으셔야 합니다.<br>
|
||||
그 외의 능력치는 가입되지 않습니다.</font>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -43,7 +43,10 @@ $userID = Session::getUserID();
|
||||
//NOTE: 이 페이지에서는 세션에 데이터를 등록하지 않음. 로그인은 이후에.
|
||||
|
||||
$name = Util::getReq('name');
|
||||
$name = htmlspecialchars($name);
|
||||
$name = StringUtil::removeSpecialCharacter($name);
|
||||
$name = WebUtil::htmlPurify($name);
|
||||
$name = StringUtil::textStrip($name);
|
||||
$pic = (int)Util::getReq('pic', 'bool', 0);
|
||||
$character = Util::getReq('character', 'int', 0);
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
jQuery(function($){
|
||||
$('#by_scenario').change(function(){
|
||||
var scenarioIdx = $(this).val();
|
||||
$.redirect('a_hallOfFame.php', {scenarioIdx:scenarioIdx}, 'get');
|
||||
})
|
||||
//$.redirect("processing.php",{ commandtype: commandtype, turn: turn}, 'post');
|
||||
});
|
||||
+1
-1
@@ -35,7 +35,7 @@ function Error($message='', $url="")
|
||||
if (!$url) {
|
||||
$url = $_SERVER['REQUEST_URI'];
|
||||
}
|
||||
file_put_contents(__dir__."/logs/_db_bug.txt", "{\"url\":\"$url\",\"msg\":\"$message\"}\n", FILE_APPEND);
|
||||
file_put_contents(__dir__."/logs/".UniqueConst::$serverID."/_db_bug.txt", "{\"url\":\"$url\",\"msg\":\"$message\"}\n", FILE_APPEND);
|
||||
|
||||
$templates = new \League\Plates\Engine(__dir__.'/templates');
|
||||
|
||||
|
||||
+66
-37
@@ -599,19 +599,30 @@ function processWar($general, $city) {
|
||||
$query = "update general set recwar='{$general['turntime']}',train='{$oppose['train']}',warnum=warnum+1 where no='{$oppose['no']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
$ratio = rand() % 100;
|
||||
//특기보정 : 저격(수극), 활무기저격
|
||||
if(($general['special2'] == 70 && $ratio <= 33) || ($general['item'] == 2 && $ratio <= 20) || (($general['weap'] == 10 || $general['weap'] == 14 || $general['weap'] == 18 || $general['weap'] == 22) && $ratio <= 20)) {
|
||||
$snipe = false;
|
||||
$snipeItem = false;
|
||||
if(!$snipe && $general['special2'] == 70 && Util::randF(1/3)){
|
||||
$snipe = true;
|
||||
}
|
||||
if(!$snipe && in_array($general['weap'], [10, 14, 18, 22]) && Util::randF(1/5)){
|
||||
$snipe = true;
|
||||
}
|
||||
if(!$snipe && $general['item'] == 2){
|
||||
if(Util::randF(1/5)){
|
||||
$snipe = true;
|
||||
$snipeItem = true;
|
||||
}
|
||||
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
|
||||
|
||||
}
|
||||
if($snipe) {
|
||||
//수극 사용
|
||||
if($general['item'] == 2) {
|
||||
$query = "update general set item=0 where no='{$general['no']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
if($snipeItem) {
|
||||
$josaUl = JosaUtil::pick($general['item'], '을');
|
||||
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
|
||||
$general['item'] = 0;
|
||||
} elseif($general['weap'] == 10 || $general['weap'] == 14 || $general['weap'] == 18 || $general['weap'] == 22) {
|
||||
// $josaUl = JosaUtil::pick($general['weap'], '을');
|
||||
// $log[] = "<C>●</><C>".getWeapName($general['weap'])."</>{$josaUl} 사용!";
|
||||
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
|
||||
}
|
||||
$log[] = "<C>●</>상대를 <C>저격</>했다!";
|
||||
$batlog[] = "<C>●</>상대를 <C>저격</>했다!";
|
||||
@@ -620,26 +631,37 @@ function processWar($general, $city) {
|
||||
// 부상
|
||||
$oppose['injury'] += rand() % 41 + 20; // 20 ~ 60
|
||||
if($oppose['injury'] > 80) { $oppose['injury'] = 80; }
|
||||
} else if($general['item'] == 2 && $ratio <= 40) {
|
||||
$query = "update general set item=0 where no='{$general['no']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
}
|
||||
else if($snipeItem) {
|
||||
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
|
||||
$josaYi = JosaUtil::pick($general['item'], '이');
|
||||
$batlog[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaYi} 빗나갑니다!";
|
||||
$general['item'] = 0;
|
||||
}
|
||||
$ratio = rand() % 100;
|
||||
|
||||
//특기보정 : 저격(수극), 활무기저격
|
||||
if(($oppose['special2'] == 70 && $ratio <= 33) || ($oppose['item'] == 2 && $ratio <= 20) || (($oppose['weap'] == 10 || $oppose['weap'] == 14 || $oppose['weap'] == 18 || $oppose['weap'] == 22) && $ratio <= 20)) {
|
||||
$snipe = false;
|
||||
$snipeItem = false;
|
||||
if(!$snipe && $oppose['special2'] == 70 && Util::randF(1/3)){
|
||||
$snipe = true;
|
||||
}
|
||||
if(!$snipe && in_array($oppose['weap'], [10, 14, 18, 22]) && Util::randF(1/5)){
|
||||
$snipe = true;
|
||||
}
|
||||
if(!$snipe && $oppose['item'] == 2){
|
||||
if(Util::randF(1/5)){
|
||||
$snipe = true;
|
||||
$snipeItem = true;
|
||||
}
|
||||
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
|
||||
}
|
||||
if($snipe) {
|
||||
//수극 사용
|
||||
if($oppose['item'] == 2) {
|
||||
$query = "update general set item=0 where no='{$oppose['no']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
if($snipeItem) {
|
||||
$josaUl = JosaUtil::pick($oppose['item'], '을');
|
||||
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
|
||||
$log[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
|
||||
$oppose['item'] = 0;
|
||||
} elseif($oppose['weap'] == 10 || $oppose['weap'] == 14 || $oppose['weap'] == 18 || $oppose['weap'] == 22) {
|
||||
// $josaUl = JosaUtil::pick($oppose['weap'], '을');
|
||||
// $opplog[] = "<C>●</><C>".getWeapName($oppose['weap'])."</>{$josaUl} 사용!";
|
||||
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
|
||||
}
|
||||
$oppbatlog[] = "<C>●</>상대를 <C>저격</>했다!";
|
||||
$opplog[] = "<C>●</>상대를 <C>저격</>했다!";
|
||||
@@ -648,11 +670,11 @@ function processWar($general, $city) {
|
||||
// 부상
|
||||
$general['injury'] += rand() % 41 + 20; // 20 ~ 60
|
||||
if($general['injury'] > 80) { $general['injury'] = 80; }
|
||||
} else if($oppose['item'] == 2 && $ratio <= 40) {
|
||||
$query = "update general set item=0 where no='{$oppose['no']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
}
|
||||
else if($snipeItem) {
|
||||
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
|
||||
$josaYi = JosaUtil::pick($oppose['item'], '이');
|
||||
$oppbatlog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaYi} 빗나갑니다!";
|
||||
$batlog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaYi} 빗나갑니다!";
|
||||
$oppose['item'] = 0;
|
||||
}
|
||||
|
||||
@@ -1783,13 +1805,16 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
|
||||
$loseGeneralGold = 0;
|
||||
$loseGeneralRice = 0;
|
||||
//멸망국 장수들 역사 기록 및 로그 전달
|
||||
$query = "select no,name,nation,npc,gold,rice from general where nation='{$city['nation']}'";
|
||||
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
$gencount = MYDB_num_rows($result);
|
||||
$josaYi = JosaUtil::pick($losenation['name'], '이');
|
||||
$genlog = ["<C>●</><D><b>{$losenation['name']}</b></>{$josaYi} <R>멸망</>했습니다."];
|
||||
for($i=0; $i < $gencount; $i++) {
|
||||
$gen = MYDB_fetch_array($result);
|
||||
|
||||
|
||||
// 국가 백업
|
||||
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $city['nation']);
|
||||
$oldNationGenerals = $db->query('SELECT * FROM general WHERE nation=%i', $city['nation']);
|
||||
$oldNation['generals'] = $oldNationGenerals;
|
||||
|
||||
foreach($oldNationGenerals as $gen){
|
||||
|
||||
$loseGold = intdiv($gen['gold'] * (rand()%30+20), 100);
|
||||
$loseRice = intdiv($gen['rice'] * (rand()%30+20), 100);
|
||||
@@ -1801,6 +1826,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
|
||||
pushGenLog($gen, $genlog);
|
||||
|
||||
pushGeneralHistory($gen, "<C>●</>{$year}년 {$month}월:<D><b>{$losenation['name']}</b></>{$josaYi} <R>멸망</>");
|
||||
pushOldNationStop($gen['no'], $city['nation']);
|
||||
|
||||
$loseGeneralGold += $loseGold;
|
||||
$loseGeneralRice += $loseRice;
|
||||
@@ -1811,14 +1837,10 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
|
||||
|| $nation['name'] == "왜족") {
|
||||
//등용장 미발부
|
||||
} elseif(Util::randBool(0.5)) {
|
||||
//TODO:등용장 보낼것
|
||||
/*sendScoutMsg([
|
||||
'id' => $ruler['no'],
|
||||
'nation_id' => $ruler['nation']
|
||||
],[
|
||||
'id' => $gen['no'],
|
||||
'nation_id' => $gen['nation']
|
||||
],$general['turntime']);*/
|
||||
$msg = ScoutMessage::buildScoutMessage($general['no'], $gen['no']);
|
||||
if($msg){
|
||||
$msg->send(true);
|
||||
}
|
||||
}
|
||||
|
||||
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병)
|
||||
@@ -1856,6 +1878,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
|
||||
pushGenLog($gen, $genlog);
|
||||
}
|
||||
|
||||
|
||||
//분쟁기록 모두 지움
|
||||
DeleteConflict($city['nation']);
|
||||
// 전 장수 공헌 명성치 깎음
|
||||
@@ -1873,6 +1896,12 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
|
||||
// 외교 삭제
|
||||
$query = "delete from diplomacy where me='{$city['nation']}' or you='{$city['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
$db->insert('ng_old_nations', [
|
||||
'server_id'=>UniqueConst::$serverID,
|
||||
'nation'=>$city['nation'],
|
||||
'data'=>Json::encode($oldNation)
|
||||
]);
|
||||
// 국가 삭제
|
||||
$query = "delete from nation where nation='{$city['nation']}'";
|
||||
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
|
||||
|
||||
+5
-14
@@ -972,6 +972,8 @@ function command_25($turn, $command) {
|
||||
$query = "select nation,name,color,scout,scoutmsg,sabotagelimit,gennum from nation order by gennum";
|
||||
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
|
||||
$count = MYDB_num_rows($result);
|
||||
|
||||
$nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation ORDER BY rand()');
|
||||
|
||||
echo "
|
||||
국가에 임관합니다.<br>
|
||||
@@ -988,15 +990,7 @@ function command_25($turn, $command) {
|
||||
<option value=98 style=color:white;background-color:black;>???</option>";
|
||||
|
||||
$scoutStr = "";
|
||||
for($i=1; $i <= $count; $i++) {
|
||||
$nation = MYDB_fetch_array($result);
|
||||
|
||||
if($nation['scoutmsg'] == "") {
|
||||
$scoutStr .= "<tr><td align=center width=130 style=color:".newColor($nation['color']).";background-color:{$nation['color']};>{$nation['name']}</td><td width=870 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>-</td></tr>";
|
||||
} else {
|
||||
$scoutStr .= "<tr><td align=center width=130 style=color:".newColor($nation['color']).";background-color:{$nation['color']};>{$nation['name']}</td><td width=870 style=color:".newColor($nation['color']).";background-color:{$nation['color']}>".$nation['scoutmsg']."</td></tr>";
|
||||
}
|
||||
|
||||
foreach($nationList as $nation){
|
||||
if($gameStor->year < $gameStor->startyear+3 && $nation['gennum'] >= GameConst::$initialNationGenLimit) {
|
||||
echo "
|
||||
<option value={$nation['nation']} style=color:{$nation['color']};background-color:red;>【 {$nation['name']} 】</option>";
|
||||
@@ -1023,11 +1017,8 @@ function command_25($turn, $command) {
|
||||
}
|
||||
|
||||
echo "
|
||||
</form>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr><td align=center colspan=2 id=bg1>임관 권유 메세지</td></tr>
|
||||
{$scoutStr}
|
||||
</table>";
|
||||
</form>";
|
||||
echo getInvitationList($nationList);
|
||||
|
||||
ender();
|
||||
}
|
||||
|
||||
@@ -55,13 +55,15 @@ class ResetHelper{
|
||||
$db = DB::db();
|
||||
$mysqli_obj = $db->get();
|
||||
|
||||
FileUtil::delInDir($servRoot."/logs");
|
||||
FileUtil::delInDir($servRoot."/data");
|
||||
$serverID = DB::prefix().'_'.date("ymd").'_'.Util::randomStr(4);
|
||||
|
||||
mkdir($servRoot.'/logs/'.$serverID, 0644);
|
||||
mkdir($servRoot.'/data/'.$serverID, 0644);
|
||||
|
||||
$result = Util::generateFileUsingSimpleTemplate(
|
||||
$servRoot.'/d_setting/UniqueConst.orig.php',
|
||||
$servRoot.'/d_setting/UniqueConst.php',[
|
||||
'serverID'=>DB::prefix().'_'.Util::randomStr(8),
|
||||
'serverID'=>$serverID,
|
||||
'serverName'=>AppConf::getList()[$prefix]->getKorName(),
|
||||
], true
|
||||
);
|
||||
@@ -92,7 +94,8 @@ class ResetHelper{
|
||||
(KVStorage::getStorage($db, 'game_env'))->resetValues();
|
||||
|
||||
return [
|
||||
'result'=>true
|
||||
'result'=>true,
|
||||
'serverID'=>$serverID
|
||||
];
|
||||
}
|
||||
|
||||
@@ -126,6 +129,8 @@ class ResetHelper{
|
||||
return $clearResult;
|
||||
}
|
||||
|
||||
$serverID = $clearResult['serverID'];
|
||||
|
||||
$scenarioObj = new Scenario($scenario, false);
|
||||
$scenarioObj->buildConf();
|
||||
|
||||
@@ -203,6 +208,14 @@ class ResetHelper{
|
||||
$gameStor->$key = $value;
|
||||
}
|
||||
|
||||
$db->insert('ng_games', [
|
||||
'server_id'=>$serverID,
|
||||
'date'=>$turntime,
|
||||
'winner_nation'=>null,
|
||||
'scenario'=>$scenario,
|
||||
'env'=>Json::encode($env)
|
||||
]);
|
||||
|
||||
$scenarioObj->build($env);
|
||||
|
||||
$db->update('plock', [
|
||||
|
||||
@@ -170,7 +170,7 @@ class ScoutMessage extends Message{
|
||||
return self::DECLINED;
|
||||
}
|
||||
|
||||
public static function buildScoutMessage(int $srcGeneralID, int $destGeneralID, &$reason = null, \DateTime $date = null){
|
||||
public static function buildScoutMessage(int $srcGeneralID, int $destGeneralID, &$reason = null, \DateTime $date = null):?self{
|
||||
if($srcGeneralID == $destGeneralID){
|
||||
if($reason !== null){
|
||||
$reason = '같은 장수에게 등용장을 보낼 수 없습니다';
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
{
|
||||
"title":"【가상모드9】 천인 강림",
|
||||
"title":"【가상모드9-a】 천인 강림",
|
||||
"life":1,
|
||||
"fiction":1,
|
||||
"nation":[
|
||||
],
|
||||
"diplomacy":[
|
||||
],
|
||||
"stat":{
|
||||
"npcMax":65,
|
||||
"chiefMin":55
|
||||
},
|
||||
"general":[
|
||||
[ 1, "소제1", 1001, 0, null, 18, 7, 48, 0, 160, 300, "유지", null],
|
||||
[ 1, "헌제", 1002, 0, null, 15, 7, 61, 0, 160, 300, "안전", null],
|
||||
@@ -0,0 +1,710 @@
|
||||
{
|
||||
"title":"【가상모드9-b】 천인 강림·극",
|
||||
"life":1,
|
||||
"fiction":1,
|
||||
"nation":[
|
||||
],
|
||||
"diplomacy":[
|
||||
],
|
||||
"stat":{
|
||||
"total":260,
|
||||
"min":40,
|
||||
"max":120,
|
||||
"npcMax":65,
|
||||
"chiefMin":55
|
||||
},
|
||||
"general":[
|
||||
[ 1, "소제1", 1001, 0, null, 18, 7, 48, 0, 160, 300, "유지", null],
|
||||
[ 1, "헌제", 1002, 0, null, 15, 7, 61, 0, 160, 300, "안전", null],
|
||||
[999, "사마휘", 1003, 0, null, 47, 7, 69, 0, 160, 300, "은둔", "신산", "좋지, 좋아~"],
|
||||
[999, "우길", 1004, 0, null, 15, 7, 69, 0, 160, 300, "은둔", "신산"],
|
||||
[999, "화타", 1005, 0, null, 41, 11, 54, 0, 160, 300, "은둔", "의술", "아픈 사람들은 모두 내게 오시오. 껄껄껄."],
|
||||
[999, "길평", 1006, 0, null, 26, 8, 67, 0, 160, 300, "은둔", "의술"],
|
||||
[ 29, "가규", 1007, 0, null, 41, 21, 56, 0, 160, 300, "재간", null],
|
||||
[136, "가범", 1008, 0, null, 42, 19, 55, 0, 160, 300, "유지", null],
|
||||
[ 49, "가비능", 1009, 0, null, 42, 61, 14, 0, 160, 300, "정복", null],
|
||||
[ 31, "가충", 1010, 0, null, 40, 11, 64, 0, 160, 300, "출세", null],
|
||||
[ 20, "가후", 1011, 0, null, 46, 13, 68, 0, 160, 300, "할거", "귀병"],
|
||||
[ 73, "간옹", 1012, 0, null, 30, 14, 67, 0, 160, 300, "안전", "경작"],
|
||||
[129, "감녕", 1013, 0, null, 49, 69, 27, 0, 160, 300, "출세", "무쌍"],
|
||||
[127, "감택", 1014, 0, null, 44, 18, 59, 0, 160, 300, "유지", null],
|
||||
[ 60, "강단", 1015, 0, null, 37, 67, 17, 0, 160, 300, "재간", null],
|
||||
[ 73, "강유", 1016, 0, null, 55, 33, 68, 0, 160, 300, "왕좌", "집중", "갈고 닦은 무예와 승상께 배운 책략을 발휘해 보이겠다!"],
|
||||
[102, "고간", 1017, 0, null, 43, 46, 20, 0, 160, 300, "유지", null],
|
||||
[ 27, "고람", 1018, 0, null, 47, 52, 23, 0, 160, 300, "출세", "기병"],
|
||||
[ 69, "고상", 1019, 0, null, 37, 40, 16, 0, 160, 300, "재간", null],
|
||||
[144, "고순", 1020, 0, null, 49, 61, 25, 0, 160, 300, "의협", "기병"],
|
||||
[ 7, "고승", 1021, 0, null, 37, 67, 11, 0, 160, 300, "출세", null],
|
||||
[120, "고옹", 1022, 0, null, 42, 10, 59, 0, 160, 300, "출세", null],
|
||||
[ 63, "고정", 1023, 0, null, 45, 51, 21, 0, 160, 300, "정복", null],
|
||||
[ 53, "고패", 1024, 0, null, 41, 45, 12, 0, 160, 300, "유지", null],
|
||||
[ 74, "공도", 1025, 0, null, 25, 67, 9, 0, 160, 300, "재간", null],
|
||||
[142, "공손강", 1026, 0, null, 44, 55, 23, 0, 160, 300, "정복", null],
|
||||
[142, "공손공", 1027, 0, null, 46, 17, 57, 0, 160, 300, "정복", null],
|
||||
[142, "공손도", 1028, 0, null, 44, 55, 17, 0, 160, 300, "정복", "기병"],
|
||||
[ 65, "공손범", 1029, 0, null, 43, 52, 23, 0, 160, 300, "출세", null],
|
||||
[ 65, "공손속", 1030, 0, null, 43, 57, 17, 0, 160, 300, "정복", null],
|
||||
[ 10, "공손연", 1031, 0, null, 48, 59, 24, 0, 160, 300, "패권", "돌격"],
|
||||
[ 65, "공손월", 1032, 0, null, 39, 63, 18, 0, 160, 300, "정복", null],
|
||||
[ 65, "공손찬", 1033, 0, null, 43, 64, 25, 0, 160, 300, "패권", "기병"],
|
||||
[ 43, "공융", 1034, 0, null, 44, 19, 63, 0, 160, 300, "왕좌", "경작"],
|
||||
[ 35, "공주", 1035, 0, null, 44, 15, 58, 0, 160, 300, "재간", null],
|
||||
[ 83, "공지", 1036, 0, null, 42, 21, 50, 0, 160, 300, "대의", null],
|
||||
[ 26, "곽가", 1037, 0, null, 39, 11, 70, 0, 160, 300, "패권", "귀모"],
|
||||
[111, "곽도", 1038, 0, null, 44, 25, 60, 0, 160, 300, "재간", null],
|
||||
[ 2, "곽사", 1039, 0, null, 42, 52, 13, 0, 160, 300, "패권", null],
|
||||
[ 80, "곽유지", 1040, 0, null, 35, 10, 67, 0, 160, 300, "재간", "상재"],
|
||||
[ 67, "곽익", 1041, 0, null, 45, 23, 52, 0, 160, 300, "재간", null],
|
||||
[ 67, "곽준", 1042, 0, null, 48, 26, 55, 0, 160, 300, "출세", null],
|
||||
[ 27, "곽혁", 1043, 0, null, 36, 13, 68, 0, 160, 300, "안전", null],
|
||||
[ 20, "곽회", 1044, 0, null, 49, 57, 27, 0, 160, 300, "정복", null],
|
||||
[ 39, "관구검", 1045, 0, null, 47, 26, 58, 0, 160, 300, "대의", null],
|
||||
[ 76, "관색", 1046, 0, null, 46, 63, 25, 0, 160, 300, "의협", "징병"],
|
||||
[ 76, "관우", 1047, 0, null, 55, 70, 30, 0, 160, 300, "의협", "위압", "나의 청룡 언월도를 과연 막아낼 수 있겠소?"],
|
||||
[ 76, "관이", 1048, 0, null, 39, 60, 22, 0, 160, 300, "안전", null],
|
||||
[ 76, "관통", 1049, 0, null, 39, 63, 23, 0, 160, 300, "대의", null],
|
||||
[ 76, "관평", 1050, 0, null, 49, 60, 26, 0, 160, 300, "의협", "보병"],
|
||||
[ 7, "관해", 1051, 0, null, 45, 66, 15, 0, 160, 300, "출세", null],
|
||||
[ 76, "관흥", 1052, 0, null, 46, 62, 27, 0, 160, 300, "의협", "돌격"],
|
||||
[ 40, "괴량", 1053, 0, null, 37, 12, 69, 0, 160, 300, "안전", "신중"],
|
||||
[ 40, "괴월", 1054, 0, null, 25, 13, 69, 0, 160, 300, "유지", "귀병"],
|
||||
[ 98, "교모", 1055, 0, null, 43, 22, 48, 0, 160, 300, "안전", null],
|
||||
[ 98, "교현", 1056, 0, null, 40, 9, 48, 0, 160, 300, "재간", null],
|
||||
[ 6, "구역거", 1057, 0, null, 40, 55, 19, 0, 160, 300, "안전", null],
|
||||
[ 80, "극정", 1058, 0, null, 36, 11, 68, 0, 160, 300, "유지", null],
|
||||
[ 46, "금선", 1059, 0, null, 41, 41, 15, 0, 160, 300, "할거", null],
|
||||
[ 62, "금환삼결", 1060, 0, null, 38, 68, 9, 0, 160, 300, "출세", null],
|
||||
[141, "기령", 1061, 0, null, 48, 60, 14, 0, 160, 300, "대의", "무쌍"],
|
||||
[122, "낙통", 1062, 0, null, 42, 18, 53, 0, 160, 300, "유지", null],
|
||||
[124, "노숙1", 1063, 0, null, 53, 17, 68, 0, 160, 300, "왕좌", "상재"],
|
||||
[ 75, "노식", 1064, 0, null, 53, 21, 60, 0, 160, 300, "왕좌", "징병"],
|
||||
[ 59, "뇌동", 1065, 0, null, 46, 58, 18, 0, 160, 300, "출세", "궁병"],
|
||||
[142, "뇌박", 1066, 0, null, 41, 44, 14, 0, 160, 300, "유지", null],
|
||||
[127, "능조", 1067, 0, null, 45, 60, 18, 0, 160, 300, "재간", "공성"],
|
||||
[127, "능통", 1068, 0, null, 47, 58, 22, 0, 160, 300, "의협", "궁병"],
|
||||
[ 64, "단경", 1069, 0, null, 46, 23, 52, 0, 160, 300, "정복", null],
|
||||
[132, "담웅", 1070, 0, null, 40, 58, 9, 0, 160, 300, "출세", null],
|
||||
[ 99, "답둔", 1071, 0, null, 43, 54, 13, 0, 160, 300, "유지", null],
|
||||
[132, "당자", 1072, 0, null, 43, 45, 18, 0, 160, 300, "안전", null],
|
||||
[ 60, "대래동주", 1073, 0, null, 36, 65, 11, 0, 160, 300, "안전", null],
|
||||
[ 82, "도겸", 1074, 0, null, 40, 14, 48, 0, 160, 300, "할거", "인덕"],
|
||||
[120, "도준", 1075, 0, null, 44, 46, 20, 0, 160, 300, "안전", null],
|
||||
[ 73, "동궐", 1076, 0, null, 45, 20, 57, 0, 160, 300, "대의", null],
|
||||
[ 62, "동다나", 1077, 0, null, 40, 54, 12, 0, 160, 300, "유지", null],
|
||||
[ 2, "동민", 1078, 0, null, 40, 51, 19, 0, 160, 300, "안전", null],
|
||||
[ 21, "동소", 1079, 0, null, 38, 18, 62, 0, 160, 300, "패권", null],
|
||||
[127, "동습", 1080, 0, null, 41, 50, 14, 0, 160, 300, "출세", null],
|
||||
[ 89, "동승", 1081, 0, null, 48, 51, 25, 0, 160, 300, "왕좌", null],
|
||||
[ 78, "동윤", 1082, 0, null, 44, 12, 58, 0, 160, 300, "왕좌", null],
|
||||
[ 2, "동탁", 1083, 0, null, 52, 66, 21, 0, 160, 300, "패권", "기병"],
|
||||
[ 66, "동화", 1084, 0, null, 39, 64, 21, 0, 160, 300, "대의", null],
|
||||
[ 32, "두예", 1085, 0, null, 52, 30, 62, 0, 160, 300, "정복", null],
|
||||
[ 7, "등무", 1086, 0, null, 37, 68, 9, 0, 160, 300, "정복", null],
|
||||
[ 41, "등애", 1087, 0, null, 54, 30, 67, 0, 160, 300, "패권", "신산"],
|
||||
[116, "등윤", 1088, 0, null, 34, 17, 66, 0, 160, 300, "안전", null],
|
||||
[ 73, "등지", 1089, 0, null, 48, 20, 60, 0, 160, 300, "할거", "경작"],
|
||||
[ 41, "등충", 1090, 0, null, 43, 61, 21, 0, 160, 300, "출세", null],
|
||||
[ 54, "등현", 1091, 0, null, 45, 23, 48, 0, 160, 300, "출세", null],
|
||||
[ 29, "마균", 1092, 0, null, 33, 16, 68, 0, 160, 300, "안전", null],
|
||||
[ 71, "마대", 1093, 0, null, 49, 59, 19, 0, 160, 300, "대의", "기병"],
|
||||
[ 70, "마등", 1094, 0, null, 50, 64, 22, 0, 160, 300, "왕좌", "기병"],
|
||||
[ 80, "마속", 1095, 0, null, 47, 24, 61, 0, 160, 300, "패권", "집중"],
|
||||
[ 77, "마량", 1096, 0, null, 42, 11, 64, 0, 160, 300, "왕좌", null],
|
||||
[ 48, "마완", 1097, 0, null, 39, 64, 12, 0, 160, 300, "안전", "기병"],
|
||||
[ 19, "마준", 1098, 0, null, 38, 63, 24, 0, 160, 300, "안전", null],
|
||||
[ 71, "마철", 1099, 0, null, 47, 48, 13, 0, 160, 300, "대의", "기병"],
|
||||
[ 70, "마초", 1100, 0, null, 49, 70, 16, 0, 160, 300, "대의", "기병", "금마초 나가신닷!"],
|
||||
[131, "마충1", 1101, 0, null, 45, 49, 20, 0, 160, 300, "재간", null],
|
||||
[ 69, "마충2", 1102, 0, null, 43, 52, 20, 0, 160, 300, "출세", null],
|
||||
[ 71, "마휴", 1103, 0, null, 47, 48, 14, 0, 160, 300, "대의", "기병"],
|
||||
[116, "만총", 1104, 0, null, 49, 16, 58, 0, 160, 300, "할거", "신중"],
|
||||
[ 51, "망아장", 1105, 0, null, 28, 64, 10, 0, 160, 300, "출세", null],
|
||||
[ 44, "맹달", 1106, 0, null, 46, 25, 55, 0, 160, 300, "할거", "귀병"],
|
||||
[ 60, "맹우", 1107, 0, null, 44, 59, 12, 0, 160, 300, "정복", null],
|
||||
[ 60, "맹획", 1108, 0, null, 49, 67, 20, 0, 160, 300, "왕좌", "격노"],
|
||||
[ 29, "모개", 1109, 0, null, 38, 56, 22, 0, 160, 300, "대의", null],
|
||||
[ 51, "목록대왕", 1110, 0, null, 42, 54, 25, 0, 160, 300, "재간", "척사"],
|
||||
[ 96, "목순", 1111, 0, null, 15, 10, 66, 0, 160, 300, "왕좌", null],
|
||||
[ 43, "무안국", 1112, 0, null, 40, 55, 9, 0, 160, 300, "재간", null],
|
||||
[ 28, "문빙", 1113, 0, null, 46, 58, 17, 0, 160, 300, "유지", null],
|
||||
[ 38, "문앙", 1114, 0, null, 47, 66, 18, 0, 160, 300, "대의", null],
|
||||
[102, "문추", 1115, 0, null, 47, 68, 11, 0, 160, 300, "출세", "무쌍"],
|
||||
[ 38, "문흠", 1116, 0, null, 48, 58, 17, 0, 160, 300, "대의", null],
|
||||
[ 49, "미당대왕", 1117, 0, null, 44, 57, 14, 0, 160, 300, "유지", null],
|
||||
[108, "미방", 1118, 0, null, 42, 51, 15, 0, 160, 300, "패권", "징병"],
|
||||
[ 77, "미축", 1119, 0, null, 25, 13, 65, 0, 160, 300, "왕좌", "상재"],
|
||||
[ 94, "반봉", 1120, 0, null, 43, 57, 9, 0, 160, 300, "출세", null],
|
||||
[ 44, "반준", 1121, 0, null, 37, 10, 66, 0, 160, 300, "안전", null],
|
||||
[ 65, "방덕", 1122, 0, null, 48, 66, 25, 0, 160, 300, "의협", "기병"],
|
||||
[ 73, "방통", 1123, 0, null, 52, 17, 70, 0, 160, 300, "패권", "반계"],
|
||||
[ 65, "방회", 1124, 0, null, 24, 14, 59, 0, 160, 300, "안전", null],
|
||||
[ 68, "배원소", 1125, 0, null, 38, 67, 14, 0, 160, 300, "재간", null],
|
||||
[ 78, "번건", 1126, 0, null, 27, 13, 66, 0, 160, 300, "대의", null],
|
||||
[149, "번주", 1127, 0, null, 45, 58, 10, 0, 160, 300, "할거", null],
|
||||
[ 72, "법정", 1128, 0, null, 50, 13, 67, 0, 160, 300, "패권", "신산"],
|
||||
[ 8, "변희", 1129, 0, null, 45, 51, 12, 0, 160, 300, "안전", null],
|
||||
[121, "보질", 1130, 0, null, 42, 12, 58, 0, 160, 300, "유지", null],
|
||||
[113, "복양흥", 1131, 0, null, 42, 20, 54, 0, 160, 300, "유지", null],
|
||||
[110, "봉기", 1132, 0, null, 46, 20, 60, 0, 160, 300, "패권", "집중"],
|
||||
[ 74, "부동", 1133, 0, null, 42, 26, 26, 0, 160, 300, "대의", null],
|
||||
[108, "부사인", 1134, 0, null, 41, 47, 20, 0, 160, 300, "출세", null],
|
||||
[ 38, "부손", 1135, 0, null, 23, 17, 66, 0, 160, 300, "안전", null],
|
||||
[ 74, "부첨", 1136, 0, null, 43, 56, 18, 0, 160, 300, "대의", null],
|
||||
[ 66, "비시", 1137, 0, null, 16, 15, 61, 0, 160, 300, "재간", null],
|
||||
[141, "비연", 1138, 0, null, 45, 51, 21, 0, 160, 300, "출세", null],
|
||||
[ 77, "비위", 1139, 0, null, 47, 12, 55, 0, 160, 300, "대의", null],
|
||||
[144, "사광", 1140, 0, null, 42, 19, 51, 0, 160, 300, "안전", null],
|
||||
[ 71, "사마가", 1141, 0, null, 43, 63, 9, 0, 160, 300, "정복", "돌격"],
|
||||
[ 20, "사마랑", 1142, 0, null, 24, 14, 63, 0, 160, 300, "대의", null],
|
||||
[ 24, "사마망", 1143, 0, null, 47, 23, 51, 0, 160, 300, "정복", null],
|
||||
[ 24, "사마부", 1144, 0, null, 41, 13, 55, 0, 160, 300, "대의", null],
|
||||
[ 31, "사마사", 1145, 0, null, 52, 24, 66, 0, 160, 300, "정복", null],
|
||||
[ 31, "사마소", 1146, 0, null, 54, 24, 62, 0, 160, 300, "정복", null],
|
||||
[ 31, "사마염", 1147, 0, null, 54, 58, 27, 0, 160, 300, "패권", null],
|
||||
[ 30, "사마유", 1148, 0, null, 44, 18, 59, 0, 160, 300, "왕좌", null],
|
||||
[ 31, "사마의", 1149, 0, null, 56, 25, 70, 0, 160, 300, "패권", "반계"],
|
||||
[139, "사섭", 1150, 0, null, 44, 23, 54, 0, 160, 300, "안전", null],
|
||||
[139, "사일", 1151, 0, null, 43, 18, 52, 0, 160, 300, "유지", null],
|
||||
[132, "사정", 1152, 0, null, 45, 54, 10, 0, 160, 300, "안전", null],
|
||||
[146, "사지", 1153, 0, null, 43, 19, 54, 0, 160, 300, "안전", null],
|
||||
[144, "사휘", 1154, 0, null, 45, 54, 23, 0, 160, 300, "유지", null],
|
||||
[ 35, "서막", 1155, 0, null, 42, 17, 55, 0, 160, 300, "유지", null],
|
||||
[ 76, "서서", 1156, 0, null, 53, 26, 69, 0, 160, 300, "의협", "귀병"],
|
||||
[124, "서성", 1157, 0, null, 51, 28, 61, 0, 160, 300, "대의", null],
|
||||
[142, "서영", 1158, 0, null, 39, 63, 14, 0, 160, 300, "안전", null],
|
||||
[ 23, "서질", 1159, 0, null, 41, 55, 14, 0, 160, 300, "재간", null],
|
||||
[ 23, "서황", 1160, 0, null, 49, 65, 26, 0, 160, 300, "의협", "필살"],
|
||||
[ 32, "석포", 1161, 0, null, 47, 49, 23, 0, 160, 300, "정복", null],
|
||||
[131, "설영", 1162, 0, null, 38, 11, 64, 0, 160, 300, "유지", null],
|
||||
[128, "설종", 1163, 0, null, 26, 14, 66, 0, 160, 300, "유지", null],
|
||||
[ 69, "성의", 1164, 0, null, 38, 64, 10, 0, 160, 300, "재간", null],
|
||||
[129, "소비", 1165, 0, null, 45, 49, 19, 0, 160, 300, "대의", null],
|
||||
[ 76, "손건", 1166, 0, null, 37, 14, 67, 0, 160, 300, "대의", "거상"],
|
||||
[125, "손견", 1167, 0, null, 55, 69, 28, 0, 160, 300, "왕좌", "무쌍"],
|
||||
[126, "손광", 1168, 0, null, 44, 21, 46, 0, 160, 300, "유지", null],
|
||||
[125, "손권", 1169, 0, null, 53, 29, 61, 0, 160, 300, "할거", "수비"],
|
||||
[126, "손랑", 1170, 0, null, 26, 54, 12, 0, 160, 300, "안전", null],
|
||||
[126, "손등", 1171, 0, null, 40, 16, 58, 0, 160, 300, "할거", null],
|
||||
[125, "손량", 1172, 0, null, 23, 11, 68, 0, 160, 300, "할거", null],
|
||||
[ 20, "손례", 1173, 0, null, 44, 24, 53, 0, 160, 300, "안전", null],
|
||||
[124, "손소", 1174, 0, null, 48, 60, 26, 0, 160, 300, "정복", null],
|
||||
[130, "손수", 1175, 0, null, 45, 22, 47, 0, 160, 300, "안전", null],
|
||||
[126, "손유", 1176, 0, null, 49, 23, 52, 0, 160, 300, "정복", null],
|
||||
[122, "손이", 1177, 0, null, 42, 49, 22, 0, 160, 300, "안전", null],
|
||||
[126, "손정", 1178, 0, null, 43, 22, 49, 0, 160, 300, "유지", null],
|
||||
[115, "손준", 1179, 0, null, 43, 53, 20, 0, 160, 300, "정복", null],
|
||||
[ 7, "손중", 1180, 0, null, 41, 49, 11, 0, 160, 300, "안전", null],
|
||||
[125, "손책", 1181, 0, null, 55, 69, 29, 0, 160, 300, "패권", "필살", "소패왕 손책이 나가신다! 길을 비켜라!"],
|
||||
[115, "손침", 1182, 0, null, 39, 67, 16, 0, 160, 300, "패권", null],
|
||||
[114, "손호", 1183, 0, null, 18, 68, 25, 0, 160, 300, "패권", null],
|
||||
[126, "손화", 1184, 0, null, 35, 11, 67, 0, 160, 300, "왕좌", null],
|
||||
[127, "손환", 1185, 0, null, 49, 25, 54, 0, 160, 300, "정복", null],
|
||||
[126, "손휴", 1186, 0, null, 44, 17, 50, 0, 160, 300, "정복", null],
|
||||
[117, "손흠", 1187, 0, null, 45, 49, 14, 0, 160, 300, "정복", null],
|
||||
[147, "송헌", 1188, 0, null, 37, 63, 17, 0, 160, 300, "안전", null],
|
||||
[ 95, "순우경", 1189, 0, null, 47, 52, 23, 0, 160, 300, "할거", null],
|
||||
[ 22, "순욱1", 1190, 0, null, 41, 13, 70, 0, 160, 300, "왕좌", "집중"],
|
||||
[ 22, "순유", 1191, 0, null, 47, 17, 66, 0, 160, 300, "대의", "신중"],
|
||||
[ 29, "신비", 1192, 0, null, 39, 12, 68, 0, 160, 300, "재간", null],
|
||||
[ 37, "신의", 1193, 0, null, 41, 48, 20, 0, 160, 300, "출세", null],
|
||||
[ 37, "신탐", 1194, 0, null, 42, 46, 22, 0, 160, 300, "출세", null],
|
||||
[ 85, "신평", 1195, 0, null, 46, 20, 57, 0, 160, 300, "왕좌", null],
|
||||
[102, "심배", 1196, 0, null, 48, 25, 52, 0, 160, 300, "패권", "귀병"],
|
||||
[126, "심영", 1197, 0, null, 41, 55, 20, 0, 160, 300, "재간", null],
|
||||
[ 47, "아하소과", 1198, 0, null, 41, 57, 8, 0, 160, 300, "안전", "척사"],
|
||||
[ 62, "아회남", 1199, 0, null, 40, 56, 13, 0, 160, 300, "출세", "척사"],
|
||||
[ 23, "악진", 1200, 0, null, 47, 52, 22, 0, 160, 300, "대의", "돌격"],
|
||||
[ 23, "악침", 1201, 0, null, 38, 52, 14, 0, 160, 300, "대의", null],
|
||||
[ 63, "악환", 1202, 0, null, 41, 61, 21, 0, 160, 300, "재간", null],
|
||||
[102, "안량", 1203, 0, null, 47, 67, 15, 0, 160, 300, "출세", "위압"],
|
||||
[ 14, "양백", 1204, 0, null, 41, 44, 21, 0, 160, 300, "안전", null],
|
||||
[ 92, "양봉1", 1205, 0, null, 42, 50, 15, 0, 160, 300, "유지", null],
|
||||
[ 91, "양봉2", 1206, 0, null, 44, 58, 23, 0, 160, 300, "정복", null],
|
||||
[ 13, "양송", 1207, 0, null, 13, 35, 14, 0, 160, 300, "안전", null],
|
||||
[ 43, "양수", 1208, 0, null, 16, 13, 70, 0, 160, 300, "재간", "귀병"],
|
||||
[ 61, "양의", 1209, 0, null, 45, 22, 54, 0, 160, 300, "유지", null],
|
||||
[141, "양조1", 1210, 0, null, 46, 21, 48, 0, 160, 300, "출세", null],
|
||||
[ 9, "양추1", 1211, 0, null, 40, 52, 8, 0, 160, 300, "정복", null],
|
||||
[ 31, "양호", 1212, 0, null, 53, 26, 60, 0, 160, 300, "패권", null],
|
||||
[ 53, "양회", 1213, 0, null, 43, 52, 16, 0, 160, 300, "출세", null],
|
||||
[141, "양흥", 1214, 0, null, 40, 52, 9, 0, 160, 300, "안전", null],
|
||||
[ 6, "어부라", 1215, 0, null, 49, 60, 23, 0, 160, 300, "정복", null],
|
||||
[ 64, "엄강", 1216, 0, null, 42, 51, 18, 0, 160, 300, "재간", null],
|
||||
[ 10, "엄백호", 1217, 0, null, 39, 66, 13, 0, 160, 300, "할거", null],
|
||||
[ 10, "엄여", 1218, 0, null, 35, 66, 11, 0, 160, 300, "할거", null],
|
||||
[ 69, "엄안", 1219, 0, null, 47, 62, 25, 0, 160, 300, "왕좌", null],
|
||||
[ 7, "엄정", 1220, 0, null, 30, 66, 19, 0, 160, 300, "출세", null],
|
||||
[121, "엄준", 1221, 0, null, 38, 11, 67, 0, 160, 300, "재간", null],
|
||||
[ 71, "여개", 1222, 0, null, 40, 17, 52, 0, 160, 300, "유지", null],
|
||||
[ 29, "여건", 1223, 0, null, 38, 66, 13, 0, 160, 300, "출세", null],
|
||||
[107, "여광", 1224, 0, null, 43, 52, 12, 0, 160, 300, "유지", null],
|
||||
[124, "여몽", 1225, 0, null, 54, 29, 67, 0, 160, 300, "패권", "궁병"],
|
||||
[123, "여범", 1226, 0, null, 37, 14, 67, 0, 160, 300, "할거", null],
|
||||
[107, "여상", 1227, 0, null, 44, 52, 12, 0, 160, 300, "유지", null],
|
||||
[105, "여위황", 1228, 0, null, 37, 62, 16, 0, 160, 300, "정복", null],
|
||||
[145, "여포", 1229, 0, null, 48, 72, 13, 0, 160, 300, "패권", "돌격", "다 죽여버리겠다! 으하하."],
|
||||
[ 50, "염우", 1230, 0, null, 42, 42, 9, 0, 160, 300, "출세", null],
|
||||
[ 40, "염유", 1231, 0, null, 43, 57, 20, 0, 160, 300, "출세", null],
|
||||
[ 18, "염포", 1232, 0, null, 33, 15, 68, 0, 160, 300, "유지", null],
|
||||
[ 40, "예형", 1233, 0, null, 49, 13, 69, 0, 160, 300, "은둔", "통찰"],
|
||||
[133, "오강", 1234, 0, null, 39, 15, 61, 0, 160, 300, "안전", null],
|
||||
[ 59, "오란", 1235, 0, null, 45, 57, 17, 0, 160, 300, "재간", null],
|
||||
[ 72, "오반", 1236, 0, null, 46, 51, 18, 0, 160, 300, "재간", null],
|
||||
[128, "오언", 1237, 0, null, 47, 48, 20, 0, 160, 300, "재간", null],
|
||||
[126, "오연", 1238, 0, null, 35, 67, 13, 0, 160, 300, "정복", null],
|
||||
[ 69, "오의", 1239, 0, null, 48, 27, 56, 0, 160, 300, "유지", null],
|
||||
[ 19, "오질", 1240, 0, null, 37, 15, 67, 0, 160, 300, "출세", null],
|
||||
[ 51, "올돌골", 1241, 0, null, 49, 67, 8, 0, 160, 300, "출세", "척사"],
|
||||
[ 52, "옹개", 1242, 0, null, 42, 52, 20, 0, 160, 300, "안전", null],
|
||||
[ 20, "왕경", 1243, 0, null, 41, 19, 51, 0, 160, 300, "재간", null],
|
||||
[ 97, "왕광", 1244, 0, null, 47, 52, 21, 0, 160, 300, "유지", null],
|
||||
[ 30, "왕기1", 1245, 0, null, 48, 24, 54, 0, 160, 300, "유지", null],
|
||||
[ 34, "왕랑", 1246, 0, null, 39, 13, 51, 0, 160, 300, "할거", null],
|
||||
[ 57, "왕루", 1247, 0, null, 36, 12, 68, 0, 160, 300, "유지", null],
|
||||
[ 76, "왕보", 1248, 0, null, 39, 14, 68, 0, 160, 300, "대의", null],
|
||||
[ 86, "왕수", 1249, 0, null, 34, 14, 66, 0, 160, 300, "재간", null],
|
||||
[ 26, "왕쌍", 1250, 0, null, 42, 65, 8, 0, 160, 300, "정복", "보병"],
|
||||
[ 46, "왕위", 1251, 0, null, 43, 23, 52, 0, 160, 300, "안전", null],
|
||||
[ 92, "왕윤", 1252, 0, null, 14, 9, 68, 0, 160, 300, "왕좌", null],
|
||||
[ 40, "왕융", 1253, 0, null, 44, 17, 58, 0, 160, 300, "재간", null],
|
||||
[ 32, "왕준", 1254, 0, null, 50, 61, 28, 0, 160, 300, "대의", null],
|
||||
[ 30, "왕찬", 1255, 0, null, 27, 12, 68, 0, 160, 300, "안전", null],
|
||||
[ 33, "왕창", 1256, 0, null, 48, 46, 20, 0, 160, 300, "정복", null],
|
||||
[ 69, "왕평", 1257, 0, null, 49, 57, 27, 0, 160, 300, "재간", null],
|
||||
[ 71, "왕항", 1258, 0, null, 40, 17, 48, 0, 160, 300, "대의", null],
|
||||
[ 33, "왕혼", 1259, 0, null, 46, 14, 47, 0, 160, 300, "정복", null],
|
||||
[ 71, "요립", 1260, 0, null, 45, 17, 62, 0, 160, 300, "출세", null],
|
||||
[ 74, "요화", 1261, 0, null, 45, 22, 48, 0, 160, 300, "의협", null],
|
||||
[ 22, "우금1", 1262, 0, null, 50, 56, 27, 0, 160, 300, "정복", null],
|
||||
[ 27, "우금2", 1263, 0, null, 44, 58, 15, 0, 160, 300, "대의", null],
|
||||
[122, "우번", 1264, 0, null, 22, 17, 67, 0, 160, 300, "유지", null],
|
||||
[126, "우전", 1265, 0, null, 44, 45, 17, 0, 160, 300, "안전", null],
|
||||
[ 86, "원담", 1266, 0, null, 45, 47, 21, 0, 160, 300, "왕좌", null],
|
||||
[101, "원상", 1267, 0, null, 41, 55, 26, 0, 160, 300, "패권", null],
|
||||
[101, "원소", 1268, 0, null, 51, 25, 57, 0, 160, 300, "패권", "위압"],
|
||||
[140, "원술", 1269, 0, null, 49, 23, 54, 0, 160, 300, "패권", "축성"],
|
||||
[140, "원윤", 1270, 0, null, 37, 14, 60, 0, 160, 300, "패권", null],
|
||||
[101, "원희", 1271, 0, null, 46, 22, 55, 0, 160, 300, "할거", null],
|
||||
[131, "위소", 1272, 0, null, 36, 11, 69, 0, 160, 300, "재간", null],
|
||||
[147, "위속", 1273, 0, null, 42, 47, 17, 0, 160, 300, "안전", null],
|
||||
[ 81, "위연", 1274, 0, null, 49, 68, 24, 0, 160, 300, "패권", "보병"],
|
||||
[ 96, "위유", 1275, 0, null, 41, 26, 54, 0, 160, 300, "재간", null],
|
||||
[ 76, "유기", 1276, 0, null, 42, 9, 55, 0, 160, 300, "왕좌", null],
|
||||
[ 36, "유대", 1277, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
|
||||
[134, "유도", 1278, 0, null, 35, 14, 66, 0, 160, 300, "재간", null],
|
||||
[ 46, "유벽", 1279, 0, null, 44, 54, 11, 0, 160, 300, "출세", null],
|
||||
[ 75, "유봉", 1280, 0, null, 43, 51, 24, 0, 160, 300, "출세", null],
|
||||
[ 75, "유비", 1281, 0, null, 51, 57, 26, 0, 160, 300, "왕좌", "인덕"],
|
||||
[ 75, "유선1", 1282, 0, null, 23, 17, 24, 0, 160, 300, "대의", null],
|
||||
[ 55, "유순", 1283, 0, null, 45, 48, 21, 0, 160, 300, "출세", null],
|
||||
[ 75, "유심", 1284, 0, null, 44, 18, 54, 0, 160, 300, "왕좌", null],
|
||||
[129, "유약", 1285, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
|
||||
[ 55, "유언", 1286, 0, null, 43, 16, 56, 0, 160, 300, "할거", null],
|
||||
[ 27, "유엽", 1287, 0, null, 36, 13, 68, 0, 160, 300, "유지", null],
|
||||
[ 11, "유요", 1288, 0, null, 22, 10, 48, 0, 160, 300, "안전", "발명"],
|
||||
[ 96, "유우", 1289, 0, null, 46, 14, 55, 0, 160, 300, "왕좌", null],
|
||||
[ 55, "유장", 1290, 0, null, 36, 13, 63, 0, 160, 300, "할거", "수비"],
|
||||
[ 45, "유종", 1291, 0, null, 20, 12, 61, 0, 160, 300, "할거", null],
|
||||
[ 56, "유파", 1292, 0, null, 39, 14, 67, 0, 160, 300, "대의", null],
|
||||
[ 45, "유표1", 1293, 0, null, 47, 22, 54, 0, 160, 300, "할거", null],
|
||||
[ 27, "유표2", 1294, 0, null, 48, 21, 54, 0, 160, 300, "안전", null],
|
||||
[134, "유현", 1295, 0, null, 31, 56, 21, 0, 160, 300, "안전", null],
|
||||
[122, "육개", 1296, 0, null, 45, 13, 55, 0, 160, 300, "재간", null],
|
||||
[122, "육손", 1297, 0, null, 56, 26, 70, 0, 160, 300, "왕좌", "귀병"],
|
||||
[121, "육적", 1298, 0, null, 38, 13, 67, 0, 160, 300, "안전", null],
|
||||
[122, "육항", 1299, 0, null, 55, 26, 68, 0, 160, 300, "왕좌", null],
|
||||
[ 38, "윤대목", 1300, 0, null, 44, 19, 53, 0, 160, 300, "재간", null],
|
||||
[ 80, "윤묵", 1301, 0, null, 17, 12, 67, 0, 160, 300, "대의", null],
|
||||
[ 72, "윤상", 1302, 0, null, 29, 14, 42, 0, 160, 300, "대의", null],
|
||||
[136, "윤직", 1303, 0, null, 38, 58, 49, 0, 160, 300, "재간", null],
|
||||
[ 2, "이각", 1304, 0, null, 42, 58, 17, 0, 160, 300, "패권", null],
|
||||
[146, "이숙", 1305, 0, null, 26, 18, 66, 0, 160, 300, "재간", null],
|
||||
[ 71, "이엄", 1306, 0, null, 50, 62, 30, 0, 160, 300, "패권", null],
|
||||
[ 2, "이유", 1307, 0, null, 44, 10, 66, 0, 160, 300, "패권", "귀모"],
|
||||
[132, "이이", 1308, 0, null, 41, 57, 10, 0, 160, 300, "정복", null],
|
||||
[ 77, "이적", 1309, 0, null, 41, 12, 58, 0, 160, 300, "할거", null],
|
||||
[ 22, "이전", 1310, 0, null, 48, 26, 61, 0, 160, 300, "왕좌", null],
|
||||
[ 71, "이풍1", 1311, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
|
||||
[ 66, "이회", 1312, 0, null, 45, 20, 59, 0, 160, 300, "유지", null],
|
||||
[114, "잠혼", 1313, 0, null, 13, 8, 44, 0, 160, 300, "할거", null],
|
||||
[ 7, "장각", 1314, 0, null, 54, 11, 67, 0, 160, 300, "패권", "환술"],
|
||||
[ 34, "장간", 1315, 0, null, 17, 10, 67, 0, 160, 300, "재간", null],
|
||||
[ 7, "장개", 1316, 0, null, 39, 67, 9, 0, 160, 300, "안전", null],
|
||||
[122, "장굉", 1317, 0, null, 24, 10, 69, 0, 160, 300, "왕좌", null],
|
||||
[ 7, "장량", 1318, 0, null, 46, 60, 26, 0, 160, 300, "정복", "환술"],
|
||||
[ 15, "장로", 1319, 0, null, 48, 18, 60, 0, 160, 300, "유지", "축성"],
|
||||
[ 23, "장료", 1320, 0, null, 53, 67, 31, 0, 160, 300, "의협", "견고"],
|
||||
[ 7, "장보", 1321, 0, null, 49, 60, 28, 0, 160, 300, "패권", "환술"],
|
||||
[ 76, "장비", 1322, 0, null, 49, 71, 19, 0, 160, 300, "의협", "무쌍", "어쭈. 해보자 이거냐?"],
|
||||
[ 62, "장서", 1323, 0, null, 38, 48, 15, 0, 160, 300, "출세", null],
|
||||
[120, "장소1", 1324, 0, null, 37, 11, 70, 0, 160, 300, "안전", null],
|
||||
[ 78, "장소2", 1325, 0, null, 40, 18, 54, 0, 160, 300, "재간", null],
|
||||
[ 72, "장송", 1326, 0, null, 39, 12, 70, 0, 160, 300, "할거", "통찰"],
|
||||
[148, "장수", 1327, 0, null, 47, 55, 26, 0, 160, 300, "할거", null],
|
||||
[145, "장양1", 1328, 0, null, 44, 51, 25, 0, 160, 300, "출세", null],
|
||||
[ 8, "장연", 1329, 0, null, 49, 51, 19, 0, 160, 300, "안전", null],
|
||||
[ 11, "장영", 1330, 0, null, 41, 51, 16, 0, 160, 300, "재간", null],
|
||||
[118, "장온", 1331, 0, null, 19, 13, 67, 0, 160, 300, "할거", null],
|
||||
[ 78, "장완", 1332, 0, null, 46, 21, 63, 0, 160, 300, "할거", "상재"],
|
||||
[ 15, "장위", 1333, 0, null, 45, 54, 13, 0, 160, 300, "대의", null],
|
||||
[ 36, "장윤", 1334, 0, null, 45, 23, 48, 0, 160, 300, "정복", null],
|
||||
[104, "장의거", 1335, 0, null, 46, 47, 14, 0, 160, 300, "대의", null],
|
||||
[ 68, "장익", 1336, 0, null, 48, 52, 24, 0, 160, 300, "유지", null],
|
||||
[ 56, "장임", 1337, 0, null, 51, 61, 28, 0, 160, 300, "대의", "견고"],
|
||||
[148, "장제1", 1338, 0, null, 46, 51, 23, 0, 160, 300, "할거", null],
|
||||
[ 32, "장제2", 1339, 0, null, 29, 14, 69, 0, 160, 300, "유지", null],
|
||||
[126, "장제3", 1340, 0, null, 48, 19, 48, 0, 160, 300, "할거", null],
|
||||
[ 17, "장패", 1341, 0, null, 38, 68, 17, 0, 160, 300, "할거", null],
|
||||
[ 76, "장포1", 1342, 0, null, 46, 63, 19, 0, 160, 300, "재간", "징병"],
|
||||
[113, "장포2", 1343, 0, null, 44, 51, 20, 0, 160, 300, "유지", null],
|
||||
[ 27, "장합", 1344, 0, null, 51, 66, 24, 0, 160, 300, "출세", "궁병"],
|
||||
[ 23, "장호", 1345, 0, null, 42, 49, 21, 0, 160, 300, "정복", null],
|
||||
[ 31, "장화", 1346, 0, null, 39, 11, 69, 0, 160, 300, "유지", null],
|
||||
[ 48, "장횡", 1347, 0, null, 41, 52, 11, 0, 160, 300, "재간", null],
|
||||
[141, "장훈", 1348, 0, null, 45, 48, 23, 0, 160, 300, "안전", null],
|
||||
[120, "장휴", 1349, 0, null, 37, 15, 67, 0, 160, 300, "재간", null],
|
||||
[126, "장흠", 1350, 0, null, 44, 25, 52, 0, 160, 300, "대의", "저격"],
|
||||
[ 96, "저수", 1351, 0, null, 50, 21, 64, 0, 160, 300, "할거", "반계"],
|
||||
[130, "전단", 1352, 0, null, 44, 55, 23, 0, 160, 300, "출세", null],
|
||||
[ 42, "전속", 1353, 0, null, 45, 46, 19, 0, 160, 300, "안전", null],
|
||||
[ 26, "전위1", 1354, 0, null, 43, 69, 14, 0, 160, 300, "의협", "필살"],
|
||||
[130, "전위2", 1355, 0, null, 48, 53, 24, 0, 160, 300, "출세", null],
|
||||
[128, "전종", 1356, 0, null, 49, 58, 28, 0, 160, 300, "패권", null],
|
||||
[ 42, "전주", 1357, 0, null, 46, 52, 20, 0, 160, 300, "의협", null],
|
||||
[ 96, "전풍", 1358, 0, null, 50, 17, 69, 0, 160, 300, "왕좌", null],
|
||||
[ 24, "정무", 1359, 0, null, 41, 16, 56, 0, 160, 300, "출세", null],
|
||||
[119, "정병", 1360, 0, null, 20, 11, 66, 0, 160, 300, "유지", null],
|
||||
[126, "정보", 1361, 0, null, 50, 24, 57, 0, 160, 300, "패권", null],
|
||||
[123, "정봉1", 1362, 0, null, 46, 58, 24, 0, 160, 300, "패권", null],
|
||||
[ 24, "정욱", 1363, 0, null, 50, 16, 66, 0, 160, 300, "패권", "신중"],
|
||||
[ 88, "정원", 1364, 0, null, 44, 58, 22, 0, 160, 300, "왕좌", "기병"],
|
||||
[ 7, "정원지", 1365, 0, null, 37, 68, 16, 0, 160, 300, "출세", null],
|
||||
[ 69, "정은", 1366, 0, null, 41, 49, 12, 0, 160, 300, "재간", null],
|
||||
[121, "제갈각", 1367, 0, null, 43, 21, 67, 0, 160, 300, "왕좌", null],
|
||||
[ 76, "제갈균", 1368, 0, null, 43, 18, 56, 0, 160, 300, "안전", "상재"],
|
||||
[121, "제갈근", 1369, 0, null, 43, 17, 64, 0, 160, 300, "왕좌", "경작"],
|
||||
[ 76, "제갈량", 1370, 0, null, 55, 21, 72, 0, 160, 300, "왕좌", "집중", "슬슬 나의 지모를 발휘해 보겠습니다..."],
|
||||
[ 76, "제갈상", 1371, 0, null, 40, 57, 27, 0, 160, 300, "대의", null],
|
||||
[135, "제갈정", 1372, 0, null, 42, 46, 21, 0, 160, 300, "안전", null],
|
||||
[ 76, "제갈첨", 1373, 0, null, 47, 20, 57, 0, 160, 300, "대의", null],
|
||||
[135, "제갈탄", 1374, 0, null, 49, 59, 27, 0, 160, 300, "패권", null],
|
||||
[ 76, "조광", 1375, 0, null, 45, 52, 21, 0, 160, 300, "재간", null],
|
||||
[ 74, "조루", 1376, 0, null, 39, 15, 60, 0, 160, 300, "대의", null],
|
||||
[ 24, "조모", 1377, 0, null, 41, 31, 13, 0, 160, 300, "할거", null],
|
||||
[127, "조무", 1378, 0, null, 47, 26, 54, 0, 160, 300, "의협", null],
|
||||
[ 26, "조방", 1379, 0, null, 40, 10, 30, 0, 160, 300, "정복", null],
|
||||
[ 83, "조범", 1380, 0, null, 42, 16, 49, 0, 160, 300, "유지", null],
|
||||
[ 26, "조비", 1381, 0, null, 47, 26, 57, 0, 160, 300, "패권", "징병"],
|
||||
[ 19, "조상", 1382, 0, null, 46, 49, 13, 0, 160, 300, "패권", null],
|
||||
[147, "조성", 1383, 0, null, 38, 67, 20, 0, 160, 300, "안전", null],
|
||||
[ 26, "조순", 1384, 0, null, 45, 22, 55, 0, 160, 300, "정복", null],
|
||||
[ 25, "조식", 1385, 0, null, 17, 9, 70, 0, 160, 300, "왕좌", "귀모"],
|
||||
[ 25, "조앙", 1386, 0, null, 38, 65, 24, 0, 160, 300, "왕좌", null],
|
||||
[ 25, "조예", 1387, 0, null, 42, 21, 61, 0, 160, 300, "정복", null],
|
||||
[ 26, "조우", 1388, 0, null, 45, 21, 52, 0, 160, 300, "대의", null],
|
||||
[ 76, "조운", 1389, 0, null, 55, 70, 32, 0, 160, 300, "왕좌", "무쌍", "창술의 달인 상산 조자룡 여기 있소!"],
|
||||
[ 25, "조웅", 1390, 0, null, 43, 12, 38, 0, 160, 300, "안전", null],
|
||||
[ 26, "조인", 1391, 0, null, 48, 59, 24, 0, 160, 300, "패권", "보병"],
|
||||
[ 25, "조조", 1392, 0, null, 56, 30, 69, 0, 160, 300, "패권", "반계"],
|
||||
[ 26, "조진", 1393, 0, null, 50, 52, 25, 0, 160, 300, "정복", null],
|
||||
[ 25, "조창", 1394, 0, null, 48, 64, 15, 0, 160, 300, "정복", "돌격"],
|
||||
[ 76, "조통", 1395, 0, null, 45, 50, 21, 0, 160, 300, "재간", null],
|
||||
[ 84, "조표", 1396, 0, null, 34, 67, 8, 0, 160, 300, "안전", null],
|
||||
[ 7, "조홍1", 1397, 0, null, 40, 51, 17, 0, 160, 300, "유지", null],
|
||||
[ 24, "조홍2", 1398, 0, null, 47, 53, 18, 0, 160, 300, "패권", null],
|
||||
[ 26, "조환", 1399, 0, null, 34, 11, 42, 0, 160, 300, "정복", null],
|
||||
[ 19, "조훈", 1400, 0, null, 45, 49, 13, 0, 160, 300, "출세", null],
|
||||
[ 26, "조휴", 1401, 0, null, 48, 54, 26, 0, 160, 300, "패권", null],
|
||||
[ 19, "조희", 1402, 0, null, 44, 22, 54, 0, 160, 300, "대의", null],
|
||||
[ 22, "종요", 1403, 0, null, 14, 10, 68, 0, 160, 300, "유지", null],
|
||||
[ 20, "종회", 1404, 0, null, 51, 22, 67, 0, 160, 300, "패권", null],
|
||||
[128, "주거", 1405, 0, null, 47, 27, 55, 0, 160, 300, "유지", null],
|
||||
[118, "주방", 1406, 0, null, 42, 15, 57, 0, 160, 300, "할거", null],
|
||||
[126, "주연", 1407, 0, null, 47, 55, 20, 0, 160, 300, "할거", null],
|
||||
[126, "주유", 1408, 0, null, 55, 27, 70, 0, 160, 300, "패권", "신산"],
|
||||
[128, "주이", 1409, 0, null, 43, 21, 48, 0, 160, 300, "안전", null],
|
||||
[ 88, "주준", 1410, 0, null, 50, 57, 25, 0, 160, 300, "왕좌", null],
|
||||
[ 32, "주지", 1411, 0, null, 40, 58, 19, 0, 160, 300, "안전", null],
|
||||
[ 76, "주창", 1412, 0, null, 37, 68, 13, 0, 160, 300, "의협", "궁병"],
|
||||
[126, "주치", 1413, 0, null, 42, 21, 45, 0, 160, 300, "안전", null],
|
||||
[ 41, "주태1", 1414, 0, null, 44, 21, 48, 0, 160, 300, "안전", null],
|
||||
[126, "주태2", 1415, 0, null, 48, 64, 23, 0, 160, 300, "정복", "필살"],
|
||||
[128, "주환", 1416, 0, null, 51, 63, 28, 0, 160, 300, "정복", null],
|
||||
[ 29, "진건", 1417, 0, null, 44, 54, 24, 0, 160, 300, "정복", null],
|
||||
[ 29, "진교", 1418, 0, null, 19, 11, 66, 0, 160, 300, "유지", null],
|
||||
[ 28, "진군", 1419, 0, null, 43, 16, 64, 0, 160, 300, "대의", null],
|
||||
[143, "진궁", 1420, 0, null, 49, 20, 66, 0, 160, 300, "할거", "신중"],
|
||||
[ 79, "진규", 1421, 0, null, 20, 9, 67, 0, 160, 300, "할거", null],
|
||||
[ 72, "진도", 1422, 0, null, 47, 63, 26, 0, 160, 300, "대의", null],
|
||||
[ 79, "진등", 1423, 0, null, 44, 24, 54, 0, 160, 300, "할거", null],
|
||||
[ 37, "진림", 1424, 0, null, 40, 12, 61, 0, 160, 300, "재간", null],
|
||||
[124, "진무", 1425, 0, null, 44, 56, 23, 0, 160, 300, "재간", null],
|
||||
[ 66, "진복", 1426, 0, null, 35, 12, 68, 0, 160, 300, "재간", null],
|
||||
[ 50, "진수", 1427, 0, null, 24, 13, 69, 0, 160, 300, "대의", null],
|
||||
[ 81, "진식", 1428, 0, null, 39, 66, 20, 0, 160, 300, "출세", null],
|
||||
[ 79, "진진", 1429, 0, null, 42, 16, 50, 0, 160, 300, "재간", null],
|
||||
[ 28, "진태", 1430, 0, null, 49, 57, 26, 0, 160, 300, "대의", null],
|
||||
[ 11, "진횡", 1431, 0, null, 36, 58, 19, 0, 160, 300, "출세", null],
|
||||
[ 21, "차주", 1432, 0, null, 41, 51, 24, 0, 160, 300, "안전", null],
|
||||
[ 11, "착융", 1433, 0, null, 44, 47, 10, 0, 160, 300, "출세", null],
|
||||
[ 36, "채모", 1434, 0, null, 49, 53, 26, 0, 160, 300, "정복", "궁병"],
|
||||
[ 36, "채중", 1435, 0, null, 42, 17, 45, 0, 160, 300, "출세", null],
|
||||
[ 36, "채화", 1436, 0, null, 42, 19, 41, 0, 160, 300, "안전", null],
|
||||
[ 66, "초주", 1437, 0, null, 20, 12, 69, 0, 160, 300, "대의", null],
|
||||
[ 20, "최염", 1438, 0, null, 37, 54, 52, 0, 160, 300, "대의", null],
|
||||
[ 60, "축융", 1439, 0, null, 43, 64, 11, 0, 160, 300, "정복", "척사"],
|
||||
[ 60, "타사대왕", 1440, 0, null, 43, 55, 25, 0, 160, 300, "출세", "척사"],
|
||||
[124, "태사자", 1441, 0, null, 47, 70, 25, 0, 160, 300, "대의", "무쌍"],
|
||||
[124, "태사향", 1442, 0, null, 40, 53, 20, 0, 160, 300, "재간", null],
|
||||
[ 12, "포륭", 1443, 0, null, 41, 56, 10, 0, 160, 300, "안전", null],
|
||||
[ 74, "풍습", 1444, 0, null, 35, 64, 18, 0, 160, 300, "재간", null],
|
||||
[ 7, "하의", 1445, 0, null, 39, 66, 11, 0, 160, 300, "출세", null],
|
||||
[121, "하제", 1446, 0, null, 48, 55, 24, 0, 160, 300, "재간", null],
|
||||
[ 90, "하진", 1447, 0, null, 39, 67, 15, 0, 160, 300, "왕좌", null],
|
||||
[ 24, "하후덕", 1448, 0, null, 45, 50, 16, 0, 160, 300, "출세", null],
|
||||
[ 26, "하후돈", 1449, 0, null, 52, 67, 27, 0, 160, 300, "의협", "돌격", "다 나오거라! 상대해 주마!"],
|
||||
[ 19, "하후무", 1450, 0, null, 36, 33, 34, 0, 160, 300, "안전", null],
|
||||
[ 24, "하후상", 1451, 0, null, 45, 24, 54, 0, 160, 300, "출세", null],
|
||||
[ 26, "하후연", 1452, 0, null, 49, 66, 22, 0, 160, 300, "패권", "궁병", "궁술로 날 당해낼 자가 있을까? 후후."],
|
||||
[ 26, "하후위", 1453, 0, null, 47, 57, 27, 0, 160, 300, "정복", null],
|
||||
[ 26, "하후은", 1454, 0, null, 39, 51, 16, 0, 160, 300, "안전", null],
|
||||
[ 23, "하후패", 1455, 0, null, 49, 64, 26, 0, 160, 300, "대의", null],
|
||||
[ 20, "하후현", 1456, 0, null, 42, 11, 57, 0, 160, 300, "유지", null],
|
||||
[ 26, "하후혜", 1457, 0, null, 48, 25, 58, 0, 160, 300, "정복", null],
|
||||
[ 26, "하후화", 1458, 0, null, 49, 23, 60, 0, 160, 300, "정복", null],
|
||||
[ 22, "학소", 1459, 0, null, 53, 30, 63, 0, 160, 300, "대의", "견고"],
|
||||
[126, "한당", 1460, 0, null, 46, 52, 24, 0, 160, 300, "할거", null],
|
||||
[ 93, "한복", 1461, 0, null, 45, 47, 17, 0, 160, 300, "안전", null],
|
||||
[ 8, "한섬", 1462, 0, null, 36, 62, 15, 0, 160, 300, "출세", null],
|
||||
[ 48, "한수", 1463, 0, null, 45, 28, 58, 0, 160, 300, "대의", "기병"],
|
||||
[ 40, "한숭", 1464, 0, null, 19, 11, 67, 0, 160, 300, "재간", null],
|
||||
[ 7, "한충", 1465, 0, null, 37, 66, 13, 0, 160, 300, "안전", null],
|
||||
[ 9, "한현", 1466, 0, null, 37, 61, 10, 0, 160, 300, "유지", null],
|
||||
[ 27, "한호", 1467, 0, null, 43, 55, 18, 0, 160, 300, "유지", null],
|
||||
[ 79, "향랑", 1468, 0, null, 40, 10, 58, 0, 160, 300, "대의", null],
|
||||
[ 79, "향총", 1469, 0, null, 48, 17, 55, 0, 160, 300, "왕좌", null],
|
||||
[139, "허공", 1470, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
|
||||
[ 21, "허유", 1471, 0, null, 39, 47, 46, 0, 160, 300, "재간", null],
|
||||
[ 23, "허의", 1472, 0, null, 30, 68, 19, 0, 160, 300, "출세", null],
|
||||
[ 26, "허저", 1473, 0, null, 42, 70, 12, 0, 160, 300, "정복", "무쌍"],
|
||||
[ 87, "허정", 1474, 0, null, 16, 13, 68, 0, 160, 300, "재간", null],
|
||||
[ 12, "형도영", 1475, 0, null, 39, 68, 11, 0, 160, 300, "출세", null],
|
||||
[148, "호거아", 1476, 0, null, 35, 68, 23, 0, 160, 300, "안전", null],
|
||||
[ 76, "호반", 1477, 0, null, 43, 46, 18, 0, 160, 300, "재간", null],
|
||||
[ 20, "호분", 1478, 0, null, 47, 23, 48, 0, 160, 300, "할거", null],
|
||||
[ 27, "호주천", 1479, 0, null, 49, 57, 25, 0, 160, 300, "정복", null],
|
||||
[ 20, "호준", 1480, 0, null, 45, 48, 18, 0, 160, 300, "재간", null],
|
||||
[ 2, "화웅", 1481, 0, null, 46, 64, 11, 0, 160, 300, "출세", "돌격"],
|
||||
[131, "화핵", 1482, 0, null, 35, 12, 68, 0, 160, 300, "안전", null],
|
||||
[ 10, "화흠", 1483, 0, null, 16, 17, 68, 0, 160, 300, "출세", null],
|
||||
[ 21, "환범", 1484, 0, null, 18, 11, 69, 0, 160, 300, "유지", null],
|
||||
[127, "황개", 1485, 0, null, 49, 63, 26, 0, 160, 300, "왕좌", "징병"],
|
||||
[ 56, "황권", 1486, 0, null, 48, 18, 58, 0, 160, 300, "대의", null],
|
||||
[ 41, "황란", 1487, 0, null, 28, 67, 11, 0, 160, 300, "재간", null],
|
||||
[ 88, "황보숭", 1488, 0, null, 51, 24, 55, 0, 160, 300, "왕좌", null],
|
||||
[ 72, "황충", 1489, 0, null, 51, 68, 25, 0, 160, 300, "왕좌", "궁병"],
|
||||
[ 50, "황호", 1490, 0, null, 13, 9, 48, 0, 160, 300, "안전", null],
|
||||
[147, "후성", 1491, 0, null, 42, 49, 14, 0, 160, 300, "정복", null]
|
||||
],
|
||||
"general_ex":[
|
||||
[123, "가화", 1492, 0, null, 40, 51, 16, 0, 160, 300, null, null],
|
||||
[999, "건석", 1493, 0, null, 19, 7, 61, 0, 160, 300, null, null],
|
||||
[999, "견씨", 1494, 0, null, 35, 11, 58, 0, 160, 300, null, null],
|
||||
[ 40, "견홍", 1495, 0, null, 48, 55, 25, 0, 160, 300, null, null],
|
||||
[120, "고담", 1496, 0, null, 33, 10, 67, 0, 160, 300, null, null],
|
||||
[101, "고유", 1497, 0, null, 42, 18, 55, 0, 160, 300, null, null],
|
||||
[132, "곽마", 1498, 0, null, 46, 54, 19, 0, 160, 300, null, null],
|
||||
[ 39, "관구수", 1499, 0, null, 42, 49, 15, 0, 160, 300, null, null],
|
||||
[ 39, "관구전", 1500, 0, null, 44, 22, 52, 0, 160, 300, null, null],
|
||||
[999, "관로", 1501, 0, null, 44, 10, 57, 0, 160, 300, null, null],
|
||||
[ 65, "관정", 1502, 0, null, 35, 20, 67, 0, 160, 300, null, null],
|
||||
[137, "교수", 1503, 0, null, 45, 53, 16, 0, 160, 300, null, null],
|
||||
[ 33, "구건", 1504, 0, null, 37, 56, 53, 0, 160, 300, null, null],
|
||||
[ 41, "구본", 1505, 0, null, 40, 17, 54, 0, 160, 300, null, null],
|
||||
[ 12, "구성", 1506, 0, null, 42, 54, 13, 0, 160, 300, null, null],
|
||||
[ 21, "국연", 1507, 0, null, 40, 10, 54, 0, 160, 300, null, null],
|
||||
[ 99, "국의", 1508, 0, null, 51, 59, 20, 0, 160, 300, null, null],
|
||||
[ 34, "금의", 1509, 0, null, 16, 16, 63, 0, 160, 300, null, null],
|
||||
[ 76, "나헌", 1510, 0, null, 52, 25, 57, 0, 160, 300, null, null],
|
||||
[999, "남두", 1511, 0, null, 35, 11, 54, 0, 160, 300, null, null],
|
||||
[ 54, "냉포", 1512, 0, null, 46, 61, 26, 0, 160, 300, null, null],
|
||||
[124, "노숙2", 1513, 0, null, 46, 21, 57, 0, 160, 300, null, null],
|
||||
[ 42, "누규", 1514, 0, null, 41, 9, 64, 0, 160, 300, null, null],
|
||||
[ 6, "누반", 1515, 0, null, 45, 57, 16, 0, 160, 300, null, null],
|
||||
[130, "누현", 1516, 0, null, 22, 10, 66, 0, 160, 300, null, null],
|
||||
[ 40, "당균", 1517, 0, null, 33, 9, 69, 0, 160, 300, null, null],
|
||||
[ 32, "당빈", 1518, 0, null, 46, 56, 24, 0, 160, 300, null, null],
|
||||
[999, "대교", 1519, 0, null, 37, 6, 54, 0, 160, 300, null, null],
|
||||
[ 28, "대릉", 1520, 0, null, 44, 57, 18, 0, 160, 300, null, null],
|
||||
[129, "동조", 1521, 0, null, 14, 8, 51, 0, 160, 300, null, null],
|
||||
[114, "등수", 1522, 0, null, 35, 10, 44, 0, 160, 300, null, null],
|
||||
[ 50, "마막", 1523, 0, null, 20, 17, 5, 0, 160, 300, null, null],
|
||||
[116, "만욱", 1524, 0, null, 18, 9, 66, 0, 160, 300, null, null],
|
||||
[120, "맹종", 1525, 0, null, 39, 19, 66, 0, 160, 300, null, null],
|
||||
[ 38, "문호", 1526, 0, null, 45, 56, 18, 0, 160, 300, null, null],
|
||||
[999, "미씨", 1527, 0, null, 43, 8, 52, 0, 160, 300, null, null],
|
||||
[ 39, "반림", 1528, 0, null, 45, 59, 6, 0, 160, 300, null, null],
|
||||
[129, "반장", 1529, 0, null, 49, 58, 26, 0, 160, 300, null, null],
|
||||
[ 94, "방열", 1530, 0, null, 42, 61, 12, 0, 160, 300, null, null],
|
||||
[ 55, "방희", 1531, 0, null, 43, 16, 53, 0, 160, 300, null, null],
|
||||
[ 30, "배수", 1532, 0, null, 7, 7, 68, 0, 160, 300, null, null],
|
||||
[ 8, "번능", 1533, 0, null, 46, 48, 19, 0, 160, 300, null, null],
|
||||
[999, "번씨", 1534, 0, null, 31, 9, 45, 0, 160, 300, null, null],
|
||||
[ 49, "보도근", 1535, 0, null, 44, 55, 20, 0, 160, 300, null, null],
|
||||
[129, "보천", 1536, 0, null, 46, 23, 55, 0, 160, 300, null, null],
|
||||
[121, "보협", 1537, 0, null, 47, 21, 57, 0, 160, 300, null, null],
|
||||
[ 28, "부하", 1538, 0, null, 38, 15, 69, 0, 160, 300, null, null],
|
||||
[ 26, "비요", 1539, 0, null, 46, 25, 55, 0, 160, 300, null, null],
|
||||
[ 31, "사마주", 1540, 0, null, 44, 21, 49, 0, 160, 300, null, null],
|
||||
[ 41, "사찬", 1541, 0, null, 43, 54, 21, 0, 160, 300, null, null],
|
||||
[128, "설후", 1542, 0, null, 14, 8, 67, 0, 160, 300, null, null],
|
||||
[ 36, "성공영", 1543, 0, null, 47, 22, 60, 0, 160, 300, null, null],
|
||||
[126, "성만", 1544, 0, null, 43, 53, 25, 0, 160, 300, null, null],
|
||||
[999, "소교", 1545, 0, null, 42, 11, 51, 0, 160, 300, null, null],
|
||||
[ 46, "소유", 1546, 0, null, 40, 48, 19, 0, 160, 300, null, null],
|
||||
[ 31, "소제2", 1547, 0, null, 20, 8, 68, 0, 160, 300, null, null],
|
||||
[126, "손교", 1548, 0, null, 49, 23, 53, 0, 160, 300, null, null],
|
||||
[116, "손기", 1549, 0, null, 44, 51, 20, 0, 160, 300, null, null],
|
||||
[999, "손상향", 1550, 0, null, 47, 49, 17, 0, 160, 300, null, null],
|
||||
[125, "손익", 1551, 0, null, 46, 57, 12, 0, 160, 300, null, null],
|
||||
[125, "손진", 1552, 0, null, 44, 54, 19, 0, 160, 300, null, null],
|
||||
[123, "송겸", 1553, 0, null, 43, 40, 18, 0, 160, 300, null, null],
|
||||
[ 85, "순심", 1554, 0, null, 18, 10, 68, 0, 160, 300, null, null],
|
||||
[ 31, "순욱2", 1555, 0, null, 7, 8, 68, 0, 160, 300, null, null],
|
||||
[ 31, "순의", 1556, 0, null, 14, 7, 67, 0, 160, 300, null, null],
|
||||
[129, "시삭", 1557, 0, null, 35, 66, 18, 0, 160, 300, null, null],
|
||||
[ 29, "신창", 1558, 0, null, 40, 13, 39, 0, 160, 300, null, null],
|
||||
[999, "악신", 1559, 0, null, 41, 7, 39, 0, 160, 300, null, null],
|
||||
[138, "악취", 1560, 0, null, 42, 52, 22, 0, 160, 300, null, null],
|
||||
[138, "양강", 1561, 0, null, 44, 54, 17, 0, 160, 300, null, null],
|
||||
[ 21, "양부", 1562, 0, null, 46, 21, 63, 0, 160, 300, null, null],
|
||||
[ 72, "양서", 1563, 0, null, 42, 24, 51, 0, 160, 300, null, null],
|
||||
[ 34, "양습", 1564, 0, null, 45, 19, 55, 0, 160, 300, null, null],
|
||||
[ 16, "양앙", 1565, 0, null, 45, 54, 16, 0, 160, 300, null, null],
|
||||
[ 17, "양임", 1566, 0, null, 47, 58, 22, 0, 160, 300, null, null],
|
||||
[ 32, "양제", 1567, 0, null, 46, 24, 54, 0, 160, 300, null, null],
|
||||
[ 33, "양조2", 1568, 0, null, 45, 23, 52, 0, 160, 300, null, null],
|
||||
[ 48, "양추2", 1569, 0, null, 45, 52, 23, 0, 160, 300, null, null],
|
||||
[140, "양홍", 1570, 0, null, 17, 9, 68, 0, 160, 300, null, null],
|
||||
[ 31, "양혼", 1571, 0, null, 43, 52, 24, 0, 160, 300, null, null],
|
||||
[123, "여거", 1572, 0, null, 47, 22, 53, 0, 160, 300, null, null],
|
||||
[130, "여대", 1573, 0, null, 51, 55, 26, 0, 160, 300, null, null],
|
||||
[136, "염상", 1574, 0, null, 28, 12, 67, 0, 160, 300, null, null],
|
||||
[ 36, "염행", 1575, 0, null, 46, 63, 16, 0, 160, 300, null, null],
|
||||
[ 73, "영수", 1576, 0, null, 46, 26, 56, 0, 160, 300, null, null],
|
||||
[ 39, "오거", 1577, 0, null, 39, 63, 14, 0, 160, 300, null, null],
|
||||
[126, "오경", 1578, 0, null, 47, 48, 22, 0, 160, 300, null, null],
|
||||
[999, "오국태", 1579, 0, null, 30, 7, 60, 0, 160, 300, null, null],
|
||||
[126, "오찬", 1580, 0, null, 46, 17, 58, 0, 160, 300, null, null],
|
||||
[ 23, "온회", 1581, 0, null, 37, 16, 68, 0, 160, 300, null, null],
|
||||
[ 21, "왕기2", 1582, 0, null, 46, 51, 24, 0, 160, 300, null, null],
|
||||
[ 32, "왕도", 1583, 0, null, 39, 18, 67, 0, 160, 300, null, null],
|
||||
[123, "왕돈", 1584, 0, null, 43, 51, 17, 0, 160, 300, null, null],
|
||||
[ 34, "왕릉", 1585, 0, null, 47, 23, 54, 0, 160, 300, null, null],
|
||||
[ 63, "왕문", 1586, 0, null, 44, 52, 14, 0, 160, 300, null, null],
|
||||
[ 32, "왕상", 1587, 0, null, 24, 9, 65, 0, 160, 300, null, null],
|
||||
[ 34, "왕숙", 1588, 0, null, 35, 10, 68, 0, 160, 300, null, null],
|
||||
[ 33, "왕업", 1589, 0, null, 31, 5, 46, 0, 160, 300, null, null],
|
||||
[ 35, "왕충", 1590, 0, null, 37, 58, 10, 0, 160, 300, null, null],
|
||||
[ 1, "우보", 1591, 0, null, 37, 63, 7, 0, 160, 300, null, null],
|
||||
[122, "우사", 1592, 0, null, 46, 14, 59, 0, 160, 300, null, null],
|
||||
[138, "원요", 1593, 0, null, 38, 42, 39, 0, 160, 300, null, null],
|
||||
[ 95, "원유", 1594, 0, null, 42, 16, 55, 0, 160, 300, null, null],
|
||||
[ 31, "위관", 1595, 0, null, 46, 18, 60, 0, 160, 300, null, null],
|
||||
[129, "위막", 1596, 0, null, 42, 49, 23, 0, 160, 300, null, null],
|
||||
[ 55, "유괴", 1597, 0, null, 48, 55, 25, 0, 160, 300, null, null],
|
||||
[129, "유략", 1598, 0, null, 47, 52, 23, 0, 160, 300, null, null],
|
||||
[ 45, "유반", 1599, 0, null, 48, 59, 19, 0, 160, 300, null, null],
|
||||
[ 29, "유복", 1600, 0, null, 41, 20, 55, 0, 160, 300, null, null],
|
||||
[ 78, "유선2", 1601, 0, null, 6, 10, 39, 0, 160, 300, null, null],
|
||||
[139, "유섭", 1602, 0, null, 44, 59, 12, 0, 160, 300, null, null],
|
||||
[ 28, "유소", 1603, 0, null, 45, 20, 55, 0, 160, 300, null, null],
|
||||
[128, "유승", 1604, 0, null, 38, 67, 13, 0, 160, 300, null, null],
|
||||
[129, "유찬", 1605, 0, null, 48, 57, 25, 0, 160, 300, null, null],
|
||||
[129, "유평", 1606, 0, null, 45, 54, 25, 0, 160, 300, null, null],
|
||||
[138, "유훈", 1607, 0, null, 40, 50, 20, 0, 160, 300, null, null],
|
||||
[ 48, "이감", 1608, 0, null, 43, 52, 14, 0, 160, 300, null, null],
|
||||
[ 19, "이승", 1609, 0, null, 11, 26, 31, 0, 160, 300, null, null],
|
||||
[ 22, "이통", 1610, 0, null, 48, 62, 20, 0, 160, 300, null, null],
|
||||
[138, "이풍2", 1611, 0, null, 47, 58, 20, 0, 160, 300, null, null],
|
||||
[ 20, "이풍3", 1612, 0, null, 22, 11, 67, 0, 160, 300, null, null],
|
||||
[ 29, "장구", 1613, 0, null, 46, 54, 19, 0, 160, 300, null, null],
|
||||
[ 21, "장기", 1614, 0, null, 49, 15, 59, 0, 160, 300, null, null],
|
||||
[ 74, "장남", 1615, 0, null, 47, 50, 16, 0, 160, 300, null, null],
|
||||
[100, "장막", 1616, 0, null, 41, 20, 54, 0, 160, 300, null, null],
|
||||
[ 7, "장만성", 1617, 0, null, 47, 61, 19, 0, 160, 300, null, null],
|
||||
[135, "장반", 1618, 0, null, 42, 55, 25, 0, 160, 300, null, null],
|
||||
[ 78, "장빈", 1619, 0, null, 29, 12, 66, 0, 160, 300, null, null],
|
||||
[124, "장승", 1620, 0, null, 48, 26, 57, 0, 160, 300, null, null],
|
||||
[999, "장양2", 1621, 0, null, 42, 42, 19, 0, 160, 300, null, null],
|
||||
[ 68, "장억", 1622, 0, null, 50, 60, 21, 0, 160, 300, null, null],
|
||||
[ 75, "장준", 1623, 0, null, 45, 52, 25, 0, 160, 300, null, null],
|
||||
[ 20, "장집", 1624, 0, null, 30, 12, 68, 0, 160, 300, null, null],
|
||||
[ 39, "장특", 1625, 0, null, 47, 21, 56, 0, 160, 300, null, null],
|
||||
[ 96, "저곡", 1626, 0, null, 42, 21, 52, 0, 160, 300, null, null],
|
||||
[128, "전기", 1627, 0, null, 40, 53, 21, 0, 160, 300, null, null],
|
||||
[ 23, "전만", 1628, 0, null, 40, 56, 16, 0, 160, 300, null, null],
|
||||
[128, "전상", 1629, 0, null, 2, 5, 11, 0, 160, 300, null, null],
|
||||
[130, "전역", 1630, 0, null, 43, 49, 15, 0, 160, 300, null, null],
|
||||
[ 75, "전예", 1631, 0, null, 50, 24, 61, 0, 160, 300, null, null],
|
||||
[ 64, "전해", 1632, 0, null, 47, 49, 22, 0, 160, 300, null, null],
|
||||
[123, "정봉2", 1633, 0, null, 45, 52, 20, 0, 160, 300, null, null],
|
||||
[ 22, "정의", 1634, 0, null, 15, 4, 66, 0, 160, 300, null, null],
|
||||
[ 81, "제갈교", 1635, 0, null, 41, 9, 58, 0, 160, 300, null, null],
|
||||
[ 40, "제갈서", 1636, 0, null, 38, 43, 12, 0, 160, 300, null, null],
|
||||
[ 25, "조충", 1637, 0, null, 12, 5, 68, 0, 160, 300, null, null],
|
||||
[121, "종리목", 1638, 0, null, 51, 26, 57, 0, 160, 300, null, null],
|
||||
[ 22, "종육", 1639, 0, null, 26, 7, 67, 0, 160, 300, null, null],
|
||||
[122, "좌혁", 1640, 0, null, 43, 51, 20, 0, 160, 300, null, null],
|
||||
[ 36, "주령", 1641, 0, null, 49, 54, 26, 0, 160, 300, null, null],
|
||||
[115, "주앙", 1642, 0, null, 48, 24, 24, 0, 160, 300, null, null],
|
||||
[ 52, "주포", 1643, 0, null, 43, 55, 7, 0, 160, 300, null, null],
|
||||
[ 11, "주흔", 1644, 0, null, 45, 21, 58, 0, 160, 300, null, null],
|
||||
[140, "진기", 1645, 0, null, 42, 52, 18, 0, 160, 300, null, null],
|
||||
[142, "진란", 1646, 0, null, 45, 54, 17, 0, 160, 300, null, null],
|
||||
[ 25, "진랑", 1647, 0, null, 42, 54, 16, 0, 160, 300, null, null],
|
||||
[ 12, "진응", 1648, 0, null, 44, 53, 19, 0, 160, 300, null, null],
|
||||
[124, "진표", 1649, 0, null, 44, 19, 56, 0, 160, 300, null, null],
|
||||
[999, "채염", 1650, 0, null, 36, 10, 64, 0, 160, 300, null, null],
|
||||
[999, "초선", 1651, 0, null, 45, 8, 55, 0, 160, 300, null, null],
|
||||
[135, "초이", 1652, 0, null, 41, 51, 21, 0, 160, 300, null, null],
|
||||
[ 65, "추단", 1653, 0, null, 44, 54, 15, 0, 160, 300, null, null],
|
||||
[999, "추씨", 1654, 0, null, 35, 7, 54, 0, 160, 300, null, null],
|
||||
[ 71, "추정", 1655, 0, null, 45, 25, 51, 0, 160, 300, null, null],
|
||||
[145, "파재", 1656, 0, null, 46, 57, 20, 0, 160, 300, null, null],
|
||||
[ 22, "포신", 1657, 0, null, 49, 23, 61, 0, 160, 300, null, null],
|
||||
[114, "하식", 1658, 0, null, 16, 38, 13, 0, 160, 300, null, null],
|
||||
[ 36, "하안", 1659, 0, null, 3, 12, 67, 0, 160, 300, null, null],
|
||||
[999, "하후씨", 1660, 0, null, 28, 8, 47, 0, 160, 300, null, null],
|
||||
[ 5, "학맹", 1661, 0, null, 42, 51, 17, 0, 160, 300, null, null],
|
||||
[ 98, "한거자", 1662, 0, null, 41, 47, 13, 0, 160, 300, null, null],
|
||||
[ 19, "한덕", 1663, 0, null, 44, 59, 11, 0, 160, 300, null, null],
|
||||
[140, "한윤", 1664, 0, null, 26, 11, 66, 0, 160, 300, null, null],
|
||||
[999, "허소", 1665, 0, null, 41, 12, 48, 0, 160, 300, null, null],
|
||||
[ 30, "호열", 1666, 0, null, 49, 26, 57, 0, 160, 300, null, null],
|
||||
[ 76, "호제", 1667, 0, null, 42, 17, 52, 0, 160, 300, null, null],
|
||||
[149, "호진", 1668, 0, null, 45, 58, 7, 0, 160, 300, null, null],
|
||||
[ 29, "호질", 1669, 0, null, 47, 20, 57, 0, 160, 300, null, null],
|
||||
[ 7, "환계", 1670, 0, null, 9, 11, 66, 0, 160, 300, null, null],
|
||||
[ 56, "황숭", 1671, 0, null, 46, 24, 56, 0, 160, 300, null, null],
|
||||
[999, "황승언", 1672, 0, null, 46, 9, 60, 0, 160, 300, null, null],
|
||||
[999, "황월영", 1673, 0, null, 42, 8, 57, 0, 160, 300, null, null],
|
||||
[ 45, "황조", 1674, 0, null, 48, 51, 22, 0, 160, 300, null, null],
|
||||
[ 48, "후선", 1675, 0, null, 42, 51, 15, 0, 160, 300, null, null],
|
||||
[ 8, "휴고", 1676, 0, null, 43, 55, 16, 0, 160, 300, null, null],
|
||||
[ 98, "휴원진", 1677, 0, null, 41, 49, 16, 0, 160, 300, null, null],
|
||||
[ 22, "희지재", 1678, 0, null, 23, 5, 69, 0, 160, 300, null, null]
|
||||
],
|
||||
"cities":[
|
||||
|
||||
],
|
||||
"history":[
|
||||
"<C>●</>180년 1월:<L><b>【이벤트】</b></>차원이 다른 존재들이 나타납니다."
|
||||
],
|
||||
"initialEvents":[
|
||||
|
||||
],
|
||||
"events":[
|
||||
|
||||
]
|
||||
}
|
||||
+244
-243
@@ -8,254 +8,255 @@
|
||||
"max":110,
|
||||
"npcMax":100
|
||||
},
|
||||
"iconPath":"환상향",
|
||||
"nation":[
|
||||
|
||||
],
|
||||
"diplomacy":[],
|
||||
"general":[
|
||||
[0, "히카리코", null, 0, null, 56, 66, 21, 0, 160, 300, null, null],
|
||||
[0, "히메미코", null, 0, null, 68, 78, 65, 0, 160, 300, null, null],
|
||||
[0, "히나", "환상향/히나.jpg", 0, null, 66, 63, 83, 0, 160, 300, null, null, "온갖 재액이 닥쳐올 거야. 인간을 지키기 위해서라도 절대 보내주지 않겠어!"],
|
||||
[0, "후토", "환상향/후토.png", 0, null, 84, 69, 93, 0, 160, 300, null, null, "불이라도 지를까."],
|
||||
[0, "홍미령", "환상향/홍미령.jpg", 0, null, 85, 79, 63, 0, 160, 300, null, null, "젠장, 배수진이다!"],
|
||||
[0, "호쥬누에", "환상향/호쥬누에.jpg", 0, null, 85, 95, 72, 0, 160, 300, null, null, "자아, 나의 정체를 알아버린 당신을 죽여버리고, 정체불명으로 돌아가야겠어."],
|
||||
[0, "호라이인형", null, 0, null, 66, 71, 73, 0, 160, 300, null, null],
|
||||
[0, "헤카티아", "환상향/헤카티아.jpg", 0, null, 85, 84, 94, 0, 160, 300, null, null, "꿈의 세계에선 무방비하니까 간단한 일이었지."],
|
||||
[0, "하타테", "환상향/하타테.jpg", 0, null, 30, 88, 70, 0, 160, 300, null, null, "둘이서 더블스포일러가 되어서, 최강을 노리는 거야!"],
|
||||
[0, "하츠나", null, 0, null, 63, 61, 65, 0, 160, 300, null, null],
|
||||
[0, "하니에", null, 0, null, 57, 66, 63, 0, 160, 300, null, null],
|
||||
[0, "플랑드르", "환상향/플랑드르.jpg", 0, null, 76, 101, 71, 0, 160, 300, null, null, "쿠욱하고 콰광~이네"],
|
||||
[0, "프랑스인형", null, 0, null, 68, 68, 75, 0, 160, 300, null, null],
|
||||
[0, "파츄리", "환상향/파츄리.jpg", 0, null, 81, 52, 103, 0, 160, 300, null, null, "무큐-"],
|
||||
[0, "파스칼", null, 0, null, 73, 70, 60, 0, 160, 300, null, null],
|
||||
[0, "파브리티스", null, 0, null, 61, 61, 62, 0, 160, 300, null, null],
|
||||
[0, "파르시", "환상향/파르시.jpg", 0, null, 67, 49, 89, 0, 160, 300, null, null, "너한테 원한은 없다만, 내가 널 공격하는 이유는 얼마든지 만들 수 있어."],
|
||||
[0, "토키코", null, 0, null, 60, 59, 88, 0, 160, 300, null, null],
|
||||
[0, "토쿠비", null, 0, null, 77, 77, 72, 0, 160, 300, null, null],
|
||||
[0, "토지코", "환상향/토지코.png", 0, null, 76, 62, 86, 0, 160, 300, null, null, "아이고 이런. 또 하나요?"],
|
||||
[0, "토요히메", "환상향/토요히메.jpg", 0, null, 96, 69, 95, 0, 160, 300, null, null],
|
||||
[0, "토비코", null, 0, null, 72, 58, 56, 0, 160, 300, null, null],
|
||||
[0, "텐시", "환상향/텐시.jpg", 0, null, 81, 89, 71, 0, 160, 300, null, null, "약해! 약해 빠졌어! 그따위로 하늘에 오를 수 있을 거라 꿈도 꾸지 마!"],
|
||||
[0, "텐무", null, 0, null, 68, 73, 56, 0, 160, 300, null, null],
|
||||
[0, "텐구5", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구4", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구3", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구2", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구1", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "테이레이다", "환상향/테이레이다.png", 0, null, 78, 75, 53, 0, 160, 300, null, null, "갑작스럽겠지만, 테스트를 시작하겠어!]"],
|
||||
[0, "테위", "환상향/테위.jpg", 0, null, 82, 32, 79, 0, 160, 300, null, null, "대숲은 사람을 헤매게 하는 대나무의 미로. 헤매는 것은 산사람다운 행위인 거야."],
|
||||
[0, "키쿠리", "환상향/키쿠리.jpg", 0, null, 56, 72, 76, 0, 160, 300, null, null],
|
||||
[0, "키요히메", null, 0, null, 66, 76, 76, 0, 160, 300, null, null],
|
||||
[0, "키스메", "환상향/키스메.jpg", 0, null, 73, 58, 59, 0, 160, 300, null, null, "너희가 떨어뜨린 시체는 이거냐?"],
|
||||
[0, "키나코", null, 0, null, 63, 68, 67, 0, 160, 300, null, null],
|
||||
[0, "클라운피스", "환상향/클라운피스.jpg", 0, null, 89, 80, 77, 0, 160, 300, null, null, "잇츠, 루나틱 타임! 광기의 세계로 어서오세요!"],
|
||||
[0, "쿠스코", null, 0, null, 70, 57, 53, 0, 160, 300, null, null],
|
||||
[0, "쿠루미", "환상향/쿠루미.jpg", 0, null, 70, 65, 68, 0, 160, 300, null, null, "나는 쿠루미. 이 호수의 문지기야."],
|
||||
[0, "쿄코", "환상향/쿄코.jpg", 0, null, 37, 57, 80, 0, 160, 300, null, null, "목소리가 작다!"],
|
||||
[0, "콘가라", "환상향/콘가라.jpg", 0, null, 91, 96, 60, 0, 160, 300, null, null],
|
||||
[0, "코토히메", "환상향/코토히메.jpg", 0, null, 54, 36, 90, 0, 160, 300, null, null, "충격의 새로운 사실! 고대인은 전기를 쓰고 있었다!"],
|
||||
[0, "코코로", "환상향/코코로.jpg", 0, null, 80, 91, 60, 0, 160, 300, null, null, "나와 최강의 칭호를 걸고 싸우자!"],
|
||||
[0, "코카이", null, 0, null, 67, 78, 61, 0, 160, 300, null, null],
|
||||
[0, "코이시", "환상향/코이시.jpg", 0, null, 88, 71, 93, 0, 160, 300, null, null, "네 시체는 지령전 입구에 장식해줄게!"],
|
||||
[0, "코스즈", "환상향/코스즈.jpg", 0, null, 61, 63, 70, 0, 160, 300, null, null, "요괴가 하는 말을 믿으시는 거예요?!"],
|
||||
[0, "코마치", "환상향/코마치.jpg", 0, null, 80, 97, 75, 0, 160, 300, null, null, "더는 어찌할 도리가 없어. 나는 그런 인간은 버릴 거야."],
|
||||
[0, "코노하", null, 0, null, 62, 58, 67, 0, 160, 300, null, null],
|
||||
[0, "코가사", "환상향/코가사.jpg", 0, null, 79, 76, 56, 0, 160, 300, null, null, "됐어. 어차피 요괴는 이렇게 쓸쓸하게 사라져나가는 거니까."],
|
||||
[0, "케이네", "환상향/케이네.jpg", 0, null, 77, 71, 104, 0, 160, 300, null, null, "여기엔 원래부터 아무것도 없었어, 인간도 인간의 마을도 말이야."],
|
||||
[0, "캇파5", null, 0, null, 40, 40, 65, 0, 160, 300, null, null],
|
||||
[0, "캇파4", null, 0, null, 40, 40, 64, 0, 160, 300, null, null],
|
||||
[0, "캇파3", null, 0, null, 40, 40, 63, 0, 160, 300, null, null],
|
||||
[0, "캇파2", null, 0, null, 40, 40, 62, 0, 160, 300, null, null],
|
||||
[0, "캇파1", null, 0, null, 40, 40, 61, 0, 160, 300, null, null],
|
||||
[0, "카스미", null, 0, null, 67, 63, 82, 0, 160, 300, null, null],
|
||||
[0, "카센", "환상향/카센.jpg", 0, null, 72, 103, 71, 0, 160, 300, null, null, "이런 곳에서 전력을 다할 이유가없지."],
|
||||
[0, "카나코", "환상향/카나코.jpg", 0, null, 84, 97, 77, 0, 160, 300, null, null, "나를 부른 이는 누구인가?"],
|
||||
[0, "카나", "환상향/카나.jpg", 0, null, 64, 72, 57, 0, 160, 300, null, null, "아, 아니, 그러니까, 우주인?]"],
|
||||
[0, "카구야", "환상향/카구야.jpg", 0, null, 98, 71, 82, 0, 160, 300, null, null, "내 영원을 다루는 술법으로 모두 깨뜨려 보이겠어."],
|
||||
[0, "카게로", "환상향/카게로.png", 0, null, 78, 88, 68, 0, 160, 300, null, null, "무서워~ 인간 무서워~"],
|
||||
[0, "치유리", "환상향/치유리.jpg", 0, null, 45, 77, 78, 0, 160, 300, null, null, "싸워서 강한 쪽이 이 세계의 치유리라구."],
|
||||
[0, "치르노", "환상향/치르노.jpg", 0, null, 79, 89, 49, 0, 160, 300, null, null, "눈앞에 강적이 있잖아?"],
|
||||
[0, "츠바메", null, 0, null, 71, 80, 58, 0, 160, 300, null, null],
|
||||
[0, "첸", "환상향/첸.jpg", 0, null, 48, 70, 70, 0, 160, 300, null, null, "그건 그렇고, 마요이가에 어서와"],
|
||||
[0, "지벤", null, 0, null, 85, 67, 66, 0, 160, 300, null, null],
|
||||
[0, "지귀", null, 0, null, 79, 67, 69, 0, 160, 300, null, null],
|
||||
[0, "조온", null, 0, null, 83, 74, 96, 0, 160, 300, null, null, "우리가 왜 최흉최악의 자매인지 그 몸으로 이해해라!"],
|
||||
[0, "자넷", null, 0, null, 60, 59, 62, 0, 160, 300, null, null],
|
||||
[0, "이포니아", null, 0, null, 61, 62, 61, 0, 160, 300, null, null],
|
||||
[0, "이쿠", "환상향/이쿠.jpg", 0, null, 72, 72, 94, 0, 160, 300, null, null, "조금 벌을 받으실 필요가 있을지도 모르겠군요."],
|
||||
[0, "이치요우", null, 0, null, 70, 73, 58, 0, 160, 300, null, null],
|
||||
[0, "이치린", "환상향/이치린.jpg", 0, null, 86, 55, 88, 0, 160, 300, null, null, "평화롭게 살고있으니까 괜찮잖아. 너, 요괴를 죽여도 아무렇지 않아?"],
|
||||
[0, "이슈아", null, 0, null, 67, 76, 78, 0, 160, 300, null, null],
|
||||
[0, "이나코", null, 0, null, 56, 35, 63, 0, 160, 300, null, null],
|
||||
[0, "유키", "환상향/유키.jpg", 0, null, 72, 77, 61, 0, 160, 300, null, null, "우리 둘을 쓰러뜨릴 수 있을 거라고 생각해?"],
|
||||
[0, "유카리", "환상향/유카리.jpg", 0, null, 87, 76, 96, 0, 160, 300, null, null, "아름답고 잔혹하게 이 대지에서 사라져라!"],
|
||||
[0, "유카", "환상향/유카.jpg", 0, null, 94, 88, 70, 0, 160, 300, null, null, "아 그래, 마침 60년 전이었네. 아아...... 그래, 벌써 그런 시기구나...... 60년인가. 회귀할 때구나."],
|
||||
[0, "유유코", "환상향/유유코.jpg", 0, null, 97, 80, 81, 0, 160, 300, null, null, "새는 잔뼈가 많아서 싫어."],
|
||||
[0, "유메코", "환상향/유메코.jpg", 0, null, 72, 103, 73, 0, 160, 300, null, null, "우리들을 모욕한 죄는 죽음으로 밖에 갚을 수 없다!!"],
|
||||
[0, "유메미", "환상향/유메미.jpg", 0, null, 93, 72, 91, 0, 160, 300, null, null, "기합 넣어! 죽어 버렸다간 데리고 돌아갈 수 없으니까."],
|
||||
[0, "유기", "환상향/유기.jpg", 0, null, 71, 104, 72, 0, 160, 300, null, null, "네가 강하기만 하다면 나야 아무 군소리도 안해. 어떤 목적으로 여기에 왔건 간에."],
|
||||
[0, "유겐마간", "환상향/유겐마간.jpg", 0, null, 80, 80, 50, 0, 160, 300, null, null],
|
||||
[0, "우카", null, 0, null, 60, 73, 82, 0, 160, 300, null, null],
|
||||
[0, "우츠호", "환상향/우츠호.jpg", 0, null, 73, 105, 68, 0, 160, 300, null, null, "이물질 발견! 핵융합로의 이물질 혼입은 일단 반응을 정지하고, 즉각 이물질을 제거하라."],
|
||||
[0, "요정5", null, 0, null, 55, 60, 35, 0, 160, 300, null, null],
|
||||
[0, "요정4", null, 0, null, 55, 59, 34, 0, 160, 300, null, null],
|
||||
[0, "요정3", null, 0, null, 55, 58, 33, 0, 160, 300, null, null],
|
||||
[0, "요정2", null, 0, null, 55, 57, 32, 0, 160, 300, null, null],
|
||||
[0, "요정1", null, 0, null, 55, 56, 31, 0, 160, 300, null, null],
|
||||
[0, "요우무", "환상향/요우무.jpg", 0, null, 81, 89, 71, 0, 160, 300, null, null, "...요괴가 담금질한 이 누관검에, 벨 수 없는 것 따위, 별로 없어!"],
|
||||
[0, "요시카", "환상향/요시카.jpg", 0, null, 84, 78, 61, 0, 160, 300, null, null, "오~지~마~!"],
|
||||
[0, "요리히메", "환상향/요리히메.jpg", 0, null, 90, 98, 74, 0, 160, 300, null, null],
|
||||
[0, "와카챠나두", null, 0, null, 62, 61, 68, 0, 160, 300, null, null],
|
||||
[0, "와카사기", "환상향/와카사기.png", 0, null, 68, 57, 79, 0, 160, 300, null, null, "슬슬 우리요괴가 활약할 차례야!"],
|
||||
[0, "오토히메", null, 0, null, 80, 60, 76, 0, 160, 300, null, null],
|
||||
[0, "오키나", "환상향/오키나.png", 0, null, 87, 87, 86, 0, 160, 300, null, null, "요괴가 아니라 신이에요~"],
|
||||
[0, "오모이카네", null, 0, null, 66, 52, 86, 0, 160, 300, null, null],
|
||||
[0, "오린", "환상향/오린.jpg", 0, null, 87, 84, 77, 0, 160, 300, null, null, "시체가 갖고 싶으니까, 역시 내가 언니를 처리해야겠네!"],
|
||||
[0, "오렌지", "환상향/오렌지.jpg", 0, null, 72, 52, 68, 0, 160, 300, null, null, "아하하, 1면 보스니까라고 얕보지 말라구!"],
|
||||
[0, "오니5", null, 0, null, 55, 65, 40, 0, 160, 300, null, null],
|
||||
[0, "오니4", null, 0, null, 54, 64, 40, 0, 160, 300, null, null],
|
||||
[0, "오니3", null, 0, null, 53, 63, 40, 0, 160, 300, null, null],
|
||||
[0, "오니2", null, 0, null, 52, 62, 40, 0, 160, 300, null, null],
|
||||
[0, "오니1", null, 0, null, 51, 61, 40, 0, 160, 300, null, null],
|
||||
[0, "엘핀민트", null, 0, null, 71, 71, 61, 0, 160, 300, null, null],
|
||||
[0, "엘리스", "환상향/엘리스.jpg", 0, null, 55, 69, 88, 0, 160, 300, null, null],
|
||||
[0, "엘리", "환상향/엘리.jpg", 0, null, 86, 83, 66, 0, 160, 300, null, null, "싸운 거 오랜만인걸 뭐."],
|
||||
[0, "엘렌", "환상향/엘렌.jpg", 0, null, 67, 62, 71, 0, 160, 300, null, null, "나는, 엘렌. 폭신폭신 엘렌이야."],
|
||||
[0, "에이린", "환상향/에이린.jpg", 0, null, 72, 76, 105, 0, 160, 300, null, null, "아하하. 너희는 어리석구나."],
|
||||
[0, "야토", null, 0, null, 72, 83, 66, 0, 160, 300, null, null],
|
||||
[0, "야츠하시", "환상향/야츠하시.png", 0, null, 69, 58, 73, 0, 160, 300, null, null, "훗훗후, 반역자에겐 어떤 수단이든 써도 된다면서?"],
|
||||
[0, "야마메", "환상향/야마메.jpg", 0, null, 75, 65, 77, 0, 160, 300, null, null, "지저에 떨어진 요괴의 힘을 보고 싶은 모양이구나."],
|
||||
[0, "앨리스", "환상향/앨리스.jpg", 0, null, 81, 63, 99, 0, 160, 300, null, null, "그런 소리 하니까 바보 취급당하는 거야. 탄막은 브레인. 상식이야."],
|
||||
[0, "안자", null, 0, null, 67, 61, 83, 0, 160, 300, null, null],
|
||||
[0, "안", null, 0, null, 68, 51, 67, 0, 160, 300, null, null],
|
||||
[0, "아큐", "환상향/아큐.jpg", 0, null, 72, 30, 82, 0, 160, 300, null, null, "나는 이래뵈도 히에다가의 당주로써 환상향의 서기라는 역할을 지닌 유서깊은 집안의 사람이야."],
|
||||
[0, "아즈마", null, 0, null, 78, 81, 64, 0, 160, 300, null, null],
|
||||
[0, "아운", "환상향/아운.png", 0, null, 78, 87, 65, 0, 160, 300, null, null, "신사를 지키는 수호신으로서 말이야!"],
|
||||
[0, "아야", "환상향/아야.jpg", 0, null, 73, 93, 71, 0, 160, 300, null, null, "깨끗하고 올바른 샤메이마루입니다."],
|
||||
[0, "아리오슈", null, 0, null, 56, 70, 67, 0, 160, 300, null, null],
|
||||
[0, "써니", "환상향/써니.jpg", 0, null, 75, 75, 60, 0, 160, 300, null, null, "어라, 혼자서도 최강이라며?"],
|
||||
[0, "쌍자", null, 0, null, 63, 82, 71, 0, 160, 300, null, null],
|
||||
[0, "쌍사", null, 0, null, 62, 73, 81, 0, 160, 300, null, null],
|
||||
[0, "신키", "환상향/신키.jpg", 0, null, 96, 92, 73, 0, 160, 300, null, null, "나의 세계에서 저지른 죄값은 크지. 용서할 리가 없잖아."],
|
||||
[0, "신묘마루", "환상향/신묘마루.png", 0, null, 85, 68, 88, 0, 160, 300, null, null, "누─구?"],
|
||||
[0, "시키에이키", "환상향/시키에이키.jpg", 0, null, 84, 77, 98, 0, 160, 300, null, null, "보랏빛 벚꽃은 죄 깊은 인간의 영혼이 깃드는 꽃. 너는 그 보랏빛 벚꽃이 떨어져내리는 밑에서, 단죄하거라!"],
|
||||
[0, "시키에이카", null, 0, null, 71, 60, 77, 0, 160, 300, null, null],
|
||||
[0, "시즈하", "환상향/시즈하.jpg", 0, null, 79, 55, 62, 0, 160, 300, null, null],
|
||||
[0, "시온", null, 0, null, 80, 97, 76, 0, 160, 300, null, null, "나도 좋아서 가난하게 살고 있는 게 아닌데~"],
|
||||
[0, "스타", "환상향/스타.jpg", 0, null, 70, 60, 75, 0, 160, 300, null, null, "그래, 이 비겁한 녀석아!"],
|
||||
[0, "스이카", "환상향/스이카.jpg", 0, null, 74, 102, 66, 0, 160, 300, null, null, "거짓말은 인간만 하는 거야!"],
|
||||
[0, "스와코", "환상향/스와코.jpg", 0, null, 95, 81, 81, 0, 160, 300, null, null, "아~우~~"],
|
||||
[0, "스씨", null, 0, null, 66, 63, 66, 0, 160, 300, null, null],
|
||||
[0, "스미레코", "환상향/스미레코.jpg", 0, null, 81, 63, 88, 0, 160, 300, null, null, "히가시후카미 고등학교 1학년, 우사미 스미레코. 우는 아이도 뚝 그치는 진짜 초능력자야."],
|
||||
[0, "순호", "환상향/순호.jpg", 0, null, 77, 102, 79, 0, 160, 300, null, null, "지금의 너로썬 내 힘 앞에선 무력, 절대적으로 무력하도다!"],
|
||||
[0, "쇼", "환상향/쇼.jpg", 0, null, 75, 75, 95, 0, 160, 300, null, null, "그것이 당신의 정의라는 거라면, 그것도 좋지요."],
|
||||
[0, "소악마", "환상향/소악마.jpg", 0, null, 50, 72, 67, 0, 160, 300, null, null],
|
||||
[0, "셰퍼드", null, 0, null, 61, 58, 56, 0, 160, 300, null, null],
|
||||
[0, "센고", null, 0, null, 83, 56, 79, 0, 160, 300, null, null],
|
||||
[0, "센", null, 0, null, 67, 66, 28, 0, 160, 300, null, null],
|
||||
[0, "세키반키", "환상향/세키반키.png", 0, null, 68, 75, 71, 0, 160, 300, null, null, "인간은 누구든지 나를 무서워하지!"],
|
||||
[0, "세츠조", null, 0, null, 58, 80, 58, 0, 160, 300, null, null],
|
||||
[0, "세이자", "환상향/세이자.png", 0, null, 82, 94, 69, 0, 160, 300, null, null, "내 이름은 세이자. 뼛속까지 아마노자쿠다!"],
|
||||
[0, "세이란", "환상향/세이란.jpg", 0, null, 71, 77, 51, 0, 160, 300, null, null, "뭐, 이것도 일이야, 알지? 그러니 내게 여기서 얌전히 당해 줘. 응?"],
|
||||
[0, "샤리트", null, 0, null, 68, 62, 62, 0, 160, 300, null, null],
|
||||
[0, "상해인형", null, 0, null, 74, 69, 69, 0, 160, 300, null, null],
|
||||
[0, "상아", null, 0, null, 84, 84, 84, 0, 160, 300, null, null],
|
||||
[0, "사토리", "환상향/사토리.jpg", 0, null, 81, 57, 84, 0, 160, 300, null, null, "제게는 보여요. 당신이 마음속에 그리고 있는 탄막이!"],
|
||||
[0, "사토노", "환상향/사토노.png", 0, null, 71, 76, 77, 0, 160, 300, null, null, "봐 주진 않겠지만 죽으면 죽일꺼니까 말야―!"],
|
||||
[0, "사쿠야", "환상향/사쿠야.jpg", 0, null, 87, 89, 78, 0, 160, 300, null, null, "당신의 시간 또한 나의 것"],
|
||||
[0, "사샤", null, 0, null, 74, 48, 78, 0, 160, 300, null, null],
|
||||
[0, "사리엘", "환상향/사리엘.jpg", 0, null, 85, 68, 102, 0, 160, 300, null, null, "죽는다면 모두 함께"],
|
||||
[0, "사라카", null, 0, null, 60, 74, 63, 0, 160, 300, null, null],
|
||||
[0, "사라", "환상향/사라.jpg", 0, null, 76, 78, 36, 0, 160, 300, null, null, "싸우는 건 재미있지만, 지는 건 재미없어."],
|
||||
[0, "사나에", "환상향/사나에.jpg", 0, null, 87, 71, 85, 0, 160, 300, null, null, "지금은, 바깥 세계는 환경을 지키라든가 경기 대책이 어떻다든가, 바보 같이 뭘 위해 태어난 건지 생각할 수 없는 사람 뿐."],
|
||||
[0, "사구메", "환상향/사구메.jpg", 0, null, 84, 97, 71, 0, 160, 300, null, null, "......그런건 아냐."],
|
||||
[0, "벤벤", "환상향/벤벤.png", 0, null, 69, 59, 75, 0, 160, 300, null, null, "어딜 봐도 츠쿠모가미잖아."],
|
||||
[0, "뱌쿠렌", "환상향/뱌쿠렌.jpg", 0, null, 83, 90, 82, 0, 160, 300, null, null, "아아, 법의 세계에 빛이 가득해."],
|
||||
[0, "미호", null, 0, null, 85, 86, 62, 0, 160, 300, null, null],
|
||||
[0, "미하나", null, 0, null, 76, 67, 84, 0, 160, 300, null, null],
|
||||
[0, "미토리", null, 0, null, 57, 56, 62, 0, 160, 300, null, null],
|
||||
[0, "미코토", null, 0, null, 73, 82, 82, 0, 160, 300, null, null],
|
||||
[0, "미코", "환상향/미코.png", 0, null, 87, 72, 97, 0, 160, 300, null, null, "장난은 끝이다!"],
|
||||
[0, "미요", null, 0, null, 73, 66, 58, 0, 160, 300, null, null],
|
||||
[0, "미스티아", "환상향/미스티아.jpg", 0, null, 65, 82, 12, 0, 160, 300, null, null, "자, 잠깐 기다려~!"],
|
||||
[0, "미셸", null, 0, null, 70, 69, 72, 0, 160, 300, null, null],
|
||||
[0, "미샨드라", null, 0, null, 80, 63, 82, 0, 160, 300, null, null],
|
||||
[0, "미샤구지", null, 0, null, 48, 99, 59, 0, 160, 300, null, null],
|
||||
[0, "미마", "환상향/미마.jpg", 0, null, 75, 90, 93, 0, 160, 300, null, null, "나도 인간계의 신이야. (거짓말)"],
|
||||
[0, "미노리코", "환상향/미노리코.jpg", 0, null, 71, 58, 74, 0, 160, 300, null, null, "갓 수확한 고구마는 나의 향수. 무녀가 먹게 놔둘 줄 알고!"],
|
||||
[0, "미나유", null, 0, null, 72, 49, 84, 0, 160, 300, null, null],
|
||||
[0, "무무무", null, 0, null, 70, 77, 57, 0, 160, 300, null, null],
|
||||
[0, "무라사", "환상향/무라사.jpg", 0, null, 76, 82, 65, 0, 160, 300, null, null, "이 세상에 미련이 남으신 분은 승선할 수 없습니다만 당신은 어떠신가요?"],
|
||||
[0, "무게츠", "환상향/무게츠.jpg", 0, null, 76, 95, 68, 0, 160, 300, null, null, "난 무게츠. 그리고, 여긴 나의 세계."],
|
||||
[0, "묘렌", null, 0, null, 77, 78, 79, 0, 160, 300, null, null],
|
||||
[0, "모코우", "환상향/모코우.jpg", 0, null, 83, 99, 69, 0, 160, 300, null, null, "너희들도 한번 영원의 고륜을 고민해 보는 게 좋아!"],
|
||||
[0, "모미지", "환상향/모미지.jpg", 0, null, 83, 68, 66, 0, 160, 300, null, null, "높은 분들은 저희 일반 텐구보다 훨씬 강하니까, 경비 같은 건 전혀 필요하지 않을 것 같은데."],
|
||||
[0, "모모히메", null, 0, null, 75, 68, 72, 0, 160, 300, null, null],
|
||||
[0, "모모", null, 0, null, 62, 62, 71, 0, 160, 300, null, null],
|
||||
[0, "메이즈", null, 0, null, 70, 40, 76, 0, 160, 300, null, null],
|
||||
[0, "메이벨", null, 0, null, 71, 74, 56, 0, 160, 300, null, null],
|
||||
[0, "메이라", "환상향/메이라.jpg", 0, null, 65, 82, 36, 0, 160, 300, null, null, "내가 이기면 하쿠레이의 힘은 내가 가져가겠어!"],
|
||||
[0, "메를린", "환상향/메를린.jpg", 0, null, 73, 67, 70, 0, 160, 300, null, null, "내 연주를 듣고서, 무사했던 식량은 없지."],
|
||||
[0, "메디슨", "환상향/메디슨.jpg", 0, null, 73, 58, 71, 0, 160, 300, null, null, "콘파로, 콘파로, 독이여 모여라~"],
|
||||
[0, "메구미", null, 0, null, 83, 77, 74, 0, 160, 300, null, null],
|
||||
[0, "마이", "환상향/마이.jpg", 0, null, 72, 60, 75, 0, 160, 300, null, null, "내가 안내할게..."],
|
||||
[0, "마을사람5", null, 0, null, 65, 35, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람4", null, 0, null, 64, 34, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람3", null, 0, null, 63, 33, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람2", null, 0, null, 62, 32, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람1", null, 0, null, 61, 31, 50, 0, 160, 300, null, null],
|
||||
[0, "마미조", "환상향/마미조.png", 0, null, 77, 77, 97, 0, 160, 300, null, null, "뭔가 고민이 있는 모양이구먼. 야그나 함 들어 보자."],
|
||||
[0, "마리우스", null, 0, null, 67, 87, 66, 0, 160, 300, null, null],
|
||||
[0, "마리사", "환상향/마리사.jpg", 0, null, 83, 91, 78, 0, 160, 300, null, null, "아~? 탄막에 두뇌? 바보 아냐? 탄막은 파워야."],
|
||||
[0, "마나", null, 0, null, 73, 75, 72, 0, 160, 300, null, null],
|
||||
[0, "링고", "환상향/링고.jpg", 0, null, 54, 76, 71, 0, 160, 300, null, null, "옛날의 극락정토는 이제 보이는 그림자도 없다고 생각해."],
|
||||
[0, "릴리", "환상향/릴리.jpg", 0, null, 37, 63, 68, 0, 160, 300, null, null, "봄이에요~"],
|
||||
[0, "린네", null, 0, null, 83, 66, 83, 0, 160, 300, null, null],
|
||||
[0, "리코", null, 0, null, 68, 60, 76, 0, 160, 300, null, null],
|
||||
[0, "리카코", "환상향/리카코.jpg", 0, null, 76, 71, 100, 0, 160, 300, null, null, "왜 마법 따위에 흥미를 가지기나 하지?"],
|
||||
[0, "리카", "환상향/리카.jpg", 0, null, 61, 63, 75, 0, 160, 300, null, null, "가는 거예요!!"],
|
||||
[0, "리리카", "환상향/리리카.jpg", 0, null, 57, 66, 83, 0, 160, 300, null, null, "당신은 노래를 부르지. 난 손을 쓰지 않고 연주를 해. 장기전으로 가면 내 쪽이 세다고?"],
|
||||
[0, "리락", null, 0, null, 74, 54, 62, 0, 160, 300, null, null],
|
||||
[0, "리글", "환상향/리글.jpg", 0, null, 85, 64, 51, 0, 160, 300, null, null, "달이 보이는 밤에는, 즐기지 않아선 안 되는 거 아닐까."],
|
||||
[0, "루이즈", "환상향/루이즈.jpg", 0, null, 59, 57, 72, 0, 160, 300, null, null, "뭐, 마계는 좋은 곳이니, 느긋하게 관광이라도 하도록 해☆"],
|
||||
[0, "루미아", "환상향/루미아.jpg", 0, null, 79, 70, 56, 0, 160, 300, null, null, "그런 건가~"],
|
||||
[0, "루리", null, 0, null, 66, 66, 62, 0, 160, 300, null, null],
|
||||
[0, "루나사", "환상향/루나사.jpg", 0, null, 76, 77, 50, 0, 160, 300, null, null, "넌 슬픈 처지에서 태어난 경우야. 들떠있을 때가 아니지."],
|
||||
[0, "루나", "환상향/루나.jpg", 0, null, 67, 74, 74, 0, 160, 300, null, null, "빨라고? 네녀석이 빨아라!"],
|
||||
[0, "레티", "환상향/레티.jpg", 0, null, 60, 79, 49, 0, 160, 300, null, null, "흑막~"],
|
||||
[0, "레이센", "환상향/레이센.jpg", 0, null, 79, 78, 89, 0, 160, 300, null, null, "이 앞에 기다리고 있는 게 악몽이라 해도, 그래도 나는 가야만 해."],
|
||||
[0, "레이무", "환상향/레이무.jpg", 0, null, 90, 83, 82, 0, 160, 300, null, null, "인간을 쉽사리 죽게 내버려 둘까 보냐!"],
|
||||
[0, "레이라", null, 0, null, 66, 67, 51, 0, 160, 300, null, null],
|
||||
[0, "레밀리아", "환상향/레밀리아.jpg", 0, null, 93, 94, 70, 0, 160, 300, null, null, "당신은 이제껏 먹어 온 빵이 몇 개인지 알고 있어?"],
|
||||
[0, "런던인형", null, 0, null, 64, 78, 62, 0, 160, 300, null, null],
|
||||
[0, "란", "환상향/란.jpg", 0, null, 71, 79, 101, 0, 160, 300, null, null, "흠. 첸을 괴롭힌건 너지?"],
|
||||
[0, "라쿠", null, 0, null, 71, 52, 69, 0, 160, 300, null, null],
|
||||
[0, "라이코", "환상향/라이코.png", 0, null, 80, 66, 91, 0, 160, 300, null, null, "누구라도 자기 목숨을 부지하고 싶으면 노력을 아끼지 않잖아?"],
|
||||
[0, "라바", "환상향/라바.png", 0, null, 69, 74, 54, 0, 160, 300, null, null, "지금이라면 신세계의 신이라도 될 것 같은 기분이야!"],
|
||||
[0, "도레미", "환상향/도레미.jpg", 0, null, 67, 63, 88, 0, 160, 300, null, null, "맨몸!? 혹시 맨몸!?"],
|
||||
[0, "대요정", "환상향/대요정.jpg", 0, null, 60, 56, 79, 0, 160, 300, null, null],
|
||||
[0, "달토끼5", null, 0, null, 35, 55, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼4", null, 0, null, 34, 54, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼3", null, 0, null, 33, 53, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼2", null, 0, null, 32, 52, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼1", null, 0, null, 31, 51, 55, 0, 160, 300, null, null],
|
||||
[0, "니토리", "환상향/니토리.jpg", 0, null, 68, 68, 76, 0, 160, 300, null, null, "축제 땐 생선이 잘 팔리지. 인간에게 어업권을 뺏어서 독점하면 떼돈 벌겠네!"],
|
||||
[0, "노바", null, 0, null, 74, 56, 82, 0, 160, 300, null, null],
|
||||
[0, "노로이코", "환상향/노로이코.jpg", 0, null, 56, 61, 65, 0, 160, 300, null, null],
|
||||
[0, "네즈", null, 0, null, 76, 71, 40, 0, 160, 300, null, null],
|
||||
[0, "네무노", "환상향/네무노.png", 0, null, 78, 40, 67, 0, 160, 300, null, null, "자자, 차라도 마시고 가라."],
|
||||
[0, "나즈린", "환상향/나즈린.jpg", 0, null, 76, 63, 64, 0, 160, 300, null, null, "미안한데, 쥐를 얕보다간 죽어."],
|
||||
[0, "나루코", null, 0, null, 68, 40, 70, 0, 160, 300, null, null],
|
||||
[0, "나루미", "환상향/나루미.png", 0, null, 84, 72, 78, 0, 160, 300, null, null, "에? 뭐야 그거 무서워"],
|
||||
[0, "구유카", "환상향/구유카.jpg", 0, null, 84, 85, 85, 0, 160, 300, null, null, "신이라 해도, 힘이야말로 전부야!"],
|
||||
[0, "구앨리스", "환상향/구앨리스.jpg", 0, null, 80, 80, 90, 0, 160, 300, null, null, "궁극의 마법으로 널 해치워 주겠어!!"],
|
||||
[0, "구마리사", "환상향/구마리사.jpg", 0, null, 80, 90, 80, 0, 160, 300, null, null, "오케이~, 여기는 마리사에게 맡겨줘."],
|
||||
[0, "구레이무", "환상향/구레이무.jpg", 0, null, 90, 80, 80, 0, 160, 300, null, null, "문답무용이야!!"],
|
||||
[0, "곽청아", "환상향/곽청아.png", 0, null, 72, 77, 87, 0, 160, 300, null, null, "네~ 썩어서 귀엽죠?"],
|
||||
[0, "골리앗", null, 0, null, 72, 78, 58, 0, 160, 300, null, null],
|
||||
[0, "겐지", null, 0, null, 70, 70, 70, 0, 160, 300, null, null],
|
||||
[0, "겐게츠", "환상향/겐게츠.jpg", 0, null, 83, 70, 94, 0, 160, 300, null, null, "얕보지 마. 우린, 둘이서 한 사람 몫이니까.…"],
|
||||
[0, "강림", null, 0, null, 84, 76, 57, 0, 160, 300, null, null]
|
||||
[0,"히카리코",null,0,null,56,66,21,0,160,300,null,null],
|
||||
[0,"히메미코",null,0,null,68,78,65,0,160,300,null,null],
|
||||
[0,"히나",null,0,null,66,63,83,0,160,300,null,null,"온갖 재액이 닥쳐올 거야. 인간을 지키기 위해서라도 절대 보내주지 않겠어!"],
|
||||
[0,"후토",null,0,null,84,69,93,0,160,300,null,null,"불이라도 지를까."],
|
||||
[0,"홍미령",null,0,null,85,79,63,0,160,300,null,null,"젠장, 배수진이다!"],
|
||||
[0,"호쥬누에",null,0,null,85,95,72,0,160,300,null,null,"자아, 나의 정체를 알아버린 당신을 죽여버리고, 정체불명으로 돌아가야겠어."],
|
||||
[0,"호라이인형",null,0,null,66,71,73,0,160,300,null,null],
|
||||
[0,"헤카티아",null,0,null,85,84,94,0,160,300,null,null,"꿈의 세계에선 무방비하니까 간단한 일이었지."],
|
||||
[0,"하타테",null,0,null,30,88,70,0,160,300,null,null,"둘이서 더블스포일러가 되어서, 최강을 노리는 거야!"],
|
||||
[0,"하츠나",null,0,null,63,61,65,0,160,300,null,null],
|
||||
[0,"하니에",null,0,null,57,66,63,0,160,300,null,null],
|
||||
[0,"플랑드르",null,0,null,76,101,71,0,160,300,null,null,"쿠욱하고 콰광~이네"],
|
||||
[0,"프랑스인형",null,0,null,68,68,75,0,160,300,null,null],
|
||||
[0,"파츄리",null,0,null,81,52,103,0,160,300,null,null,"무큐-"],
|
||||
[0,"파스칼",null,0,null,73,70,60,0,160,300,null,null],
|
||||
[0,"파브리티스",null,0,null,61,61,62,0,160,300,null,null],
|
||||
[0,"파르시",null,0,null,67,49,89,0,160,300,null,null,"너한테 원한은 없다만, 내가 널 공격하는 이유는 얼마든지 만들 수 있어."],
|
||||
[0,"토키코",null,0,null,60,59,88,0,160,300,null,null],
|
||||
[0,"토쿠비",null,0,null,77,77,72,0,160,300,null,null],
|
||||
[0,"토지코",null,0,null,76,62,86,0,160,300,null,null,"아이고 이런. 또 하나요?"],
|
||||
[0,"토요히메",null,0,null,96,69,95,0,160,300,null,null],
|
||||
[0,"토비코",null,0,null,72,58,56,0,160,300,null,null],
|
||||
[0,"텐시",null,0,null,81,89,71,0,160,300,null,null,"약해! 약해 빠졌어! 그따위로 하늘에 오를 수 있을 거라 꿈도 꾸지 마!"],
|
||||
[0,"텐무",null,0,null,68,73,56,0,160,300,null,null],
|
||||
[0,"텐구5",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구4",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구3",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구2",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구1",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"테이레이다",null,0,null,78,75,53,0,160,300,null,null,"갑작스럽겠지만, 테스트를 시작하겠어!]"],
|
||||
[0,"테위",null,0,null,82,32,79,0,160,300,null,null,"대숲은 사람을 헤매게 하는 대나무의 미로. 헤매는 것은 산사람다운 행위인 거야."],
|
||||
[0,"키쿠리",null,0,null,56,72,76,0,160,300,null,null],
|
||||
[0,"키요히메",null,0,null,66,76,76,0,160,300,null,null],
|
||||
[0,"키스메",null,0,null,73,58,59,0,160,300,null,null,"너희가 떨어뜨린 시체는 이거냐?"],
|
||||
[0,"키나코",null,0,null,63,68,67,0,160,300,null,null],
|
||||
[0,"클라운피스",null,0,null,89,80,77,0,160,300,null,null,"잇츠, 루나틱 타임! 광기의 세계로 어서오세요!"],
|
||||
[0,"쿠스코",null,0,null,70,57,53,0,160,300,null,null],
|
||||
[0,"쿠루미",null,0,null,70,65,68,0,160,300,null,null,"나는 쿠루미. 이 호수의 문지기야."],
|
||||
[0,"쿄코",null,0,null,37,57,80,0,160,300,null,null,"목소리가 작다!"],
|
||||
[0,"콘가라",null,0,null,91,96,60,0,160,300,null,null],
|
||||
[0,"코토히메",null,0,null,54,36,90,0,160,300,null,null,"충격의 새로운 사실! 고대인은 전기를 쓰고 있었다!"],
|
||||
[0,"코코로",null,0,null,80,91,60,0,160,300,null,null,"나와 최강의 칭호를 걸고 싸우자!"],
|
||||
[0,"코카이",null,0,null,67,78,61,0,160,300,null,null],
|
||||
[0,"코이시",null,0,null,88,71,93,0,160,300,null,null,"네 시체는 지령전 입구에 장식해줄게!"],
|
||||
[0,"코스즈",null,0,null,61,63,70,0,160,300,null,null,"요괴가 하는 말을 믿으시는 거예요?!"],
|
||||
[0,"코마치",null,0,null,80,97,75,0,160,300,null,null,"더는 어찌할 도리가 없어. 나는 그런 인간은 버릴 거야."],
|
||||
[0,"코노하",null,0,null,62,58,67,0,160,300,null,null],
|
||||
[0,"코가사",null,0,null,79,76,56,0,160,300,null,null,"됐어. 어차피 요괴는 이렇게 쓸쓸하게 사라져나가는 거니까."],
|
||||
[0,"케이네",null,0,null,77,71,104,0,160,300,null,null,"여기엔 원래부터 아무것도 없었어, 인간도 인간의 마을도 말이야."],
|
||||
[0,"캇파5",null,0,null,40,40,65,0,160,300,null,null],
|
||||
[0,"캇파4",null,0,null,40,40,64,0,160,300,null,null],
|
||||
[0,"캇파3",null,0,null,40,40,63,0,160,300,null,null],
|
||||
[0,"캇파2",null,0,null,40,40,62,0,160,300,null,null],
|
||||
[0,"캇파1",null,0,null,40,40,61,0,160,300,null,null],
|
||||
[0,"카스미",null,0,null,67,63,82,0,160,300,null,null],
|
||||
[0,"카센",null,0,null,72,103,71,0,160,300,null,null,"이런 곳에서 전력을 다할 이유가없지."],
|
||||
[0,"카나코",null,0,null,84,97,77,0,160,300,null,null,"나를 부른 이는 누구인가?"],
|
||||
[0,"카나",null,0,null,64,72,57,0,160,300,null,null,"아, 아니, 그러니까, 우주인?]"],
|
||||
[0,"카구야",null,0,null,98,71,82,0,160,300,null,null,"내 영원을 다루는 술법으로 모두 깨뜨려 보이겠어."],
|
||||
[0,"카게로",null,0,null,78,88,68,0,160,300,null,null,"무서워~ 인간 무서워~"],
|
||||
[0,"치유리",null,0,null,45,77,78,0,160,300,null,null,"싸워서 강한 쪽이 이 세계의 치유리라구."],
|
||||
[0,"치르노",null,0,null,79,89,49,0,160,300,null,null,"눈앞에 강적이 있잖아?"],
|
||||
[0,"츠바메",null,0,null,71,80,58,0,160,300,null,null],
|
||||
[0,"첸",null,0,null,48,70,70,0,160,300,null,null,"그건 그렇고, 마요이가에 어서와"],
|
||||
[0,"지벤",null,0,null,85,67,66,0,160,300,null,null],
|
||||
[0,"지귀",null,0,null,79,67,69,0,160,300,null,null],
|
||||
[0,"조온",null,0,null,83,74,96,0,160,300,null,null,"우리가 왜 최흉최악의 자매인지 그 몸으로 이해해라!"],
|
||||
[0,"자넷",null,0,null,60,59,62,0,160,300,null,null],
|
||||
[0,"이포니아",null,0,null,61,62,61,0,160,300,null,null],
|
||||
[0,"이쿠",null,0,null,72,72,94,0,160,300,null,null,"조금 벌을 받으실 필요가 있을지도 모르겠군요."],
|
||||
[0,"이치요우",null,0,null,70,73,58,0,160,300,null,null],
|
||||
[0,"이치린",null,0,null,86,55,88,0,160,300,null,null,"평화롭게 살고있으니까 괜찮잖아. 너, 요괴를 죽여도 아무렇지 않아?"],
|
||||
[0,"이슈아",null,0,null,67,76,78,0,160,300,null,null],
|
||||
[0,"이나코",null,0,null,56,35,63,0,160,300,null,null],
|
||||
[0,"유키",null,0,null,72,77,61,0,160,300,null,null,"우리 둘을 쓰러뜨릴 수 있을 거라고 생각해?"],
|
||||
[0,"유카리",null,0,null,87,76,96,0,160,300,null,null,"아름답고 잔혹하게 이 대지에서 사라져라!"],
|
||||
[0,"유카",null,0,null,94,88,70,0,160,300,null,null,"아 그래, 마침 60년 전이었네. 아아...... 그래, 벌써 그런 시기구나...... 60년인가. 회귀할 때구나."],
|
||||
[0,"유유코",null,0,null,97,80,81,0,160,300,null,null,"새는 잔뼈가 많아서 싫어."],
|
||||
[0,"유메코",null,0,null,72,103,73,0,160,300,null,null,"우리들을 모욕한 죄는 죽음으로 밖에 갚을 수 없다!!"],
|
||||
[0,"유메미",null,0,null,93,72,91,0,160,300,null,null,"기합 넣어! 죽어 버렸다간 데리고 돌아갈 수 없으니까."],
|
||||
[0,"유기",null,0,null,71,104,72,0,160,300,null,null,"네가 강하기만 하다면 나야 아무 군소리도 안해. 어떤 목적으로 여기에 왔건 간에."],
|
||||
[0,"유겐마간",null,0,null,80,80,50,0,160,300,null,null],
|
||||
[0,"우카",null,0,null,60,73,82,0,160,300,null,null],
|
||||
[0,"우츠호",null,0,null,73,105,68,0,160,300,null,null,"이물질 발견! 핵융합로의 이물질 혼입은 일단 반응을 정지하고, 즉각 이물질을 제거하라."],
|
||||
[0,"요정5",null,0,null,55,60,35,0,160,300,null,null],
|
||||
[0,"요정4",null,0,null,55,59,34,0,160,300,null,null],
|
||||
[0,"요정3",null,0,null,55,58,33,0,160,300,null,null],
|
||||
[0,"요정2",null,0,null,55,57,32,0,160,300,null,null],
|
||||
[0,"요정1",null,0,null,55,56,31,0,160,300,null,null],
|
||||
[0,"요우무",null,0,null,81,89,71,0,160,300,null,null,"...요괴가 담금질한 이 누관검에, 벨 수 없는 것 따위, 별로 없어!"],
|
||||
[0,"요시카",null,0,null,84,78,61,0,160,300,null,null,"오~지~마~!"],
|
||||
[0,"요리히메",null,0,null,90,98,74,0,160,300,null,null],
|
||||
[0,"와카챠나두",null,0,null,62,61,68,0,160,300,null,null],
|
||||
[0,"와카사기",null,0,null,68,57,79,0,160,300,null,null,"슬슬 우리요괴가 활약할 차례야!"],
|
||||
[0,"오토히메",null,0,null,80,60,76,0,160,300,null,null],
|
||||
[0,"오키나",null,0,null,87,87,86,0,160,300,null,null,"요괴가 아니라 신이에요~"],
|
||||
[0,"오모이카네",null,0,null,66,52,86,0,160,300,null,null],
|
||||
[0,"오린",null,0,null,87,84,77,0,160,300,null,null,"시체가 갖고 싶으니까, 역시 내가 언니를 처리해야겠네!"],
|
||||
[0,"오렌지",null,0,null,72,52,68,0,160,300,null,null,"아하하, 1면 보스니까라고 얕보지 말라구!"],
|
||||
[0,"오니5",null,0,null,55,65,40,0,160,300,null,null],
|
||||
[0,"오니4",null,0,null,54,64,40,0,160,300,null,null],
|
||||
[0,"오니3",null,0,null,53,63,40,0,160,300,null,null],
|
||||
[0,"오니2",null,0,null,52,62,40,0,160,300,null,null],
|
||||
[0,"오니1",null,0,null,51,61,40,0,160,300,null,null],
|
||||
[0,"엘핀민트",null,0,null,71,71,61,0,160,300,null,null],
|
||||
[0,"엘리스",null,0,null,55,69,88,0,160,300,null,null],
|
||||
[0,"엘리",null,0,null,86,83,66,0,160,300,null,null,"싸운 거 오랜만인걸 뭐."],
|
||||
[0,"엘렌",null,0,null,67,62,71,0,160,300,null,null,"나는, 엘렌. 폭신폭신 엘렌이야."],
|
||||
[0,"에이린",null,0,null,72,76,105,0,160,300,null,null,"아하하. 너희는 어리석구나."],
|
||||
[0,"야토",null,0,null,72,83,66,0,160,300,null,null],
|
||||
[0,"야츠하시",null,0,null,69,58,73,0,160,300,null,null,"훗훗후, 반역자에겐 어떤 수단이든 써도 된다면서?"],
|
||||
[0,"야마메",null,0,null,75,65,77,0,160,300,null,null,"지저에 떨어진 요괴의 힘을 보고 싶은 모양이구나."],
|
||||
[0,"앨리스",null,0,null,81,63,99,0,160,300,null,null,"그런 소리 하니까 바보 취급당하는 거야. 탄막은 브레인. 상식이야."],
|
||||
[0,"안자",null,0,null,67,61,83,0,160,300,null,null],
|
||||
[0,"안",null,0,null,68,51,67,0,160,300,null,null],
|
||||
[0,"아큐",null,0,null,72,30,82,0,160,300,null,null,"나는 이래뵈도 히에다가의 당주로써 환상향의 서기라는 역할을 지닌 유서깊은 집안의 사람이야."],
|
||||
[0,"아즈마",null,0,null,78,81,64,0,160,300,null,null],
|
||||
[0,"아운",null,0,null,78,87,65,0,160,300,null,null,"신사를 지키는 수호신으로서 말이야!"],
|
||||
[0,"아야",null,0,null,73,93,71,0,160,300,null,null,"깨끗하고 올바른 샤메이마루입니다."],
|
||||
[0,"아리오슈",null,0,null,56,70,67,0,160,300,null,null],
|
||||
[0,"써니",null,0,null,75,75,60,0,160,300,null,null,"어라, 혼자서도 최강이라며?"],
|
||||
[0,"쌍자",null,0,null,63,82,71,0,160,300,null,null],
|
||||
[0,"쌍사",null,0,null,62,73,81,0,160,300,null,null],
|
||||
[0,"신키",null,0,null,96,92,73,0,160,300,null,null,"나의 세계에서 저지른 죄값은 크지. 용서할 리가 없잖아."],
|
||||
[0,"신묘마루",null,0,null,85,68,88,0,160,300,null,null,"누─구?"],
|
||||
[0,"시키에이키",null,0,null,84,77,98,0,160,300,null,null,"보랏빛 벚꽃은 죄 깊은 인간의 영혼이 깃드는 꽃. 너는 그 보랏빛 벚꽃이 떨어져내리는 밑에서, 단죄하거라!"],
|
||||
[0,"시키에이카",null,0,null,71,60,77,0,160,300,null,null],
|
||||
[0,"시즈하",null,0,null,79,55,62,0,160,300,null,null],
|
||||
[0,"시온",null,0,null,80,97,76,0,160,300,null,null,"나도 좋아서 가난하게 살고 있는 게 아닌데~"],
|
||||
[0,"스타",null,0,null,70,60,75,0,160,300,null,null,"그래, 이 비겁한 녀석아!"],
|
||||
[0,"스이카",null,0,null,74,102,66,0,160,300,null,null,"거짓말은 인간만 하는 거야!"],
|
||||
[0,"스와코",null,0,null,95,81,81,0,160,300,null,null,"아~우~~"],
|
||||
[0,"스씨",null,0,null,66,63,66,0,160,300,null,null],
|
||||
[0,"스미레코",null,0,null,81,63,88,0,160,300,null,null,"히가시후카미 고등학교 1학년, 우사미 스미레코. 우는 아이도 뚝 그치는 진짜 초능력자야."],
|
||||
[0,"순호",null,0,null,77,102,79,0,160,300,null,null,"지금의 너로썬 내 힘 앞에선 무력, 절대적으로 무력하도다!"],
|
||||
[0,"쇼",null,0,null,75,75,95,0,160,300,null,null,"그것이 당신의 정의라는 거라면, 그것도 좋지요."],
|
||||
[0,"소악마",null,0,null,50,72,67,0,160,300,null,null],
|
||||
[0,"셰퍼드",null,0,null,61,58,56,0,160,300,null,null],
|
||||
[0,"센고",null,0,null,83,56,79,0,160,300,null,null],
|
||||
[0,"센",null,0,null,67,66,28,0,160,300,null,null],
|
||||
[0,"세키반키",null,0,null,68,75,71,0,160,300,null,null,"인간은 누구든지 나를 무서워하지!"],
|
||||
[0,"세츠조",null,0,null,58,80,58,0,160,300,null,null],
|
||||
[0,"세이자",null,0,null,82,94,69,0,160,300,null,null,"내 이름은 세이자. 뼛속까지 아마노자쿠다!"],
|
||||
[0,"세이란",null,0,null,71,77,51,0,160,300,null,null,"뭐, 이것도 일이야, 알지? 그러니 내게 여기서 얌전히 당해 줘. 응?"],
|
||||
[0,"샤리트",null,0,null,68,62,62,0,160,300,null,null],
|
||||
[0,"상해인형",null,0,null,74,69,69,0,160,300,null,null],
|
||||
[0,"상아",null,0,null,84,84,84,0,160,300,null,null],
|
||||
[0,"사토리",null,0,null,81,57,84,0,160,300,null,null,"제게는 보여요. 당신이 마음속에 그리고 있는 탄막이!"],
|
||||
[0,"사토노",null,0,null,71,76,77,0,160,300,null,null,"봐 주진 않겠지만 죽으면 죽일꺼니까 말야―!"],
|
||||
[0,"사쿠야",null,0,null,87,89,78,0,160,300,null,null,"당신의 시간 또한 나의 것"],
|
||||
[0,"사샤",null,0,null,74,48,78,0,160,300,null,null],
|
||||
[0,"사리엘",null,0,null,85,68,102,0,160,300,null,null,"죽는다면 모두 함께"],
|
||||
[0,"사라카",null,0,null,60,74,63,0,160,300,null,null],
|
||||
[0,"사라",null,0,null,76,78,36,0,160,300,null,null,"싸우는 건 재미있지만, 지는 건 재미없어."],
|
||||
[0,"사나에",null,0,null,87,71,85,0,160,300,null,null,"지금은, 바깥 세계는 환경을 지키라든가 경기 대책이 어떻다든가, 바보 같이 뭘 위해 태어난 건지 생각할 수 없는 사람 뿐."],
|
||||
[0,"사구메",null,0,null,84,97,71,0,160,300,null,null,"......그런건 아냐."],
|
||||
[0,"벤벤",null,0,null,69,59,75,0,160,300,null,null,"어딜 봐도 츠쿠모가미잖아."],
|
||||
[0,"뱌쿠렌",null,0,null,83,90,82,0,160,300,null,null,"아아, 법의 세계에 빛이 가득해."],
|
||||
[0,"미호",null,0,null,85,86,62,0,160,300,null,null],
|
||||
[0,"미하나",null,0,null,76,67,84,0,160,300,null,null],
|
||||
[0,"미토리",null,0,null,57,56,62,0,160,300,null,null],
|
||||
[0,"미코토",null,0,null,73,82,82,0,160,300,null,null],
|
||||
[0,"미코",null,0,null,87,72,97,0,160,300,null,null,"장난은 끝이다!"],
|
||||
[0,"미요",null,0,null,73,66,58,0,160,300,null,null],
|
||||
[0,"미스티아",null,0,null,65,82,12,0,160,300,null,null,"자, 잠깐 기다려~!"],
|
||||
[0,"미셸",null,0,null,70,69,72,0,160,300,null,null],
|
||||
[0,"미샨드라",null,0,null,80,63,82,0,160,300,null,null],
|
||||
[0,"미샤구지",null,0,null,48,99,59,0,160,300,null,null],
|
||||
[0,"미마",null,0,null,75,90,93,0,160,300,null,null,"나도 인간계의 신이야. (거짓말)"],
|
||||
[0,"미노리코",null,0,null,71,58,74,0,160,300,null,null,"갓 수확한 고구마는 나의 향수. 무녀가 먹게 놔둘 줄 알고!"],
|
||||
[0,"미나유",null,0,null,72,49,84,0,160,300,null,null],
|
||||
[0,"무무무",null,0,null,70,77,57,0,160,300,null,null],
|
||||
[0,"무라사",null,0,null,76,82,65,0,160,300,null,null,"이 세상에 미련이 남으신 분은 승선할 수 없습니다만 당신은 어떠신가요?"],
|
||||
[0,"무게츠",null,0,null,76,95,68,0,160,300,null,null,"난 무게츠. 그리고, 여긴 나의 세계."],
|
||||
[0,"묘렌",null,0,null,77,78,79,0,160,300,null,null],
|
||||
[0,"모코우",null,0,null,83,99,69,0,160,300,null,null,"너희들도 한번 영원의 고륜을 고민해 보는 게 좋아!"],
|
||||
[0,"모미지",null,0,null,83,68,66,0,160,300,null,null,"높은 분들은 저희 일반 텐구보다 훨씬 강하니까, 경비 같은 건 전혀 필요하지 않을 것 같은데."],
|
||||
[0,"모모히메",null,0,null,75,68,72,0,160,300,null,null],
|
||||
[0,"모모",null,0,null,62,62,71,0,160,300,null,null],
|
||||
[0,"메이즈",null,0,null,70,40,76,0,160,300,null,null],
|
||||
[0,"메이벨",null,0,null,71,74,56,0,160,300,null,null],
|
||||
[0,"메이라",null,0,null,65,82,36,0,160,300,null,null,"내가 이기면 하쿠레이의 힘은 내가 가져가겠어!"],
|
||||
[0,"메를린",null,0,null,73,67,70,0,160,300,null,null,"내 연주를 듣고서, 무사했던 식량은 없지."],
|
||||
[0,"메디슨",null,0,null,73,58,71,0,160,300,null,null,"콘파로, 콘파로, 독이여 모여라~"],
|
||||
[0,"메구미",null,0,null,83,77,74,0,160,300,null,null],
|
||||
[0,"마이",null,0,null,72,60,75,0,160,300,null,null,"내가 안내할게..."],
|
||||
[0,"마을사람5",null,0,null,65,35,50,0,160,300,null,null],
|
||||
[0,"마을사람4",null,0,null,64,34,50,0,160,300,null,null],
|
||||
[0,"마을사람3",null,0,null,63,33,50,0,160,300,null,null],
|
||||
[0,"마을사람2",null,0,null,62,32,50,0,160,300,null,null],
|
||||
[0,"마을사람1",null,0,null,61,31,50,0,160,300,null,null],
|
||||
[0,"마미조",null,0,null,77,77,97,0,160,300,null,null,"뭔가 고민이 있는 모양이구먼. 야그나 함 들어 보자."],
|
||||
[0,"마리우스",null,0,null,67,87,66,0,160,300,null,null],
|
||||
[0,"마리사",null,0,null,83,91,78,0,160,300,null,null,"아~? 탄막에 두뇌? 바보 아냐? 탄막은 파워야."],
|
||||
[0,"마나",null,0,null,73,75,72,0,160,300,null,null],
|
||||
[0,"링고",null,0,null,54,76,71,0,160,300,null,null,"옛날의 극락정토는 이제 보이는 그림자도 없다고 생각해."],
|
||||
[0,"릴리",null,0,null,37,63,68,0,160,300,null,null,"봄이에요~"],
|
||||
[0,"린네",null,0,null,83,66,83,0,160,300,null,null],
|
||||
[0,"리코",null,0,null,68,60,76,0,160,300,null,null],
|
||||
[0,"리카코",null,0,null,76,71,100,0,160,300,null,null,"왜 마법 따위에 흥미를 가지기나 하지?"],
|
||||
[0,"리카",null,0,null,61,63,75,0,160,300,null,null,"가는 거예요!!"],
|
||||
[0,"리리카",null,0,null,57,66,83,0,160,300,null,null,"당신은 노래를 부르지. 난 손을 쓰지 않고 연주를 해. 장기전으로 가면 내 쪽이 세다고?"],
|
||||
[0,"리락",null,0,null,74,54,62,0,160,300,null,null],
|
||||
[0,"리글",null,0,null,85,64,51,0,160,300,null,null,"달이 보이는 밤에는, 즐기지 않아선 안 되는 거 아닐까."],
|
||||
[0,"루이즈",null,0,null,59,57,72,0,160,300,null,null,"뭐, 마계는 좋은 곳이니, 느긋하게 관광이라도 하도록 해☆"],
|
||||
[0,"루미아",null,0,null,79,70,56,0,160,300,null,null,"그런 건가~"],
|
||||
[0,"루리",null,0,null,66,66,62,0,160,300,null,null],
|
||||
[0,"루나사",null,0,null,76,77,50,0,160,300,null,null,"넌 슬픈 처지에서 태어난 경우야. 들떠있을 때가 아니지."],
|
||||
[0,"루나",null,0,null,67,74,74,0,160,300,null,null,"빨라고? 네녀석이 빨아라!"],
|
||||
[0,"레티",null,0,null,60,79,49,0,160,300,null,null,"흑막~"],
|
||||
[0,"레이센",null,0,null,79,78,89,0,160,300,null,null,"이 앞에 기다리고 있는 게 악몽이라 해도, 그래도 나는 가야만 해."],
|
||||
[0,"레이무",null,0,null,90,83,82,0,160,300,null,null,"인간을 쉽사리 죽게 내버려 둘까 보냐!"],
|
||||
[0,"레이라",null,0,null,66,67,51,0,160,300,null,null],
|
||||
[0,"레밀리아",null,0,null,93,94,70,0,160,300,null,null,"당신은 이제껏 먹어 온 빵이 몇 개인지 알고 있어?"],
|
||||
[0,"런던인형",null,0,null,64,78,62,0,160,300,null,null],
|
||||
[0,"란",null,0,null,71,79,101,0,160,300,null,null,"흠. 첸을 괴롭힌건 너지?"],
|
||||
[0,"라쿠",null,0,null,71,52,69,0,160,300,null,null],
|
||||
[0,"라이코",null,0,null,80,66,91,0,160,300,null,null,"누구라도 자기 목숨을 부지하고 싶으면 노력을 아끼지 않잖아?"],
|
||||
[0,"라바",null,0,null,69,74,54,0,160,300,null,null,"지금이라면 신세계의 신이라도 될 것 같은 기분이야!"],
|
||||
[0,"도레미",null,0,null,67,63,88,0,160,300,null,null,"맨몸!? 혹시 맨몸!?"],
|
||||
[0,"대요정",null,0,null,60,56,79,0,160,300,null,null],
|
||||
[0,"달토끼5",null,0,null,35,55,55,0,160,300,null,null],
|
||||
[0,"달토끼4",null,0,null,34,54,55,0,160,300,null,null],
|
||||
[0,"달토끼3",null,0,null,33,53,55,0,160,300,null,null],
|
||||
[0,"달토끼2",null,0,null,32,52,55,0,160,300,null,null],
|
||||
[0,"달토끼1",null,0,null,31,51,55,0,160,300,null,null],
|
||||
[0,"니토리",null,0,null,68,68,76,0,160,300,null,null,"축제 땐 생선이 잘 팔리지. 인간에게 어업권을 뺏어서 독점하면 떼돈 벌겠네!"],
|
||||
[0,"노바",null,0,null,74,56,82,0,160,300,null,null],
|
||||
[0,"노로이코",null,0,null,56,61,65,0,160,300,null,null],
|
||||
[0,"네즈",null,0,null,76,71,40,0,160,300,null,null],
|
||||
[0,"네무노",null,0,null,78,40,67,0,160,300,null,null,"자자, 차라도 마시고 가라."],
|
||||
[0,"나즈린",null,0,null,76,63,64,0,160,300,null,null,"미안한데, 쥐를 얕보다간 죽어."],
|
||||
[0,"나루코",null,0,null,68,40,70,0,160,300,null,null],
|
||||
[0,"나루미",null,0,null,84,72,78,0,160,300,null,null,"에? 뭐야 그거 무서워"],
|
||||
[0,"구유카",null,0,null,84,85,85,0,160,300,null,null,"신이라 해도, 힘이야말로 전부야!"],
|
||||
[0,"구앨리스",null,0,null,80,80,90,0,160,300,null,null,"궁극의 마법으로 널 해치워 주겠어!!"],
|
||||
[0,"구마리사",null,0,null,80,90,80,0,160,300,null,null,"오케이~, 여기는 마리사에게 맡겨줘."],
|
||||
[0,"구레이무",null,0,null,90,80,80,0,160,300,null,null,"문답무용이야!!"],
|
||||
[0,"곽청아",null,0,null,72,77,87,0,160,300,null,null,"네~ 썩어서 귀엽죠?"],
|
||||
[0,"골리앗",null,0,null,72,78,58,0,160,300,null,null],
|
||||
[0,"겐지",null,0,null,70,70,70,0,160,300,null,null],
|
||||
[0,"겐게츠",null,0,null,83,70,94,0,160,300,null,null,"얕보지 마. 우린, 둘이서 한 사람 몫이니까.…"],
|
||||
[0,"강림",null,0,null,84,76,57,0,160,300,null,null]
|
||||
],
|
||||
"cities":[
|
||||
|
||||
|
||||
+244
-243
@@ -8,6 +8,7 @@
|
||||
"max":110,
|
||||
"npcMax":100
|
||||
},
|
||||
"iconPath":"환상향",
|
||||
"nation":[
|
||||
["영이", "#A9A9A9", 3000, 3000, "The Highly Responsive to Prayers.", 0, "묵가", 1, ["상용"]],
|
||||
["봉마", "#483D8B", 3000, 3000, "The Story of Eastern Wonderland.", 0, "종횡가", 1, ["이도"]],
|
||||
@@ -30,249 +31,249 @@
|
||||
],
|
||||
"diplomacy":[],
|
||||
"general":[
|
||||
[0, "히카리코", null, "환상", null, 56, 66, 21, 0, 160, 300, null, null],
|
||||
[0, "히메미코", null, 0, null, 68, 78, 65, 0, 160, 300, null, null],
|
||||
[0, "히나", "환상향/히나.jpg", "풍신", null, 66, 63, 83, 0, 160, 300, null, null, "온갖 재액이 닥쳐올 거야. 인간을 지키기 위해서라도 절대 보내주지 않겠어!"],
|
||||
[0, "후토", "환상향/후토.png", "신령", null, 84, 69, 93, 0, 160, 300, null, null, "불이라도 지를까."],
|
||||
[0, "홍미령", "환상향/홍미령.jpg", "홍마", null, 85, 79, 63, 0, 160, 300, null, null, "젠장, 배수진이다!"],
|
||||
[0, "호쥬누에", "환상향/호쥬누에.jpg", "성령", null, 85, 95, 72, 0, 160, 300, null, null, "자아, 나의 정체를 알아버린 당신을 죽여버리고, 정체불명으로 돌아가야겠어."],
|
||||
[0, "호라이인형", null, 0, null, 66, 71, 73, 0, 160, 300, null, null],
|
||||
[0, "헤카티아", "환상향/헤카티아.jpg", "감주", null, 85, 84, 94, 0, 160, 300, null, null, "꿈의 세계에선 무방비하니까 간단한 일이었지."],
|
||||
[0, "하타테", "환상향/하타테.jpg", "외전", null, 30, 88, 70, 0, 160, 300, null, null, "둘이서 더블스포일러가 되어서, 최강을 노리는 거야!"],
|
||||
[0, "하츠나", null, 0, null, 63, 61, 65, 0, 160, 300, null, null],
|
||||
[0, "하니에", null, 0, null, 57, 66, 63, 0, 160, 300, null, null],
|
||||
[0, "플랑드르", "환상향/플랑드르.jpg", "홍마", null, 76, 101, 71, 0, 160, 300, null, null, "쿠욱하고 콰광~이네"],
|
||||
[0, "프랑스인형", null, 0, null, 68, 68, 75, 0, 160, 300, null, null],
|
||||
[0, "파츄리", "환상향/파츄리.jpg", "홍마", null, 81, 52, 103, 0, 160, 300, null, null, "무큐-"],
|
||||
[0, "파스칼", null, 0, null, 73, 70, 60, 0, 160, 300, null, null],
|
||||
[0, "파브리티스", null, 0, null, 61, 61, 62, 0, 160, 300, null, null],
|
||||
[0, "파르시", "환상향/파르시.jpg", "지령", null, 67, 49, 89, 0, 160, 300, null, null, "너한테 원한은 없다만, 내가 널 공격하는 이유는 얼마든지 만들 수 있어."],
|
||||
[0, "토키코", null, "구문", null, 60, 59, 88, 0, 160, 300, null, null],
|
||||
[0, "토쿠비", null, 0, null, 77, 77, 72, 0, 160, 300, null, null],
|
||||
[0, "토지코", "환상향/토지코.png", "신령", null, 76, 62, 86, 0, 160, 300, null, null, "아이고 이런. 또 하나요?"],
|
||||
[0, "토요히메", "환상향/토요히메.jpg", "구문", null, 96, 69, 95, 0, 160, 300, null, null],
|
||||
[0, "토비코", null, 0, null, 72, 58, 56, 0, 160, 300, null, null],
|
||||
[0, "텐시", "환상향/텐시.jpg", "외전", null, 81, 89, 71, 0, 160, 300, null, null, "약해! 약해 빠졌어! 그따위로 하늘에 오를 수 있을 거라 꿈도 꾸지 마!"],
|
||||
[0, "텐무", null, 0, null, 68, 73, 56, 0, 160, 300, null, null],
|
||||
[0, "텐구5", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구4", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구3", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구2", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "텐구1", null, 0, null, 51, 51, 50, 0, 160, 300, null, null],
|
||||
[0, "테이레이다", "환상향/테이레이다.png", "천공", null, 78, 75, 53, 0, 160, 300, null, null, "갑작스럽겠지만, 테스트를 시작하겠어!]"],
|
||||
[0, "테위", "환상향/테위.jpg", "영야", null, 82, 32, 79, 0, 160, 300, null, null, "대숲은 사람을 헤매게 하는 대나무의 미로. 헤매는 것은 산사람다운 행위인 거야."],
|
||||
[0, "키쿠리", "환상향/키쿠리.jpg", "영이", null, 56, 72, 76, 0, 160, 300, null, null],
|
||||
[0, "키요히메", null, 0, null, 66, 76, 76, 0, 160, 300, null, null],
|
||||
[0, "키스메", "환상향/키스메.jpg", "지령", null, 73, 58, 59, 0, 160, 300, null, null, "너희가 떨어뜨린 시체는 이거냐?"],
|
||||
[0, "키나코", null, 0, null, 63, 68, 67, 0, 160, 300, null, null],
|
||||
[0, "클라운피스", "환상향/클라운피스.jpg", "감주", null, 89, 80, 77, 0, 160, 300, null, null, "잇츠, 루나틱 타임! 광기의 세계로 어서오세요!"],
|
||||
[0, "쿠스코", null, 0, null, 70, 57, 53, 0, 160, 300, null, null],
|
||||
[0, "쿠루미", "환상향/쿠루미.jpg", "환상", null, 70, 65, 68, 0, 160, 300, null, null, "나는 쿠루미. 이 호수의 문지기야."],
|
||||
[0, "쿄코", "환상향/쿄코.jpg", "신령", null, 37, 57, 80, 0, 160, 300, null, null, "목소리가 작다!"],
|
||||
[0, "콘가라", "환상향/콘가라.jpg", "영이", null, 91, 96, 60, 0, 160, 300, null, null],
|
||||
[0, "코토히메", "환상향/코토히메.jpg", "몽시", null, 54, 36, 90, 0, 160, 300, null, null, "충격의 새로운 사실! 고대인은 전기를 쓰고 있었다!"],
|
||||
[0, "코코로", "환상향/코코로.jpg", "외전", null, 80, 91, 60, 0, 160, 300, null, null, "나와 최강의 칭호를 걸고 싸우자!"],
|
||||
[0, "코카이", null, 0, null, 67, 78, 61, 0, 160, 300, null, null],
|
||||
[0, "코이시", "환상향/코이시.jpg", "지령", null, 88, 71, 93, 0, 160, 300, null, null, "네 시체는 지령전 입구에 장식해줄게!"],
|
||||
[0, "코스즈", "환상향/코스즈.jpg", "구문", null, 61, 63, 70, 0, 160, 300, null, null, "요괴가 하는 말을 믿으시는 거예요?!"],
|
||||
[0, "코마치", "환상향/코마치.jpg", "화영", null, 80, 97, 75, 0, 160, 300, null, null, "더는 어찌할 도리가 없어. 나는 그런 인간은 버릴 거야."],
|
||||
[0, "코노하", null, 0, null, 62, 58, 67, 0, 160, 300, null, null],
|
||||
[0, "코가사", "환상향/코가사.jpg", "성령", null, 79, 76, 56, 0, 160, 300, null, null, "됐어. 어차피 요괴는 이렇게 쓸쓸하게 사라져나가는 거니까."],
|
||||
[0, "케이네", "환상향/케이네.jpg", "영야", null, 77, 71, 104, 0, 160, 300, null, null, "여기엔 원래부터 아무것도 없었어, 인간도 인간의 마을도 말이야."],
|
||||
[0, "캇파5", null, 0, null, 40, 40, 65, 0, 160, 300, null, null],
|
||||
[0, "캇파4", null, 0, null, 40, 40, 64, 0, 160, 300, null, null],
|
||||
[0, "캇파3", null, 0, null, 40, 40, 63, 0, 160, 300, null, null],
|
||||
[0, "캇파2", null, 0, null, 40, 40, 62, 0, 160, 300, null, null],
|
||||
[0, "캇파1", null, 0, null, 40, 40, 61, 0, 160, 300, null, null],
|
||||
[0, "카스미", null, 0, null, 67, 63, 82, 0, 160, 300, null, null],
|
||||
[0, "카센", "환상향/카센.jpg", "외전", null, 72, 103, 71, 0, 160, 300, null, null, "이런 곳에서 전력을 다할 이유가없지."],
|
||||
[0, "카나코", "환상향/카나코.jpg", "풍신", null, 84, 97, 77, 0, 160, 300, null, null, "나를 부른 이는 누구인가?"],
|
||||
[0, "카나", "환상향/카나.jpg", "몽시", null, 64, 72, 57, 0, 160, 300, null, null, "아, 아니, 그러니까, 우주인?]"],
|
||||
[0, "카구야", "환상향/카구야.jpg", "영야", null, 98, 71, 82, 0, 160, 300, null, null, "내 영원을 다루는 술법으로 모두 깨뜨려 보이겠어."],
|
||||
[0, "카게로", "환상향/카게로.png", "휘침", null, 78, 88, 68, 0, 160, 300, null, null, "무서워~ 인간 무서워~"],
|
||||
[0, "치유리", "환상향/치유리.jpg", "몽시", null, 45, 77, 78, 0, 160, 300, null, null, "싸워서 강한 쪽이 이 세계의 치유리라구."],
|
||||
[0, "치르노", "환상향/치르노.jpg", 0, null, 79, 89, 49, 0, 160, 300, null, null, "눈앞에 강적이 있잖아?"],
|
||||
[0, "츠바메", null, 0, null, 71, 80, 58, 0, 160, 300, null, null],
|
||||
[0, "첸", "환상향/첸.jpg", "요요", null, 48, 70, 70, 0, 160, 300, null, null, "그건 그렇고, 마요이가에 어서와"],
|
||||
[0, "지벤", null, 0, null, 85, 67, 66, 0, 160, 300, null, null],
|
||||
[0, "지귀", null, 0, null, 79, 67, 69, 0, 160, 300, null, null],
|
||||
[0, "조온", null, "외전", null, 83, 74, 96, 0, 160, 300, null, null, "우리가 왜 최흉최악의 자매인지 그 몸으로 이해해라!"],
|
||||
[0, "자넷", null, 0, null, 60, 59, 62, 0, 160, 300, null, null],
|
||||
[0, "이포니아", null, 0, null, 61, 62, 61, 0, 160, 300, null, null],
|
||||
[0, "이쿠", "환상향/이쿠.jpg", "외전", null, 72, 72, 94, 0, 160, 300, null, null, "조금 벌을 받으실 필요가 있을지도 모르겠군요."],
|
||||
[0, "이치요우", null, 0, null, 70, 73, 58, 0, 160, 300, null, null],
|
||||
[0, "이치린", "환상향/이치린.jpg", "성령", null, 86, 55, 88, 0, 160, 300, null, null, "평화롭게 살고있으니까 괜찮잖아. 너, 요괴를 죽여도 아무렇지 않아?"],
|
||||
[0, "이슈아", null, 0, null, 67, 76, 78, 0, 160, 300, null, null],
|
||||
[0, "이나코", null, 0, null, 56, 35, 63, 0, 160, 300, null, null],
|
||||
[0, "유키", "환상향/유키.jpg", "괴기", null, 72, 77, 61, 0, 160, 300, null, null, "우리 둘을 쓰러뜨릴 수 있을 거라고 생각해?"],
|
||||
[0, "유카리", "환상향/유카리.jpg", "요요", null, 87, 76, 96, 0, 160, 300, null, null, "아름답고 잔혹하게 이 대지에서 사라져라!"],
|
||||
[0, "유카", "환상향/유카.jpg", "화영", null, 94, 88, 70, 0, 160, 300, null, null, "아 그래, 마침 60년 전이었네. 아아...... 그래, 벌써 그런 시기구나...... 60년인가. 회귀할 때구나."],
|
||||
[0, "유유코", "환상향/유유코.jpg", "요요", null, 97, 80, 81, 0, 160, 300, null, null, "새는 잔뼈가 많아서 싫어."],
|
||||
[0, "유메코", "환상향/유메코.jpg", "괴기", null, 72, 103, 73, 0, 160, 300, null, null, "우리들을 모욕한 죄는 죽음으로 밖에 갚을 수 없다!!"],
|
||||
[0, "유메미", "환상향/유메미.jpg", "몽시", null, 93, 72, 91, 0, 160, 300, null, null, "기합 넣어! 죽어 버렸다간 데리고 돌아갈 수 없으니까."],
|
||||
[0, "유기", "환상향/유기.jpg", "지령", null, 71, 104, 72, 0, 160, 300, null, null, "네가 강하기만 하다면 나야 아무 군소리도 안해. 어떤 목적으로 여기에 왔건 간에."],
|
||||
[0, "유겐마간", "환상향/유겐마간.jpg", "영이", null, 80, 80, 50, 0, 160, 300, null, null],
|
||||
[0, "우카", null, 0, null, 60, 73, 82, 0, 160, 300, null, null],
|
||||
[0, "우츠호", "환상향/우츠호.jpg", "지령", null, 73, 105, 68, 0, 160, 300, null, null, "이물질 발견! 핵융합로의 이물질 혼입은 일단 반응을 정지하고, 즉각 이물질을 제거하라."],
|
||||
[0, "요정5", null, 0, null, 55, 60, 35, 0, 160, 300, null, null],
|
||||
[0, "요정4", null, 0, null, 55, 59, 34, 0, 160, 300, null, null],
|
||||
[0, "요정3", null, 0, null, 55, 58, 33, 0, 160, 300, null, null],
|
||||
[0, "요정2", null, 0, null, 55, 57, 32, 0, 160, 300, null, null],
|
||||
[0, "요정1", null, 0, null, 55, 56, 31, 0, 160, 300, null, null],
|
||||
[0, "요우무", "환상향/요우무.jpg", "요요", null, 81, 89, 71, 0, 160, 300, null, null, "...요괴가 담금질한 이 누관검에, 벨 수 없는 것 따위, 별로 없어!"],
|
||||
[0, "요시카", "환상향/요시카.jpg", "신령", null, 84, 78, 61, 0, 160, 300, null, null, "오~지~마~!"],
|
||||
[0, "요리히메", "환상향/요리히메.jpg", "구문", null, 90, 98, 74, 0, 160, 300, null, null],
|
||||
[0, "와카챠나두", null, 0, null, 62, 61, 68, 0, 160, 300, null, null],
|
||||
[0, "와카사기", "환상향/와카사기.png", "휘침", null, 68, 57, 79, 0, 160, 300, null, null, "슬슬 우리요괴가 활약할 차례야!"],
|
||||
[0, "오토히메", null, 0, null, 80, 60, 76, 0, 160, 300, null, null],
|
||||
[0, "오키나", "환상향/오키나.png", "천공", null, 87, 87, 86, 0, 160, 300, null, null, "요괴가 아니라 신이에요~"],
|
||||
[0, "오모이카네", null, 0, null, 66, 52, 86, 0, 160, 300, null, null],
|
||||
[0, "오린", "환상향/오린.jpg", "지령", null, 87, 84, 77, 0, 160, 300, null, null, "시체가 갖고 싶으니까, 역시 내가 언니를 처리해야겠네!"],
|
||||
[0, "오렌지", "환상향/오렌지.jpg", "환상", null, 72, 52, 68, 0, 160, 300, null, null, "아하하, 1면 보스니까라고 얕보지 말라구!"],
|
||||
[0, "오니5", null, 0, null, 55, 65, 40, 0, 160, 300, null, null],
|
||||
[0, "오니4", null, 0, null, 54, 64, 40, 0, 160, 300, null, null],
|
||||
[0, "오니3", null, 0, null, 53, 63, 40, 0, 160, 300, null, null],
|
||||
[0, "오니2", null, 0, null, 52, 62, 40, 0, 160, 300, null, null],
|
||||
[0, "오니1", null, 0, null, 51, 61, 40, 0, 160, 300, null, null],
|
||||
[0, "엘핀민트", null, 0, null, 71, 71, 61, 0, 160, 300, null, null],
|
||||
[0, "엘리스", "환상향/엘리스.jpg", "영이", null, 55, 69, 88, 0, 160, 300, null, null],
|
||||
[0, "엘리", "환상향/엘리.jpg", "환상", null, 86, 83, 66, 0, 160, 300, null, null, "싸운 거 오랜만인걸 뭐."],
|
||||
[0, "엘렌", "환상향/엘렌.jpg", "몽시", null, 67, 62, 71, 0, 160, 300, null, null, "나는, 엘렌. 폭신폭신 엘렌이야."],
|
||||
[0, "에이린", "환상향/에이린.jpg", "영야", null, 72, 76, 105, 0, 160, 300, null, null, "아하하. 너희는 어리석구나."],
|
||||
[0, "야토", null, 0, null, 72, 83, 66, 0, 160, 300, null, null],
|
||||
[0, "야츠하시", "환상향/야츠하시.png", "휘침", null, 69, 58, 73, 0, 160, 300, null, null, "훗훗후, 반역자에겐 어떤 수단이든 써도 된다면서?"],
|
||||
[0, "야마메", "환상향/야마메.jpg", "지령", null, 75, 65, 77, 0, 160, 300, null, null, "지저에 떨어진 요괴의 힘을 보고 싶은 모양이구나."],
|
||||
[0, "앨리스", "환상향/앨리스.jpg", "요요", null, 81, 63, 99, 0, 160, 300, null, null, "그런 소리 하니까 바보 취급당하는 거야. 탄막은 브레인. 상식이야."],
|
||||
[0, "안자", null, 0, null, 67, 61, 83, 0, 160, 300, null, null],
|
||||
[0, "안", null, 0, null, 68, 51, 67, 0, 160, 300, null, null],
|
||||
[0, "아큐", "환상향/아큐.jpg", "구문", null, 72, 30, 82, 0, 160, 300, null, null, "나는 이래뵈도 히에다가의 당주로써 환상향의 서기라는 역할을 지닌 유서깊은 집안의 사람이야."],
|
||||
[0, "아즈마", null, 0, null, 78, 81, 64, 0, 160, 300, null, null],
|
||||
[0, "아운", "환상향/아운.png", "천공", null, 78, 87, 65, 0, 160, 300, null, null, "신사를 지키는 수호신으로서 말이야!"],
|
||||
[0, "아야", "환상향/아야.jpg", "화영", null, 73, 93, 71, 0, 160, 300, null, null, "깨끗하고 올바른 샤메이마루입니다."],
|
||||
[0, "아리오슈", null, 0, null, 56, 70, 67, 0, 160, 300, null, null],
|
||||
[0, "써니", "환상향/써니.jpg", "구문", null, 75, 75, 60, 0, 160, 300, null, null, "어라, 혼자서도 최강이라며?"],
|
||||
[0, "쌍자", null, 0, null, 63, 82, 71, 0, 160, 300, null, null],
|
||||
[0, "쌍사", null, 0, null, 62, 73, 81, 0, 160, 300, null, null],
|
||||
[0, "신키", "환상향/신키.jpg", "괴기", null, 96, 92, 73, 0, 160, 300, null, null, "나의 세계에서 저지른 죄값은 크지. 용서할 리가 없잖아."],
|
||||
[0, "신묘마루", "환상향/신묘마루.png", "휘침", null, 85, 68, 88, 0, 160, 300, null, null, "누─구?"],
|
||||
[0, "시키에이키", "환상향/시키에이키.jpg", "화영", null, 84, 77, 98, 0, 160, 300, null, null, "보랏빛 벚꽃은 죄 깊은 인간의 영혼이 깃드는 꽃. 너는 그 보랏빛 벚꽃이 떨어져내리는 밑에서, 단죄하거라!"],
|
||||
[0, "시키에이카", null, 0, null, 71, 60, 77, 0, 160, 300, null, null],
|
||||
[0, "시즈하", "환상향/시즈하.jpg", "풍신", null, 79, 55, 62, 0, 160, 300, null, null],
|
||||
[0, "시온", null, "외전", null, 80, 97, 76, 0, 160, 300, null, null, "나도 좋아서 가난하게 살고 있는 게 아닌데~"],
|
||||
[0, "스타", "환상향/스타.jpg", "구문", null, 70, 60, 75, 0, 160, 300, null, null, "그래, 이 비겁한 녀석아!"],
|
||||
[0, "스이카", "환상향/스이카.jpg", "외전", null, 74, 102, 66, 0, 160, 300, null, null, "거짓말은 인간만 하는 거야!"],
|
||||
[0, "스와코", "환상향/스와코.jpg", "풍신", null, 95, 81, 81, 0, 160, 300, null, null, "아~우~~"],
|
||||
[0, "스씨", null, 0, null, 66, 63, 66, 0, 160, 300, null, null],
|
||||
[0, "스미레코", "환상향/스미레코.jpg", "외전", null, 81, 63, 88, 0, 160, 300, null, null, "히가시후카미 고등학교 1학년, 우사미 스미레코. 우는 아이도 뚝 그치는 진짜 초능력자야."],
|
||||
[0, "순호", "환상향/순호.jpg", "감주", null, 77, 102, 79, 0, 160, 300, null, null, "지금의 너로썬 내 힘 앞에선 무력, 절대적으로 무력하도다!"],
|
||||
[0, "쇼", "환상향/쇼.jpg", "성령", null, 75, 75, 95, 0, 160, 300, null, null, "그것이 당신의 정의라는 거라면, 그것도 좋지요."],
|
||||
[0, "소악마", "환상향/소악마.jpg", "홍마", null, 50, 72, 67, 0, 160, 300, null, null],
|
||||
[0, "셰퍼드", null, 0, null, 61, 58, 56, 0, 160, 300, null, null],
|
||||
[0, "센고", null, 0, null, 83, 56, 79, 0, 160, 300, null, null],
|
||||
[0, "센", null, 0, null, 67, 66, 28, 0, 160, 300, null, null],
|
||||
[0, "세키반키", "환상향/세키반키.png", "휘침", null, 68, 75, 71, 0, 160, 300, null, null, "인간은 누구든지 나를 무서워하지!"],
|
||||
[0, "세츠조", null, 0, null, 58, 80, 58, 0, 160, 300, null, null],
|
||||
[0, "세이자", "환상향/세이자.png", "휘침", null, 82, 94, 69, 0, 160, 300, null, null, "내 이름은 세이자. 뼛속까지 아마노자쿠다!"],
|
||||
[0, "세이란", "환상향/세이란.jpg", "감주", null, 71, 77, 51, 0, 160, 300, null, null, "뭐, 이것도 일이야, 알지? 그러니 내게 여기서 얌전히 당해 줘. 응?"],
|
||||
[0, "샤리트", null, 0, null, 68, 62, 62, 0, 160, 300, null, null],
|
||||
[0, "상해인형", null, 0, null, 74, 69, 69, 0, 160, 300, null, null],
|
||||
[0, "상아", null, 0, null, 84, 84, 84, 0, 160, 300, null, null],
|
||||
[0, "사토리", "환상향/사토리.jpg", "지령", null, 81, 57, 84, 0, 160, 300, null, null, "제게는 보여요. 당신이 마음속에 그리고 있는 탄막이!"],
|
||||
[0, "사토노", "환상향/사토노.png", "천공", null, 71, 76, 77, 0, 160, 300, null, null, "봐 주진 않겠지만 죽으면 죽일꺼니까 말야―!"],
|
||||
[0, "사쿠야", "환상향/사쿠야.jpg", "홍마", null, 87, 89, 78, 0, 160, 300, null, null, "당신의 시간 또한 나의 것"],
|
||||
[0, "사샤", null, 0, null, 74, 48, 78, 0, 160, 300, null, null],
|
||||
[0, "사리엘", "환상향/사리엘.jpg", "영이", null, 85, 68, 102, 0, 160, 300, null, null, "죽는다면 모두 함께"],
|
||||
[0, "사라카", null, 0, null, 60, 74, 63, 0, 160, 300, null, null],
|
||||
[0, "사라", "환상향/사라.jpg", "괴기", null, 76, 78, 36, 0, 160, 300, null, null, "싸우는 건 재미있지만, 지는 건 재미없어."],
|
||||
[0, "사나에", "환상향/사나에.jpg", "풍신", null, 87, 71, 85, 0, 160, 300, null, null, "지금은, 바깥 세계는 환경을 지키라든가 경기 대책이 어떻다든가, 바보 같이 뭘 위해 태어난 건지 생각할 수 없는 사람 뿐."],
|
||||
[0, "사구메", "환상향/사구메.jpg", "감주", null, 84, 97, 71, 0, 160, 300, null, null, "......그런건 아냐."],
|
||||
[0, "벤벤", "환상향/벤벤.png", "휘침", null, 69, 59, 75, 0, 160, 300, null, null, "어딜 봐도 츠쿠모가미잖아."],
|
||||
[0, "뱌쿠렌", "환상향/뱌쿠렌.jpg", "성령", null, 83, 90, 82, 0, 160, 300, null, null, "아아, 법의 세계에 빛이 가득해."],
|
||||
[0, "미호", null, 0, null, 85, 86, 62, 0, 160, 300, null, null],
|
||||
[0, "미하나", null, 0, null, 76, 67, 84, 0, 160, 300, null, null],
|
||||
[0, "미토리", null, 0, null, 57, 56, 62, 0, 160, 300, null, null],
|
||||
[0, "미코토", null, 0, null, 73, 82, 82, 0, 160, 300, null, null],
|
||||
[0, "미코", "환상향/미코.png", "신령", null, 87, 72, 97, 0, 160, 300, null, null, "장난은 끝이다!"],
|
||||
[0, "미요", null, 0, null, 73, 66, 58, 0, 160, 300, null, null],
|
||||
[0, "미스티아", "환상향/미스티아.jpg", "영야", null, 65, 82, 12, 0, 160, 300, null, null, "자, 잠깐 기다려~!"],
|
||||
[0, "미셸", null, 0, null, 70, 69, 72, 0, 160, 300, null, null],
|
||||
[0, "미샨드라", null, 0, null, 80, 63, 82, 0, 160, 300, null, null],
|
||||
[0, "미샤구지", null, "풍신", null, 48, 99, 59, 0, 160, 300, null, null],
|
||||
[0, "미마", "환상향/미마.jpg", "봉마", null, 75, 90, 93, 0, 160, 300, null, null, "나도 인간계의 신이야. (거짓말)"],
|
||||
[0, "미노리코", "환상향/미노리코.jpg", "풍신", null, 71, 58, 74, 0, 160, 300, null, null, "갓 수확한 고구마는 나의 향수. 무녀가 먹게 놔둘 줄 알고!"],
|
||||
[0, "미나유", null, 0, null, 72, 49, 84, 0, 160, 300, null, null],
|
||||
[0, "무무무", null, 0, null, 70, 77, 57, 0, 160, 300, null, null],
|
||||
[0, "무라사", "환상향/무라사.jpg", "성령", null, 76, 82, 65, 0, 160, 300, null, null, "이 세상에 미련이 남으신 분은 승선할 수 없습니다만 당신은 어떠신가요?"],
|
||||
[0, "무게츠", "환상향/무게츠.jpg", "환상", null, 76, 95, 68, 0, 160, 300, null, null, "난 무게츠. 그리고, 여긴 나의 세계."],
|
||||
[0, "묘렌", null, 0, null, 77, 78, 79, 0, 160, 300, null, null],
|
||||
[0, "모코우", "환상향/모코우.jpg", "영야", null, 83, 99, 69, 0, 160, 300, null, null, "너희들도 한번 영원의 고륜을 고민해 보는 게 좋아!"],
|
||||
[0, "모미지", "환상향/모미지.jpg", "풍신", null, 83, 68, 66, 0, 160, 300, null, null, "높은 분들은 저희 일반 텐구보다 훨씬 강하니까, 경비 같은 건 전혀 필요하지 않을 것 같은데."],
|
||||
[0, "모모히메", null, 0, null, 75, 68, 72, 0, 160, 300, null, null],
|
||||
[0, "모모", null, 0, null, 62, 62, 71, 0, 160, 300, null, null],
|
||||
[0, "메이즈", null, 0, null, 70, 40, 76, 0, 160, 300, null, null],
|
||||
[0, "메이벨", null, 0, null, 71, 74, 56, 0, 160, 300, null, null],
|
||||
[0, "메이라", "환상향/메이라.jpg", "봉마", null, 65, 82, 36, 0, 160, 300, null, null, "내가 이기면 하쿠레이의 힘은 내가 가져가겠어!"],
|
||||
[0, "메를린", "환상향/메를린.jpg", "화영", null, 73, 67, 70, 0, 160, 300, null, null, "내 연주를 듣고서, 무사했던 식량은 없지."],
|
||||
[0, "메디슨", "환상향/메디슨.jpg", "화영", null, 73, 58, 71, 0, 160, 300, null, null, "콘파로, 콘파로, 독이여 모여라~"],
|
||||
[0, "메구미", null, 0, null, 83, 77, 74, 0, 160, 300, null, null],
|
||||
[0, "마이", "환상향/마이.jpg", "괴기", null, 72, 60, 75, 0, 160, 300, null, null, "내가 안내할게..."],
|
||||
[0, "마을사람5", null, 0, null, 65, 35, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람4", null, 0, null, 64, 34, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람3", null, 0, null, 63, 33, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람2", null, 0, null, 62, 32, 50, 0, 160, 300, null, null],
|
||||
[0, "마을사람1", null, 0, null, 61, 31, 50, 0, 160, 300, null, null],
|
||||
[0, "마미조", "환상향/마미조.png", "신령", null, 77, 77, 97, 0, 160, 300, null, null, "뭔가 고민이 있는 모양이구먼. 야그나 함 들어 보자."],
|
||||
[0, "마리우스", null, 0, null, 67, 87, 66, 0, 160, 300, null, null],
|
||||
[0, "마리사", "환상향/마리사.jpg", 0, null, 83, 91, 78, 0, 160, 300, null, null, "아~? 탄막에 두뇌? 바보 아냐? 탄막은 파워야."],
|
||||
[0, "마나", null, 0, null, 73, 75, 72, 0, 160, 300, null, null],
|
||||
[0, "링고", "환상향/링고.jpg", "감주", null, 54, 76, 71, 0, 160, 300, null, null, "옛날의 극락정토는 이제 보이는 그림자도 없다고 생각해."],
|
||||
[0, "릴리", "환상향/릴리.jpg", "요요", null, 37, 63, 68, 0, 160, 300, null, null, "봄이에요~"],
|
||||
[0, "린네", null, 0, null, 83, 66, 83, 0, 160, 300, null, null],
|
||||
[0, "리코", null, 0, null, 68, 60, 76, 0, 160, 300, null, null],
|
||||
[0, "리카코", "환상향/리카코.jpg", "몽시", null, 76, 71, 100, 0, 160, 300, null, null, "왜 마법 따위에 흥미를 가지기나 하지?"],
|
||||
[0, "리카", "환상향/리카.jpg", "봉마", null, 61, 63, 75, 0, 160, 300, null, null, "가는 거예요!!"],
|
||||
[0, "리리카", "환상향/리리카.jpg", "화영", null, 57, 66, 83, 0, 160, 300, null, null, "당신은 노래를 부르지. 난 손을 쓰지 않고 연주를 해. 장기전으로 가면 내 쪽이 세다고?"],
|
||||
[0, "리락", null, 0, null, 74, 54, 62, 0, 160, 300, null, null],
|
||||
[0, "리글", "환상향/리글.jpg", "영야", null, 85, 64, 51, 0, 160, 300, null, null, "달이 보이는 밤에는, 즐기지 않아선 안 되는 거 아닐까."],
|
||||
[0, "루이즈", "환상향/루이즈.jpg", "괴기", null, 59, 57, 72, 0, 160, 300, null, null, "뭐, 마계는 좋은 곳이니, 느긋하게 관광이라도 하도록 해☆"],
|
||||
[0, "루미아", "환상향/루미아.jpg", "홍마", null, 79, 70, 56, 0, 160, 300, null, null, "그런 건가~"],
|
||||
[0, "루리", null, 0, null, 66, 66, 62, 0, 160, 300, null, null],
|
||||
[0, "루나사", "환상향/루나사.jpg", "화영", null, 76, 77, 50, 0, 160, 300, null, null, "넌 슬픈 처지에서 태어난 경우야. 들떠있을 때가 아니지."],
|
||||
[0, "루나", "환상향/루나.jpg", "구문", null, 67, 74, 74, 0, 160, 300, null, null, "빨라고? 네녀석이 빨아라!"],
|
||||
[0, "레티", "환상향/레티.jpg", "요요", null, 60, 79, 49, 0, 160, 300, null, null, "흑막~"],
|
||||
[0, "레이센", "환상향/레이센.jpg", "영야", null, 79, 78, 89, 0, 160, 300, null, null, "이 앞에 기다리고 있는 게 악몽이라 해도, 그래도 나는 가야만 해."],
|
||||
[0, "레이무", "환상향/레이무.jpg", 0, null, 90, 83, 82, 0, 160, 300, null, null, "인간을 쉽사리 죽게 내버려 둘까 보냐!"],
|
||||
[0, "레이라", null, 0, null, 66, 67, 51, 0, 160, 300, null, null],
|
||||
[0, "레밀리아", "환상향/레밀리아.jpg", "홍마", null, 93, 94, 70, 0, 160, 300, null, null, "당신은 이제껏 먹어 온 빵이 몇 개인지 알고 있어?"],
|
||||
[0, "런던인형", null, 0, null, 64, 78, 62, 0, 160, 300, null, null],
|
||||
[0, "란", "환상향/란.jpg", "요요", null, 71, 79, 101, 0, 160, 300, null, null, "흠. 첸을 괴롭힌건 너지?"],
|
||||
[0, "라쿠", null, 0, null, 71, 52, 69, 0, 160, 300, null, null],
|
||||
[0, "라이코", "환상향/라이코.png", "휘침", null, 80, 66, 91, 0, 160, 300, null, null, "누구라도 자기 목숨을 부지하고 싶으면 노력을 아끼지 않잖아?"],
|
||||
[0, "라바", "환상향/라바.png", "천공", null, 69, 74, 54, 0, 160, 300, null, null, "지금이라면 신세계의 신이라도 될 것 같은 기분이야!"],
|
||||
[0, "도레미", "환상향/도레미.jpg", "감주", null, 67, 63, 88, 0, 160, 300, null, null, "맨몸!? 혹시 맨몸!?"],
|
||||
[0, "대요정", "환상향/대요정.jpg", "홍마", null, 60, 56, 79, 0, 160, 300, null, null],
|
||||
[0, "달토끼5", null, 0, null, 35, 55, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼4", null, 0, null, 34, 54, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼3", null, 0, null, 33, 53, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼2", null, 0, null, 32, 52, 55, 0, 160, 300, null, null],
|
||||
[0, "달토끼1", null, 0, null, 31, 51, 55, 0, 160, 300, null, null],
|
||||
[0, "니토리", "환상향/니토리.jpg", "풍신", null, 68, 68, 76, 0, 160, 300, null, null, "축제 땐 생선이 잘 팔리지. 인간에게 어업권을 뺏어서 독점하면 떼돈 벌겠네!"],
|
||||
[0, "노바", null, 0, null, 74, 56, 82, 0, 160, 300, null, null],
|
||||
[0, "노로이코", "환상향/노로이코.jpg", "봉마", null, 56, 61, 65, 0, 160, 300, null, null],
|
||||
[0, "네즈", null, 0, null, 76, 71, 40, 0, 160, 300, null, null],
|
||||
[0, "네무노", "환상향/네무노.png", "천공", null, 78, 40, 67, 0, 160, 300, null, null, "자자, 차라도 마시고 가라."],
|
||||
[0, "나즈린", "환상향/나즈린.jpg", "성령", null, 76, 63, 64, 0, 160, 300, null, null, "미안한데, 쥐를 얕보다간 죽어."],
|
||||
[0, "나루코", null, 0, null, 68, 40, 70, 0, 160, 300, null, null],
|
||||
[0, "나루미", "환상향/나루미.png", "천공", null, 84, 72, 78, 0, 160, 300, null, null, "에? 뭐야 그거 무서워"],
|
||||
[0, "구유카", "환상향/구유카.jpg", "환상", null, 84, 85, 85, 0, 160, 300, null, null, "신이라 해도, 힘이야말로 전부야!"],
|
||||
[0, "구앨리스", "환상향/구앨리스.jpg", "괴기", null, 80, 80, 90, 0, 160, 300, null, null, "궁극의 마법으로 널 해치워 주겠어!!"],
|
||||
[0, "구마리사", "환상향/구마리사.jpg", "봉마", null, 80, 90, 80, 0, 160, 300, null, null, "오케이~, 여기는 마리사에게 맡겨줘."],
|
||||
[0, "구레이무", "환상향/구레이무.jpg", "영이", null, 90, 80, 80, 0, 160, 300, null, null, "문답무용이야!!"],
|
||||
[0, "곽청아", "환상향/곽청아.png", "신령", null, 72, 77, 87, 0, 160, 300, null, null, "네~ 썩어서 귀엽죠?"],
|
||||
[0, "골리앗", null, 0, null, 72, 78, 58, 0, 160, 300, null, null],
|
||||
[0, "겐지", null, "봉마", null, 70, 70, 70, 0, 160, 300, null, null],
|
||||
[0, "겐게츠", "환상향/겐게츠.jpg", "환상", null, 83, 70, 94, 0, 160, 300, null, null, "얕보지 마. 우린, 둘이서 한 사람 몫이니까.…"],
|
||||
[0, "강림", null, 0, null, 84, 76, 57, 0, 160, 300, null, null]
|
||||
[0,"히카리코",null,"환상",null,56,66,21,0,160,300,null,null],
|
||||
[0,"히메미코",null,0,null,68,78,65,0,160,300,null,null],
|
||||
[0,"히나",null,"풍신",null,66,63,83,0,160,300,null,null,"온갖 재액이 닥쳐올 거야. 인간을 지키기 위해서라도 절대 보내주지 않겠어!"],
|
||||
[0,"후토",null,"신령",null,84,69,93,0,160,300,null,null,"불이라도 지를까."],
|
||||
[0,"홍미령",null,"홍마",null,85,79,63,0,160,300,null,null,"젠장, 배수진이다!"],
|
||||
[0,"호쥬누에",null,"성령",null,85,95,72,0,160,300,null,null,"자아, 나의 정체를 알아버린 당신을 죽여버리고, 정체불명으로 돌아가야겠어."],
|
||||
[0,"호라이인형",null,0,null,66,71,73,0,160,300,null,null],
|
||||
[0,"헤카티아",null,"감주",null,85,84,94,0,160,300,null,null,"꿈의 세계에선 무방비하니까 간단한 일이었지."],
|
||||
[0,"하타테",null,"외전",null,30,88,70,0,160,300,null,null,"둘이서 더블스포일러가 되어서, 최강을 노리는 거야!"],
|
||||
[0,"하츠나",null,0,null,63,61,65,0,160,300,null,null],
|
||||
[0,"하니에",null,0,null,57,66,63,0,160,300,null,null],
|
||||
[0,"플랑드르",null,"홍마",null,76,101,71,0,160,300,null,null,"쿠욱하고 콰광~이네"],
|
||||
[0,"프랑스인형",null,0,null,68,68,75,0,160,300,null,null],
|
||||
[0,"파츄리",null,"홍마",null,81,52,103,0,160,300,null,null,"무큐-"],
|
||||
[0,"파스칼",null,0,null,73,70,60,0,160,300,null,null],
|
||||
[0,"파브리티스",null,0,null,61,61,62,0,160,300,null,null],
|
||||
[0,"파르시",null,"지령",null,67,49,89,0,160,300,null,null,"너한테 원한은 없다만, 내가 널 공격하는 이유는 얼마든지 만들 수 있어."],
|
||||
[0,"토키코",null,"구문",null,60,59,88,0,160,300,null,null],
|
||||
[0,"토쿠비",null,0,null,77,77,72,0,160,300,null,null],
|
||||
[0,"토지코",null,"신령",null,76,62,86,0,160,300,null,null,"아이고 이런. 또 하나요?"],
|
||||
[0,"토요히메",null,"구문",null,96,69,95,0,160,300,null,null],
|
||||
[0,"토비코",null,0,null,72,58,56,0,160,300,null,null],
|
||||
[0,"텐시",null,"외전",null,81,89,71,0,160,300,null,null,"약해! 약해 빠졌어! 그따위로 하늘에 오를 수 있을 거라 꿈도 꾸지 마!"],
|
||||
[0,"텐무",null,0,null,68,73,56,0,160,300,null,null],
|
||||
[0,"텐구5",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구4",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구3",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구2",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"텐구1",null,0,null,51,51,50,0,160,300,null,null],
|
||||
[0,"테이레이다",null,"천공",null,78,75,53,0,160,300,null,null,"갑작스럽겠지만, 테스트를 시작하겠어!]"],
|
||||
[0,"테위",null,"영야",null,82,32,79,0,160,300,null,null,"대숲은 사람을 헤매게 하는 대나무의 미로. 헤매는 것은 산사람다운 행위인 거야."],
|
||||
[0,"키쿠리",null,"영이",null,56,72,76,0,160,300,null,null],
|
||||
[0,"키요히메",null,0,null,66,76,76,0,160,300,null,null],
|
||||
[0,"키스메",null,"지령",null,73,58,59,0,160,300,null,null,"너희가 떨어뜨린 시체는 이거냐?"],
|
||||
[0,"키나코",null,0,null,63,68,67,0,160,300,null,null],
|
||||
[0,"클라운피스",null,"감주",null,89,80,77,0,160,300,null,null,"잇츠, 루나틱 타임! 광기의 세계로 어서오세요!"],
|
||||
[0,"쿠스코",null,0,null,70,57,53,0,160,300,null,null],
|
||||
[0,"쿠루미",null,"환상",null,70,65,68,0,160,300,null,null,"나는 쿠루미. 이 호수의 문지기야."],
|
||||
[0,"쿄코",null,"신령",null,37,57,80,0,160,300,null,null,"목소리가 작다!"],
|
||||
[0,"콘가라",null,"영이",null,91,96,60,0,160,300,null,null],
|
||||
[0,"코토히메",null,"몽시",null,54,36,90,0,160,300,null,null,"충격의 새로운 사실! 고대인은 전기를 쓰고 있었다!"],
|
||||
[0,"코코로",null,"외전",null,80,91,60,0,160,300,null,null,"나와 최강의 칭호를 걸고 싸우자!"],
|
||||
[0,"코카이",null,0,null,67,78,61,0,160,300,null,null],
|
||||
[0,"코이시",null,"지령",null,88,71,93,0,160,300,null,null,"네 시체는 지령전 입구에 장식해줄게!"],
|
||||
[0,"코스즈",null,"구문",null,61,63,70,0,160,300,null,null,"요괴가 하는 말을 믿으시는 거예요?!"],
|
||||
[0,"코마치",null,"화영",null,80,97,75,0,160,300,null,null,"더는 어찌할 도리가 없어. 나는 그런 인간은 버릴 거야."],
|
||||
[0,"코노하",null,0,null,62,58,67,0,160,300,null,null],
|
||||
[0,"코가사",null,"성령",null,79,76,56,0,160,300,null,null,"됐어. 어차피 요괴는 이렇게 쓸쓸하게 사라져나가는 거니까."],
|
||||
[0,"케이네",null,"영야",null,77,71,104,0,160,300,null,null,"여기엔 원래부터 아무것도 없었어, 인간도 인간의 마을도 말이야."],
|
||||
[0,"캇파5",null,0,null,40,40,65,0,160,300,null,null],
|
||||
[0,"캇파4",null,0,null,40,40,64,0,160,300,null,null],
|
||||
[0,"캇파3",null,0,null,40,40,63,0,160,300,null,null],
|
||||
[0,"캇파2",null,0,null,40,40,62,0,160,300,null,null],
|
||||
[0,"캇파1",null,0,null,40,40,61,0,160,300,null,null],
|
||||
[0,"카스미",null,0,null,67,63,82,0,160,300,null,null],
|
||||
[0,"카센",null,"외전",null,72,103,71,0,160,300,null,null,"이런 곳에서 전력을 다할 이유가없지."],
|
||||
[0,"카나코",null,"풍신",null,84,97,77,0,160,300,null,null,"나를 부른 이는 누구인가?"],
|
||||
[0,"카나",null,"몽시",null,64,72,57,0,160,300,null,null,"아, 아니, 그러니까, 우주인?]"],
|
||||
[0,"카구야",null,"영야",null,98,71,82,0,160,300,null,null,"내 영원을 다루는 술법으로 모두 깨뜨려 보이겠어."],
|
||||
[0,"카게로",null,"휘침",null,78,88,68,0,160,300,null,null,"무서워~ 인간 무서워~"],
|
||||
[0,"치유리",null,"몽시",null,45,77,78,0,160,300,null,null,"싸워서 강한 쪽이 이 세계의 치유리라구."],
|
||||
[0,"치르노",null,0,null,79,89,49,0,160,300,null,null,"눈앞에 강적이 있잖아?"],
|
||||
[0,"츠바메",null,0,null,71,80,58,0,160,300,null,null],
|
||||
[0,"첸",null,"요요",null,48,70,70,0,160,300,null,null,"그건 그렇고, 마요이가에 어서와"],
|
||||
[0,"지벤",null,0,null,85,67,66,0,160,300,null,null],
|
||||
[0,"지귀",null,0,null,79,67,69,0,160,300,null,null],
|
||||
[0,"조온",null,"외전",null,83,74,96,0,160,300,null,null,"우리가 왜 최흉최악의 자매인지 그 몸으로 이해해라!"],
|
||||
[0,"자넷",null,0,null,60,59,62,0,160,300,null,null],
|
||||
[0,"이포니아",null,0,null,61,62,61,0,160,300,null,null],
|
||||
[0,"이쿠",null,"외전",null,72,72,94,0,160,300,null,null,"조금 벌을 받으실 필요가 있을지도 모르겠군요."],
|
||||
[0,"이치요우",null,0,null,70,73,58,0,160,300,null,null],
|
||||
[0,"이치린",null,"성령",null,86,55,88,0,160,300,null,null,"평화롭게 살고있으니까 괜찮잖아. 너, 요괴를 죽여도 아무렇지 않아?"],
|
||||
[0,"이슈아",null,0,null,67,76,78,0,160,300,null,null],
|
||||
[0,"이나코",null,0,null,56,35,63,0,160,300,null,null],
|
||||
[0,"유키",null,"괴기",null,72,77,61,0,160,300,null,null,"우리 둘을 쓰러뜨릴 수 있을 거라고 생각해?"],
|
||||
[0,"유카리",null,"요요",null,87,76,96,0,160,300,null,null,"아름답고 잔혹하게 이 대지에서 사라져라!"],
|
||||
[0,"유카",null,"화영",null,94,88,70,0,160,300,null,null,"아 그래, 마침 60년 전이었네. 아아...... 그래, 벌써 그런 시기구나...... 60년인가. 회귀할 때구나."],
|
||||
[0,"유유코",null,"요요",null,97,80,81,0,160,300,null,null,"새는 잔뼈가 많아서 싫어."],
|
||||
[0,"유메코",null,"괴기",null,72,103,73,0,160,300,null,null,"우리들을 모욕한 죄는 죽음으로 밖에 갚을 수 없다!!"],
|
||||
[0,"유메미",null,"몽시",null,93,72,91,0,160,300,null,null,"기합 넣어! 죽어 버렸다간 데리고 돌아갈 수 없으니까."],
|
||||
[0,"유기",null,"지령",null,71,104,72,0,160,300,null,null,"네가 강하기만 하다면 나야 아무 군소리도 안해. 어떤 목적으로 여기에 왔건 간에."],
|
||||
[0,"유겐마간",null,"영이",null,80,80,50,0,160,300,null,null],
|
||||
[0,"우카",null,0,null,60,73,82,0,160,300,null,null],
|
||||
[0,"우츠호",null,"지령",null,73,105,68,0,160,300,null,null,"이물질 발견! 핵융합로의 이물질 혼입은 일단 반응을 정지하고, 즉각 이물질을 제거하라."],
|
||||
[0,"요정5",null,0,null,55,60,35,0,160,300,null,null],
|
||||
[0,"요정4",null,0,null,55,59,34,0,160,300,null,null],
|
||||
[0,"요정3",null,0,null,55,58,33,0,160,300,null,null],
|
||||
[0,"요정2",null,0,null,55,57,32,0,160,300,null,null],
|
||||
[0,"요정1",null,0,null,55,56,31,0,160,300,null,null],
|
||||
[0,"요우무",null,"요요",null,81,89,71,0,160,300,null,null,"...요괴가 담금질한 이 누관검에, 벨 수 없는 것 따위, 별로 없어!"],
|
||||
[0,"요시카",null,"신령",null,84,78,61,0,160,300,null,null,"오~지~마~!"],
|
||||
[0,"요리히메",null,"구문",null,90,98,74,0,160,300,null,null],
|
||||
[0,"와카챠나두",null,0,null,62,61,68,0,160,300,null,null],
|
||||
[0,"와카사기",null,"휘침",null,68,57,79,0,160,300,null,null,"슬슬 우리요괴가 활약할 차례야!"],
|
||||
[0,"오토히메",null,0,null,80,60,76,0,160,300,null,null],
|
||||
[0,"오키나",null,"천공",null,87,87,86,0,160,300,null,null,"요괴가 아니라 신이에요~"],
|
||||
[0,"오모이카네",null,0,null,66,52,86,0,160,300,null,null],
|
||||
[0,"오린",null,"지령",null,87,84,77,0,160,300,null,null,"시체가 갖고 싶으니까, 역시 내가 언니를 처리해야겠네!"],
|
||||
[0,"오렌지",null,"환상",null,72,52,68,0,160,300,null,null,"아하하, 1면 보스니까라고 얕보지 말라구!"],
|
||||
[0,"오니5",null,0,null,55,65,40,0,160,300,null,null],
|
||||
[0,"오니4",null,0,null,54,64,40,0,160,300,null,null],
|
||||
[0,"오니3",null,0,null,53,63,40,0,160,300,null,null],
|
||||
[0,"오니2",null,0,null,52,62,40,0,160,300,null,null],
|
||||
[0,"오니1",null,0,null,51,61,40,0,160,300,null,null],
|
||||
[0,"엘핀민트",null,0,null,71,71,61,0,160,300,null,null],
|
||||
[0,"엘리스",null,"영이",null,55,69,88,0,160,300,null,null],
|
||||
[0,"엘리",null,"환상",null,86,83,66,0,160,300,null,null,"싸운 거 오랜만인걸 뭐."],
|
||||
[0,"엘렌",null,"몽시",null,67,62,71,0,160,300,null,null,"나는, 엘렌. 폭신폭신 엘렌이야."],
|
||||
[0,"에이린",null,"영야",null,72,76,105,0,160,300,null,null,"아하하. 너희는 어리석구나."],
|
||||
[0,"야토",null,0,null,72,83,66,0,160,300,null,null],
|
||||
[0,"야츠하시",null,"휘침",null,69,58,73,0,160,300,null,null,"훗훗후, 반역자에겐 어떤 수단이든 써도 된다면서?"],
|
||||
[0,"야마메",null,"지령",null,75,65,77,0,160,300,null,null,"지저에 떨어진 요괴의 힘을 보고 싶은 모양이구나."],
|
||||
[0,"앨리스",null,"요요",null,81,63,99,0,160,300,null,null,"그런 소리 하니까 바보 취급당하는 거야. 탄막은 브레인. 상식이야."],
|
||||
[0,"안자",null,0,null,67,61,83,0,160,300,null,null],
|
||||
[0,"안",null,0,null,68,51,67,0,160,300,null,null],
|
||||
[0,"아큐",null,"구문",null,72,30,82,0,160,300,null,null,"나는 이래뵈도 히에다가의 당주로써 환상향의 서기라는 역할을 지닌 유서깊은 집안의 사람이야."],
|
||||
[0,"아즈마",null,0,null,78,81,64,0,160,300,null,null],
|
||||
[0,"아운",null,"천공",null,78,87,65,0,160,300,null,null,"신사를 지키는 수호신으로서 말이야!"],
|
||||
[0,"아야",null,"화영",null,73,93,71,0,160,300,null,null,"깨끗하고 올바른 샤메이마루입니다."],
|
||||
[0,"아리오슈",null,0,null,56,70,67,0,160,300,null,null],
|
||||
[0,"써니",null,"구문",null,75,75,60,0,160,300,null,null,"어라, 혼자서도 최강이라며?"],
|
||||
[0,"쌍자",null,0,null,63,82,71,0,160,300,null,null],
|
||||
[0,"쌍사",null,0,null,62,73,81,0,160,300,null,null],
|
||||
[0,"신키",null,"괴기",null,96,92,73,0,160,300,null,null,"나의 세계에서 저지른 죄값은 크지. 용서할 리가 없잖아."],
|
||||
[0,"신묘마루",null,"휘침",null,85,68,88,0,160,300,null,null,"누─구?"],
|
||||
[0,"시키에이키",null,"화영",null,84,77,98,0,160,300,null,null,"보랏빛 벚꽃은 죄 깊은 인간의 영혼이 깃드는 꽃. 너는 그 보랏빛 벚꽃이 떨어져내리는 밑에서, 단죄하거라!"],
|
||||
[0,"시키에이카",null,0,null,71,60,77,0,160,300,null,null],
|
||||
[0,"시즈하",null,"풍신",null,79,55,62,0,160,300,null,null],
|
||||
[0,"시온",null,"외전",null,80,97,76,0,160,300,null,null,"나도 좋아서 가난하게 살고 있는 게 아닌데~"],
|
||||
[0,"스타",null,"구문",null,70,60,75,0,160,300,null,null,"그래, 이 비겁한 녀석아!"],
|
||||
[0,"스이카",null,"외전",null,74,102,66,0,160,300,null,null,"거짓말은 인간만 하는 거야!"],
|
||||
[0,"스와코",null,"풍신",null,95,81,81,0,160,300,null,null,"아~우~~"],
|
||||
[0,"스씨",null,0,null,66,63,66,0,160,300,null,null],
|
||||
[0,"스미레코",null,"외전",null,81,63,88,0,160,300,null,null,"히가시후카미 고등학교 1학년, 우사미 스미레코. 우는 아이도 뚝 그치는 진짜 초능력자야."],
|
||||
[0,"순호",null,"감주",null,77,102,79,0,160,300,null,null,"지금의 너로썬 내 힘 앞에선 무력, 절대적으로 무력하도다!"],
|
||||
[0,"쇼",null,"성령",null,75,75,95,0,160,300,null,null,"그것이 당신의 정의라는 거라면, 그것도 좋지요."],
|
||||
[0,"소악마",null,"홍마",null,50,72,67,0,160,300,null,null],
|
||||
[0,"셰퍼드",null,0,null,61,58,56,0,160,300,null,null],
|
||||
[0,"센고",null,0,null,83,56,79,0,160,300,null,null],
|
||||
[0,"센",null,0,null,67,66,28,0,160,300,null,null],
|
||||
[0,"세키반키",null,"휘침",null,68,75,71,0,160,300,null,null,"인간은 누구든지 나를 무서워하지!"],
|
||||
[0,"세츠조",null,0,null,58,80,58,0,160,300,null,null],
|
||||
[0,"세이자",null,"휘침",null,82,94,69,0,160,300,null,null,"내 이름은 세이자. 뼛속까지 아마노자쿠다!"],
|
||||
[0,"세이란",null,"감주",null,71,77,51,0,160,300,null,null,"뭐, 이것도 일이야, 알지? 그러니 내게 여기서 얌전히 당해 줘. 응?"],
|
||||
[0,"샤리트",null,0,null,68,62,62,0,160,300,null,null],
|
||||
[0,"상해인형",null,0,null,74,69,69,0,160,300,null,null],
|
||||
[0,"상아",null,0,null,84,84,84,0,160,300,null,null],
|
||||
[0,"사토리",null,"지령",null,81,57,84,0,160,300,null,null,"제게는 보여요. 당신이 마음속에 그리고 있는 탄막이!"],
|
||||
[0,"사토노",null,"천공",null,71,76,77,0,160,300,null,null,"봐 주진 않겠지만 죽으면 죽일꺼니까 말야―!"],
|
||||
[0,"사쿠야",null,"홍마",null,87,89,78,0,160,300,null,null,"당신의 시간 또한 나의 것"],
|
||||
[0,"사샤",null,0,null,74,48,78,0,160,300,null,null],
|
||||
[0,"사리엘",null,"영이",null,85,68,102,0,160,300,null,null,"죽는다면 모두 함께"],
|
||||
[0,"사라카",null,0,null,60,74,63,0,160,300,null,null],
|
||||
[0,"사라",null,"괴기",null,76,78,36,0,160,300,null,null,"싸우는 건 재미있지만, 지는 건 재미없어."],
|
||||
[0,"사나에",null,"풍신",null,87,71,85,0,160,300,null,null,"지금은, 바깥 세계는 환경을 지키라든가 경기 대책이 어떻다든가, 바보 같이 뭘 위해 태어난 건지 생각할 수 없는 사람 뿐."],
|
||||
[0,"사구메",null,"감주",null,84,97,71,0,160,300,null,null,"......그런건 아냐."],
|
||||
[0,"벤벤",null,"휘침",null,69,59,75,0,160,300,null,null,"어딜 봐도 츠쿠모가미잖아."],
|
||||
[0,"뱌쿠렌",null,"성령",null,83,90,82,0,160,300,null,null,"아아, 법의 세계에 빛이 가득해."],
|
||||
[0,"미호",null,0,null,85,86,62,0,160,300,null,null],
|
||||
[0,"미하나",null,0,null,76,67,84,0,160,300,null,null],
|
||||
[0,"미토리",null,0,null,57,56,62,0,160,300,null,null],
|
||||
[0,"미코토",null,0,null,73,82,82,0,160,300,null,null],
|
||||
[0,"미코",null,"신령",null,87,72,97,0,160,300,null,null,"장난은 끝이다!"],
|
||||
[0,"미요",null,0,null,73,66,58,0,160,300,null,null],
|
||||
[0,"미스티아",null,"영야",null,65,82,12,0,160,300,null,null,"자, 잠깐 기다려~!"],
|
||||
[0,"미셸",null,0,null,70,69,72,0,160,300,null,null],
|
||||
[0,"미샨드라",null,0,null,80,63,82,0,160,300,null,null],
|
||||
[0,"미샤구지",null,"풍신",null,48,99,59,0,160,300,null,null],
|
||||
[0,"미마",null,"봉마",null,75,90,93,0,160,300,null,null,"나도 인간계의 신이야. (거짓말)"],
|
||||
[0,"미노리코",null,"풍신",null,71,58,74,0,160,300,null,null,"갓 수확한 고구마는 나의 향수. 무녀가 먹게 놔둘 줄 알고!"],
|
||||
[0,"미나유",null,0,null,72,49,84,0,160,300,null,null],
|
||||
[0,"무무무",null,0,null,70,77,57,0,160,300,null,null],
|
||||
[0,"무라사",null,"성령",null,76,82,65,0,160,300,null,null,"이 세상에 미련이 남으신 분은 승선할 수 없습니다만 당신은 어떠신가요?"],
|
||||
[0,"무게츠",null,"환상",null,76,95,68,0,160,300,null,null,"난 무게츠. 그리고, 여긴 나의 세계."],
|
||||
[0,"묘렌",null,0,null,77,78,79,0,160,300,null,null],
|
||||
[0,"모코우",null,"영야",null,83,99,69,0,160,300,null,null,"너희들도 한번 영원의 고륜을 고민해 보는 게 좋아!"],
|
||||
[0,"모미지",null,"풍신",null,83,68,66,0,160,300,null,null,"높은 분들은 저희 일반 텐구보다 훨씬 강하니까, 경비 같은 건 전혀 필요하지 않을 것 같은데."],
|
||||
[0,"모모히메",null,0,null,75,68,72,0,160,300,null,null],
|
||||
[0,"모모",null,0,null,62,62,71,0,160,300,null,null],
|
||||
[0,"메이즈",null,0,null,70,40,76,0,160,300,null,null],
|
||||
[0,"메이벨",null,0,null,71,74,56,0,160,300,null,null],
|
||||
[0,"메이라",null,"봉마",null,65,82,36,0,160,300,null,null,"내가 이기면 하쿠레이의 힘은 내가 가져가겠어!"],
|
||||
[0,"메를린",null,"화영",null,73,67,70,0,160,300,null,null,"내 연주를 듣고서, 무사했던 식량은 없지."],
|
||||
[0,"메디슨",null,"화영",null,73,58,71,0,160,300,null,null,"콘파로, 콘파로, 독이여 모여라~"],
|
||||
[0,"메구미",null,0,null,83,77,74,0,160,300,null,null],
|
||||
[0,"마이",null,"괴기",null,72,60,75,0,160,300,null,null,"내가 안내할게..."],
|
||||
[0,"마을사람5",null,0,null,65,35,50,0,160,300,null,null],
|
||||
[0,"마을사람4",null,0,null,64,34,50,0,160,300,null,null],
|
||||
[0,"마을사람3",null,0,null,63,33,50,0,160,300,null,null],
|
||||
[0,"마을사람2",null,0,null,62,32,50,0,160,300,null,null],
|
||||
[0,"마을사람1",null,0,null,61,31,50,0,160,300,null,null],
|
||||
[0,"마미조",null,"신령",null,77,77,97,0,160,300,null,null,"뭔가 고민이 있는 모양이구먼. 야그나 함 들어 보자."],
|
||||
[0,"마리우스",null,0,null,67,87,66,0,160,300,null,null],
|
||||
[0,"마리사",null,0,null,83,91,78,0,160,300,null,null,"아~? 탄막에 두뇌? 바보 아냐? 탄막은 파워야."],
|
||||
[0,"마나",null,0,null,73,75,72,0,160,300,null,null],
|
||||
[0,"링고",null,"감주",null,54,76,71,0,160,300,null,null,"옛날의 극락정토는 이제 보이는 그림자도 없다고 생각해."],
|
||||
[0,"릴리",null,"요요",null,37,63,68,0,160,300,null,null,"봄이에요~"],
|
||||
[0,"린네",null,0,null,83,66,83,0,160,300,null,null],
|
||||
[0,"리코",null,0,null,68,60,76,0,160,300,null,null],
|
||||
[0,"리카코",null,"몽시",null,76,71,100,0,160,300,null,null,"왜 마법 따위에 흥미를 가지기나 하지?"],
|
||||
[0,"리카",null,"봉마",null,61,63,75,0,160,300,null,null,"가는 거예요!!"],
|
||||
[0,"리리카",null,"화영",null,57,66,83,0,160,300,null,null,"당신은 노래를 부르지. 난 손을 쓰지 않고 연주를 해. 장기전으로 가면 내 쪽이 세다고?"],
|
||||
[0,"리락",null,0,null,74,54,62,0,160,300,null,null],
|
||||
[0,"리글",null,"영야",null,85,64,51,0,160,300,null,null,"달이 보이는 밤에는, 즐기지 않아선 안 되는 거 아닐까."],
|
||||
[0,"루이즈",null,"괴기",null,59,57,72,0,160,300,null,null,"뭐, 마계는 좋은 곳이니, 느긋하게 관광이라도 하도록 해☆"],
|
||||
[0,"루미아",null,"홍마",null,79,70,56,0,160,300,null,null,"그런 건가~"],
|
||||
[0,"루리",null,0,null,66,66,62,0,160,300,null,null],
|
||||
[0,"루나사",null,"화영",null,76,77,50,0,160,300,null,null,"넌 슬픈 처지에서 태어난 경우야. 들떠있을 때가 아니지."],
|
||||
[0,"루나",null,"구문",null,67,74,74,0,160,300,null,null,"빨라고? 네녀석이 빨아라!"],
|
||||
[0,"레티",null,"요요",null,60,79,49,0,160,300,null,null,"흑막~"],
|
||||
[0,"레이센",null,"영야",null,79,78,89,0,160,300,null,null,"이 앞에 기다리고 있는 게 악몽이라 해도, 그래도 나는 가야만 해."],
|
||||
[0,"레이무",null,0,null,90,83,82,0,160,300,null,null,"인간을 쉽사리 죽게 내버려 둘까 보냐!"],
|
||||
[0,"레이라",null,0,null,66,67,51,0,160,300,null,null],
|
||||
[0,"레밀리아",null,"홍마",null,93,94,70,0,160,300,null,null,"당신은 이제껏 먹어 온 빵이 몇 개인지 알고 있어?"],
|
||||
[0,"런던인형",null,0,null,64,78,62,0,160,300,null,null],
|
||||
[0,"란",null,"요요",null,71,79,101,0,160,300,null,null,"흠. 첸을 괴롭힌건 너지?"],
|
||||
[0,"라쿠",null,0,null,71,52,69,0,160,300,null,null],
|
||||
[0,"라이코",null,"휘침",null,80,66,91,0,160,300,null,null,"누구라도 자기 목숨을 부지하고 싶으면 노력을 아끼지 않잖아?"],
|
||||
[0,"라바",null,"천공",null,69,74,54,0,160,300,null,null,"지금이라면 신세계의 신이라도 될 것 같은 기분이야!"],
|
||||
[0,"도레미",null,"감주",null,67,63,88,0,160,300,null,null,"맨몸!? 혹시 맨몸!?"],
|
||||
[0,"대요정",null,"홍마",null,60,56,79,0,160,300,null,null],
|
||||
[0,"달토끼5",null,0,null,35,55,55,0,160,300,null,null],
|
||||
[0,"달토끼4",null,0,null,34,54,55,0,160,300,null,null],
|
||||
[0,"달토끼3",null,0,null,33,53,55,0,160,300,null,null],
|
||||
[0,"달토끼2",null,0,null,32,52,55,0,160,300,null,null],
|
||||
[0,"달토끼1",null,0,null,31,51,55,0,160,300,null,null],
|
||||
[0,"니토리",null,"풍신",null,68,68,76,0,160,300,null,null,"축제 땐 생선이 잘 팔리지. 인간에게 어업권을 뺏어서 독점하면 떼돈 벌겠네!"],
|
||||
[0,"노바",null,0,null,74,56,82,0,160,300,null,null],
|
||||
[0,"노로이코",null,"봉마",null,56,61,65,0,160,300,null,null],
|
||||
[0,"네즈",null,0,null,76,71,40,0,160,300,null,null],
|
||||
[0,"네무노",null,"천공",null,78,40,67,0,160,300,null,null,"자자, 차라도 마시고 가라."],
|
||||
[0,"나즈린",null,"성령",null,76,63,64,0,160,300,null,null,"미안한데, 쥐를 얕보다간 죽어."],
|
||||
[0,"나루코",null,0,null,68,40,70,0,160,300,null,null],
|
||||
[0,"나루미",null,"천공",null,84,72,78,0,160,300,null,null,"에? 뭐야 그거 무서워"],
|
||||
[0,"구유카",null,"환상",null,84,85,85,0,160,300,null,null,"신이라 해도, 힘이야말로 전부야!"],
|
||||
[0,"구앨리스",null,"괴기",null,80,80,90,0,160,300,null,null,"궁극의 마법으로 널 해치워 주겠어!!"],
|
||||
[0,"구마리사",null,"봉마",null,80,90,80,0,160,300,null,null,"오케이~, 여기는 마리사에게 맡겨줘."],
|
||||
[0,"구레이무",null,"영이",null,90,80,80,0,160,300,null,null,"문답무용이야!!"],
|
||||
[0,"곽청아",null,"신령",null,72,77,87,0,160,300,null,null,"네~ 썩어서 귀엽죠?"],
|
||||
[0,"골리앗",null,0,null,72,78,58,0,160,300,null,null],
|
||||
[0,"겐지",null,"봉마",null,70,70,70,0,160,300,null,null],
|
||||
[0,"겐게츠",null,"환상",null,83,70,94,0,160,300,null,null,"얕보지 마. 우린, 둘이서 한 사람 몫이니까.…"],
|
||||
[0,"강림",null,0,null,84,76,57,0,160,300,null,null]
|
||||
],
|
||||
"cities":[
|
||||
|
||||
|
||||
+2
-16
@@ -18,7 +18,7 @@ if(!$npcmode) {
|
||||
|
||||
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
|
||||
|
||||
$nations = $db->queryAllLists('SELECT `name`, scoutmsg, color FROM nation');
|
||||
$nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation ORDER BY rand()');
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -61,21 +61,7 @@ history.go(-1);
|
||||
<tr><td><?=info(0)?></td></tr>
|
||||
</table>
|
||||
|
||||
|
||||
<table style="width:100%;" class="bg0 with_border">
|
||||
<thead>
|
||||
<tr><th colspan=2 class="bg1">임관 권유 메세지</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($nations as list($name, $scoutmsg, $color)): ?>
|
||||
|
||||
<tr>
|
||||
<td style='width:98px;color:<?=newColor($color)?>;background-color:<?=$color?>'><?=$name?></td>
|
||||
<td style='color:<?=newColor($color)?>;background-color:<?=$color?>'><?=$scoutmsg?:'-'?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?=getInvitationList($nationList)?>
|
||||
|
||||
<div class="bg0">
|
||||
<div class="bg1 with_border legacy_layout font1" style="text-align:center;font-weight:bold;">장수 빙의</div>
|
||||
|
||||
@@ -31,9 +31,6 @@ DROP TABLE IF EXISTS auction;
|
||||
# 통계 테이블 삭제
|
||||
DROP TABLE IF EXISTS statistic;
|
||||
|
||||
# 연감 테이블 삭제
|
||||
DROP TABLE IF EXISTS history;
|
||||
|
||||
# 이벤트 테이블 삭제
|
||||
DROP TABLE IF EXISTS event;
|
||||
|
||||
|
||||
+58
-49
@@ -362,23 +362,53 @@ ENGINE=InnoDB;
|
||||
###########################################################################
|
||||
## 명전 테이블
|
||||
###########################################################################
|
||||
create table if not exists hall (
|
||||
no int(6) not null auto_increment,
|
||||
type int(2) default 0,
|
||||
rank int(2) default 0,
|
||||
name char(64) default '',
|
||||
nation char(12) default '',
|
||||
data int(5) default 0,
|
||||
color char(12) default '',
|
||||
picture varchar(40) default '',
|
||||
|
||||
PRIMARY KEY (no),
|
||||
UNIQUE INDEX `type` (`type`, `rank`)
|
||||
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
|
||||
CREATE TABLE `ng_hall` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`server_id` CHAR(20) NOT NULL,
|
||||
`scenario` INT(11) NOT NULL,
|
||||
`general_no` INT(11) NOT NULL,
|
||||
`type` INT(11) NOT NULL,
|
||||
`value` DOUBLE NOT NULL,
|
||||
`owner` INT(11) NULL DEFAULT NULL,
|
||||
`aux` TEXT NOT NULL DEFAULT '{}',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE INDEX `server_general` (`server_id`, `type`, `general_no`),
|
||||
UNIQUE INDEX `owner` (`owner`, `server_id`, `type`),
|
||||
INDEX `server_show` (`server_id`, `type`, `value`),
|
||||
INDEX `scenario` (`scenario`, `type`, `value`)
|
||||
)
|
||||
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
|
||||
|
||||
|
||||
###########################################################################
|
||||
## 왕조 테이블
|
||||
###########################################################################
|
||||
|
||||
CREATE TABLE if not exists `ng_games` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`server_id` CHAR(20) NOT NULL,
|
||||
`date` DATETIME NOT NULL,
|
||||
`winner_nation` INT(11) NULL DEFAULT NULL,
|
||||
`scenario` INT(11) NOT NULL,
|
||||
`env` TEXT NOT NULL COMMENT 'json',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE INDEX `server_id` (`server_id`),
|
||||
INDEX `date` (`date`)
|
||||
)
|
||||
ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
CREATE TABLE `ng_old_nations` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`server_id` CHAR(20) NOT NULL DEFAULT '0',
|
||||
`nation` INT(11) NOT NULL DEFAULT '0',
|
||||
`data` LONGTEXT NOT NULL DEFAULT '0' COMMENT 'json',
|
||||
`date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `server_id` (`server_id`, `nation`)
|
||||
)
|
||||
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
|
||||
|
||||
create table if not exists emperior (
|
||||
no int(6) not null auto_increment,
|
||||
phase char(255) default '',
|
||||
@@ -416,29 +446,6 @@ create table if not exists emperior (
|
||||
PRIMARY KEY (no)
|
||||
) ENGINE=INNODB ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
INSERT IGNORE INTO `hall` (`type`, `rank`) VALUES
|
||||
( 0, 0), ( 0, 1), ( 0, 2), ( 0, 3), ( 0, 4), ( 0, 5), ( 0, 6), ( 0, 7), ( 0, 8), ( 0, 9),
|
||||
( 1, 0), ( 1, 1), ( 1, 2), ( 1, 3), ( 1, 4), ( 1, 5), ( 1, 6), ( 1, 7), ( 1, 8), ( 1, 9),
|
||||
( 2, 0), ( 2, 1), ( 2, 2), ( 2, 3), ( 2, 4), ( 2, 5), ( 2, 6), ( 2, 7), ( 2, 8), ( 2, 9),
|
||||
( 3, 0), ( 3, 1), ( 3, 2), ( 3, 3), ( 3, 4), ( 3, 5), ( 3, 6), ( 3, 7), ( 3, 8), ( 3, 9),
|
||||
( 4, 0), ( 4, 1), ( 4, 2), ( 4, 3), ( 4, 4), ( 4, 5), ( 4, 6), ( 4, 7), ( 4, 8), ( 4, 9),
|
||||
( 5, 0), ( 5, 1), ( 5, 2), ( 5, 3), ( 5, 4), ( 5, 5), ( 5, 6), ( 5, 7), ( 5, 8), ( 5, 9),
|
||||
( 6, 0), ( 6, 1), ( 6, 2), ( 6, 3), ( 6, 4), ( 6, 5), ( 6, 6), ( 6, 7), ( 6, 8), ( 6, 9),
|
||||
( 7, 0), ( 7, 1), ( 7, 2), ( 7, 3), ( 7, 4), ( 7, 5), ( 7, 6), ( 7, 7), ( 7, 8), ( 7, 9),
|
||||
( 8, 0), ( 8, 1), ( 8, 2), ( 8, 3), ( 8, 4), ( 8, 5), ( 8, 6), ( 8, 7), ( 8, 8), ( 8, 9),
|
||||
( 9, 0), ( 9, 1), ( 9, 2), ( 9, 3), ( 9, 4), ( 9, 5), ( 9, 6), ( 9, 7), ( 9, 8), ( 9, 9),
|
||||
(10, 0), (10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6), (10, 7), (10, 8), (10, 9),
|
||||
(11, 0), (11, 1), (11, 2), (11, 3), (11, 4), (11, 5), (11, 6), (11, 7), (11, 8), (11, 9),
|
||||
(12, 0), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5), (12, 6), (12, 7), (12, 8), (12, 9),
|
||||
(13, 0), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 6), (13, 7), (13, 8), (13, 9),
|
||||
(14, 0), (14, 1), (14, 2), (14, 3), (14, 4), (14, 5), (14, 6), (14, 7), (14, 8), (14, 9),
|
||||
(15, 0), (15, 1), (15, 2), (15, 3), (15, 4), (15, 5), (15, 6), (15, 7), (15, 8), (15, 9),
|
||||
(16, 0), (16, 1), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 8), (16, 9),
|
||||
(17, 0), (17, 1), (17, 2), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 8), (17, 9),
|
||||
(18, 0), (18, 1), (18, 2), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9),
|
||||
(19, 0), (19, 1), (19, 2), (19, 3), (19, 4), (19, 5), (19, 6), (19, 7), (19, 8), (19, 9),
|
||||
(20, 0), (20, 1), (20, 2), (20, 3), (20, 4), (20, 5), (20, 6), (20, 7), (20, 8), (20, 9);
|
||||
|
||||
###########################################################################
|
||||
## 외교 테이블
|
||||
###########################################################################
|
||||
@@ -525,20 +532,22 @@ create table statistic (
|
||||
###########################################################################
|
||||
## 연감 테이블
|
||||
###########################################################################
|
||||
create table history (
|
||||
no int(6) not null auto_increment,
|
||||
year int(4) default 0,
|
||||
month int(2) default 0,
|
||||
map mediumtext default '',
|
||||
log text default '',
|
||||
genlog mediumtext default '',
|
||||
nation text default '',
|
||||
power text default '',
|
||||
gen text default '',
|
||||
city text default '',
|
||||
|
||||
PRIMARY KEY (no)
|
||||
) ENGINE=INNODB ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
|
||||
CREATE TABLE if not exists `history` (
|
||||
`no` INT(6) NOT NULL AUTO_INCREMENT,
|
||||
`server_id` CHAR(20) NOT NULL DEFAULT '',
|
||||
`year` INT(4) NULL DEFAULT '0',
|
||||
`month` INT(2) NULL DEFAULT '0',
|
||||
`map` MEDIUMTEXT NULL DEFAULT '',
|
||||
`log` TEXT NULL DEFAULT '',
|
||||
`genlog` MEDIUMTEXT NULL DEFAULT '',
|
||||
`nation` TEXT NULL DEFAULT '',
|
||||
`power` TEXT NULL DEFAULT '',
|
||||
`gen` TEXT NULL DEFAULT '',
|
||||
`city` TEXT NULL DEFAULT '',
|
||||
PRIMARY KEY (`no`),
|
||||
INDEX `server_id` (`server_id`, `year`, `month`)
|
||||
)
|
||||
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
|
||||
|
||||
###########################################################################
|
||||
## 이벤트 핸들러 테이블
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<div class="rankView bg0" style="border:1px solid gray;">
|
||||
<h3 class="rankType bg1"><?=$typeName?></h3>
|
||||
<ul>
|
||||
<?php foreach($generals as $rank=>$general): ?><li class='<?=(key_exists("rankName", $general))?'no_value':''?> <?=(key_exists("serverName", $general))?'has_server':''?>'>
|
||||
<div class="hall_rank bg2 with_border">
|
||||
<?=$general['rankName']??(($rank+1).'위')?>
|
||||
</div>
|
||||
<div class="hall_img"><img width="64" height="64" src="<?=$general['pictureFullPath']?>"></div>
|
||||
<?php if(key_exists("serverName",$general)): ?>
|
||||
<div class="hall_server tooltip"><?=$general['serverName']?><?=$general['serverIdx']?>기
|
||||
<span class="tooltiptext">
|
||||
<?=$general['scenarioName']?><br>
|
||||
<?=substr($general['startTime'], 0, 10)?> ~ <?=substr($general['unitedTime'], 0, 10)?>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="hall_nation" style="background-color:<?=$general['bgColor']?>;color:<?=$general['fgColor']?>;"><?=$general['nationName']??'-'?></div>
|
||||
<div class="hall_name" style="background-color:<?=$general['bgColor']?>;color:<?=$general['fgColor']?>;"><p><?=$general['name']??'-'?>
|
||||
<?php if($general["owner_name"]??null): ?>
|
||||
<div class="hall_owner">(<?=$general['owner_name']?>)</div>
|
||||
<?php endif;?>
|
||||
</p></div>
|
||||
<div class="hall_value"><?=$general['printValue']??$general['value']?></div>
|
||||
</li><?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -0,0 +1,18 @@
|
||||
<table class="tb_layout bg0" style="margin:auto;">
|
||||
<thead>
|
||||
<tr><td colspan="2" style="text-align:center;" class="bg1">임관 권유 메시지</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($nationList as $nation): ?>
|
||||
<tr
|
||||
data-nation-id="<?=$nation['nation']?>"
|
||||
style="color:<?=$nation['textColor']?>;background-color:<?=$nation['color']?>;"
|
||||
>
|
||||
<td style="width:130px;text-align:center;"
|
||||
><?=$nation['name']?></td>
|
||||
<td style="width:870px;max-width:870px;max-height:200px;overflow:hidden;"
|
||||
><?=$nation['scoutmsg']?:'-'?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -92,12 +92,12 @@ if ($userGrade >= 5) {
|
||||
계정은 한번 등록으로 계속 사용합니다. 각 서버 리셋시 캐릭터만 새로 생성하면 됩니다.<br>
|
||||
<br>
|
||||
<span class="Entrance_Che">체섭</span> : 메인서버입니다. 천하통일에 도전하여 왕조일람과 명예의전당에 올라봅시다! (주로 1턴=60분)<br>
|
||||
<span class="Entrance_Kwe">퀘섭</span> : 실제 장수가 되어 가상의 역사를 만들어 봅시다!<br>
|
||||
<span class="Entrance_Pwe">풰섭</span> : 실제 장수들과 어울려 사실적 역사를 체험해 봅시다!<br>
|
||||
<span class="Entrance_Twe">퉤섭</span> : 주로 패치사항 미리보기 테스트 서버입니다.<br>
|
||||
<span class="Entrance_Nya">냐섭</span> : 신 서버.<br>
|
||||
<span class="Entrance_Pya">퍄섭</span> : 신 서버2.<br>
|
||||
<span class="Entrance_Hwe">훼섭</span> : 1일천하 서버. 또는 운영자 테스트용 서버입니다.<br>
|
||||
<span class="Entrance_Kwe">퀘섭</span> : 마이너 서버 그룹1. 비교적 느린 시간으로 운영됩니다.<br>
|
||||
<span class="Entrance_Pwe">풰섭</span> : 마이너 서버 그룹1. 비교적 느린 시간으로 운영됩니다.<br>
|
||||
<span class="Entrance_Twe">퉤섭</span> : 마이너 서버 그룹2. 비교적 빠른 시간으로 운영됩니다.<br>
|
||||
<span class="Entrance_Nya">냐섭</span> : 마이너 서버 그룹3. 독특한 컨셉 위주로 운영됩니다.<br>
|
||||
<span class="Entrance_Pya">퍄섭</span> : 마이너 서버 그룹3. 독특한 컨셉 위주로 운영됩니다.<br>
|
||||
<span class="Entrance_Hwe">훼섭</span> : 운영자 테스트 서버입니다. 기습적으로 열리고, 닫힐 수 있습니다.<br>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
||||
@@ -143,20 +143,42 @@ class StringUtil
|
||||
return static::padString($str, $maxsize, $ch, 0);
|
||||
}
|
||||
|
||||
public static function escapeTag($str)
|
||||
public static function escapeTag(?string $str):string
|
||||
{
|
||||
if(!$str){
|
||||
return '';
|
||||
}
|
||||
$str = htmlspecialchars($str);
|
||||
$str = str_replace(["\r\n", "\r", "\n"], '<br>', $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
public static function neutralize(?string $str, ?int $maxLen = null){
|
||||
if(!$str){
|
||||
return '';
|
||||
}
|
||||
if($maxLen && $maxLen > 0){
|
||||
$str = StringUtil::subStringForWidth($str, 0, $maxLen);
|
||||
}
|
||||
$str = htmlspecialchars($str);
|
||||
$str = StringUtil::removeSpecialCharacter($str);
|
||||
$str = WebUtil::htmlPurify($str);
|
||||
$str = StringUtil::textStrip($str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
public static function textStrip(?string $str):string{
|
||||
if(!$str){
|
||||
return '';
|
||||
}
|
||||
return preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u','',$str);
|
||||
}
|
||||
|
||||
public static function removeSpecialCharacter($str)
|
||||
{
|
||||
return str_replace([
|
||||
' ', '"', '\'', 'ⓝ', 'ⓜ', 'ⓖ', '\\', '/', '`',
|
||||
'-', '=', '[', ']', ';', ',', '.', '~', '!', '@',
|
||||
'#', '$', '%', '^', '&', '*', '(', ')', '_', '+',
|
||||
'|', '{', '}', ':', '', '<', '>', '?', ' '
|
||||
'"', '\'', 'ⓝ', 'ⓜ', 'ⓖ', '\\', '/', '`', '#',
|
||||
'-', '#', '|'
|
||||
], '', $str);
|
||||
}
|
||||
|
||||
|
||||
@@ -281,6 +281,23 @@ class Util extends \utilphp\util
|
||||
return $dict;
|
||||
}
|
||||
|
||||
/**
|
||||
* key=>value pair를 보존한 섞기
|
||||
*/
|
||||
public static function shuffle_assoc(&$array) {
|
||||
$keys = array_keys($array);
|
||||
|
||||
shuffle($keys);
|
||||
|
||||
foreach($keys as $key) {
|
||||
$new[$key] = $array[$key];
|
||||
}
|
||||
|
||||
$array = $new;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 0.0~1.0 사이의 랜덤 float
|
||||
|
||||
@@ -125,4 +125,14 @@ class WebUtil
|
||||
}
|
||||
return "<link rel='stylesheet' type='text/css' href='{$path}{$tail}' />\n";
|
||||
}
|
||||
|
||||
public static function htmlPurify(?string $text): string{
|
||||
if(!$text){
|
||||
return '';
|
||||
}
|
||||
|
||||
$config = \HTMLPurifier_HTML5Config::createDefault();
|
||||
$purifier = new \HTMLPurifier($config);
|
||||
return $purifier->purify($text);
|
||||
}
|
||||
}
|
||||
|
||||
+8
-7
@@ -6,21 +6,22 @@ $vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
|
||||
'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
|
||||
'DB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBHelper' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBTransaction' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
|
||||
'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
|
||||
'FB' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
|
||||
'FirePHP' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
|
||||
'HTMLPurifier_AttrDef_HTML_Bool2' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
|
||||
'HTMLPurifier_AttrDef_Regexp' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Regexp.php',
|
||||
'HTMLPurifier_ChildDef_Details' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Details.php',
|
||||
'HTMLPurifier_ChildDef_Figure' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Figure.php',
|
||||
'HTMLPurifier_ChildDef_Media' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Media.php',
|
||||
'HTMLPurifier_ChildDef_Picture' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Picture.php',
|
||||
'HTMLPurifier_HTML5Config' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
|
||||
'HTMLPurifier_HTML5Definition' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
|
||||
'MeekroDB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBEval' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBException' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
|
||||
'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
|
||||
'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
|
||||
'WhereClause' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'kakao\\KakaoKey' => $baseDir . '/d_setting/KakaoKey.php',
|
||||
'sammo\\RootDB' => $baseDir . '/d_setting/RootDB.php',
|
||||
|
||||
Vendored
+1
-2
@@ -6,10 +6,9 @@ $vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
||||
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
|
||||
'023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'5b154887902198b16314243c6e0e3e19' => $vendorDir . '/pguardiario/phpuri/phpuri.php',
|
||||
'870dc64919afa8b0f700701bb2c6a783' => $baseDir . '/f_config/config.php',
|
||||
|
||||
+1
-1
@@ -7,5 +7,5 @@ $baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'utilphp\\' => array($vendorDir . '/brandonwamboldt/utilphp/src'),
|
||||
'Valitron' => array($vendorDir . '/vlucas/valitron/src'),
|
||||
'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
|
||||
);
|
||||
|
||||
Vendored
+1
-1
@@ -8,7 +8,7 @@ $baseDir = dirname($vendorDir);
|
||||
return array(
|
||||
'sammo\\' => array($baseDir . '/src/sammo'),
|
||||
'kakao\\' => array($baseDir . '/src/kakao'),
|
||||
'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
|
||||
'Valitron\\' => array($vendorDir . '/vlucas/valitron/src/Valitron'),
|
||||
'Symfony\\Component\\Lock\\' => array($vendorDir . '/symfony/lock'),
|
||||
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
|
||||
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
|
||||
|
||||
Vendored
+18
-15
@@ -7,10 +7,9 @@ namespace Composer\Autoload;
|
||||
class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
|
||||
{
|
||||
public static $files = array (
|
||||
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
||||
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
||||
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
|
||||
'023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
|
||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||
'5b154887902198b16314243c6e0e3e19' => __DIR__ . '/..' . '/pguardiario/phpuri/phpuri.php',
|
||||
'870dc64919afa8b0f700701bb2c6a783' => __DIR__ . '/../..' . '/f_config/config.php',
|
||||
@@ -25,9 +24,12 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
|
||||
array (
|
||||
'kakao\\' => 6,
|
||||
),
|
||||
'V' =>
|
||||
array (
|
||||
'Valitron\\' => 9,
|
||||
),
|
||||
'S' =>
|
||||
array (
|
||||
'Symfony\\Polyfill\\Php70\\' => 23,
|
||||
'Symfony\\Component\\Lock\\' => 23,
|
||||
),
|
||||
'P' =>
|
||||
@@ -63,9 +65,9 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/src/kakao',
|
||||
),
|
||||
'Symfony\\Polyfill\\Php70\\' =>
|
||||
'Valitron\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
|
||||
0 => __DIR__ . '/..' . '/vlucas/valitron/src/Valitron',
|
||||
),
|
||||
'Symfony\\Component\\Lock\\' =>
|
||||
array (
|
||||
@@ -121,31 +123,32 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
|
||||
0 => __DIR__ . '/..' . '/brandonwamboldt/utilphp/src',
|
||||
),
|
||||
),
|
||||
'V' =>
|
||||
'H' =>
|
||||
array (
|
||||
'Valitron' =>
|
||||
'HTMLPurifier' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/vlucas/valitron/src',
|
||||
0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library',
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
|
||||
'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
|
||||
'DB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBHelper' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DBTransaction' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
|
||||
'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
|
||||
'FB' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
|
||||
'FirePHP' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
|
||||
'HTMLPurifier_AttrDef_HTML_Bool2' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
|
||||
'HTMLPurifier_AttrDef_Regexp' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Regexp.php',
|
||||
'HTMLPurifier_ChildDef_Details' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Details.php',
|
||||
'HTMLPurifier_ChildDef_Figure' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Figure.php',
|
||||
'HTMLPurifier_ChildDef_Media' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Media.php',
|
||||
'HTMLPurifier_ChildDef_Picture' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/Picture.php',
|
||||
'HTMLPurifier_HTML5Config' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
|
||||
'HTMLPurifier_HTML5Definition' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
|
||||
'MeekroDB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBEval' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'MeekroDBException' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
|
||||
'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
|
||||
'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
|
||||
'WhereClause' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
|
||||
'kakao\\KakaoKey' => __DIR__ . '/../..' . '/d_setting/KakaoKey.php',
|
||||
'sammo\\RootDB' => __DIR__ . '/../..' . '/d_setting/RootDB.php',
|
||||
|
||||
Vendored
+144
-162
@@ -47,6 +47,55 @@
|
||||
"utility"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ezyang/htmlpurifier",
|
||||
"version": "v4.10.0",
|
||||
"version_normalized": "4.10.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ezyang/htmlpurifier.git",
|
||||
"reference": "d85d39da4576a6934b72480be6978fb10c860021"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
|
||||
"reference": "d85d39da4576a6934b72480be6978fb10c860021",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"simpletest/simpletest": "^1.1"
|
||||
},
|
||||
"time": "2018-02-23T01:58:20+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"HTMLPurifier": "library/"
|
||||
},
|
||||
"files": [
|
||||
"library/HTMLPurifier.composer.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"LGPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Edward Z. Yang",
|
||||
"email": "admin@htmlpurifier.org",
|
||||
"homepage": "http://ezyang.com"
|
||||
}
|
||||
],
|
||||
"description": "Standards compliant HTML filter written in PHP",
|
||||
"homepage": "http://htmlpurifier.org/",
|
||||
"keywords": [
|
||||
"html"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "firephp/firephp-core",
|
||||
"version": "v0.4.0",
|
||||
@@ -87,17 +136,17 @@
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/guzzle",
|
||||
"version": "6.3.2",
|
||||
"version_normalized": "6.3.2.0",
|
||||
"version": "6.3.3",
|
||||
"version_normalized": "6.3.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle.git",
|
||||
"reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90"
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/68d0ea14d5a3f42a20e87632a5f84931e2709c90",
|
||||
"reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -107,13 +156,13 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-curl": "*",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4",
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
|
||||
"psr/log": "^1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"psr/log": "Required for using the Log middleware"
|
||||
},
|
||||
"time": "2018-03-26T16:33:04+00:00",
|
||||
"time": "2018-04-22T15:46:56+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
@@ -274,17 +323,17 @@
|
||||
},
|
||||
{
|
||||
"name": "leafo/scssphp",
|
||||
"version": "v0.7.5",
|
||||
"version_normalized": "0.7.5.0",
|
||||
"version": "v0.7.6",
|
||||
"version_normalized": "0.7.6.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/leafo/scssphp.git",
|
||||
"reference": "8b538d828bbb75276974605c4a1a435e939da74e"
|
||||
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/leafo/scssphp/zipball/8b538d828bbb75276974605c4a1a435e939da74e",
|
||||
"reference": "8b538d828bbb75276974605c4a1a435e939da74e",
|
||||
"url": "https://api.github.com/repos/leafo/scssphp/zipball/585f6ae84de62ffecf69c23805f25d78d7e4b794",
|
||||
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -294,7 +343,7 @@
|
||||
"phpunit/phpunit": "~4.6",
|
||||
"squizlabs/php_codesniffer": "~2.5"
|
||||
},
|
||||
"time": "2018-02-09T02:04:21+00:00",
|
||||
"time": "2018-05-24T02:18:53+00:00",
|
||||
"bin": [
|
||||
"bin/pscss"
|
||||
],
|
||||
@@ -463,56 +512,6 @@
|
||||
"psr-3"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "paragonie/random_compat",
|
||||
"version": "v2.0.12",
|
||||
"version_normalized": "2.0.12.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/paragonie/random_compat.git",
|
||||
"reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
|
||||
"reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.*|5.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||
},
|
||||
"time": "2018-04-04T21:24:14+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"lib/random.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Paragon Initiative Enterprises",
|
||||
"email": "security@paragonie.com",
|
||||
"homepage": "https://paragonie.com"
|
||||
}
|
||||
],
|
||||
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||
"keywords": [
|
||||
"csprng",
|
||||
"pseudorandom",
|
||||
"random"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "pguardiario/phpuri",
|
||||
"version": "1.0",
|
||||
@@ -541,20 +540,20 @@
|
||||
},
|
||||
{
|
||||
"name": "php-extended/php-system",
|
||||
"version": "1.3.0",
|
||||
"version_normalized": "1.3.0.0",
|
||||
"version": "1.4.0",
|
||||
"version_normalized": "1.4.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-extended/php-system.git",
|
||||
"reference": "66727d5dc0a665916bd7e08bcfb9820e7be1d20c"
|
||||
"url": "https://gitlab.com/php-extended/php-system.git",
|
||||
"reference": "9e6b3c2009ef56dc123efc43900e40cdf217ace0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-extended/php-system/zipball/66727d5dc0a665916bd7e08bcfb9820e7be1d20c",
|
||||
"reference": "66727d5dc0a665916bd7e08bcfb9820e7be1d20c",
|
||||
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-system/repository/archive.zip?sha=9e6b3c2009ef56dc123efc43900e40cdf217ace0",
|
||||
"reference": "9e6b3c2009ef56dc123efc43900e40cdf217ace0",
|
||||
"shasum": ""
|
||||
},
|
||||
"time": "2017-01-14T11:56:24+00:00",
|
||||
"time": "2018-06-07T06:03:27+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@@ -569,11 +568,11 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anastaszor",
|
||||
"role": "developer"
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A generic way to find informations about the running system",
|
||||
"homepage": "https://github.com/php-extended/php-system",
|
||||
"homepage": "https://gitlab.com/php-extended/php-system",
|
||||
"keywords": [
|
||||
"operating system",
|
||||
"os",
|
||||
@@ -583,23 +582,23 @@
|
||||
},
|
||||
{
|
||||
"name": "php-extended/php-tail",
|
||||
"version": "2.1.1",
|
||||
"version_normalized": "2.1.1.0",
|
||||
"version": "2.2.0",
|
||||
"version_normalized": "2.2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-extended/php-tail.git",
|
||||
"reference": "eabf7bee64f8c30fe9b9e1176562fdb903c54ae7"
|
||||
"url": "https://gitlab.com/php-extended/php-tail.git",
|
||||
"reference": "19fbd3a79ccc071954f28296b2c44754335304a0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-extended/php-tail/zipball/eabf7bee64f8c30fe9b9e1176562fdb903c54ae7",
|
||||
"reference": "eabf7bee64f8c30fe9b9e1176562fdb903c54ae7",
|
||||
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-tail/repository/archive.zip?sha=19fbd3a79ccc071954f28296b2c44754335304a0",
|
||||
"reference": "19fbd3a79ccc071954f28296b2c44754335304a0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php-extended/php-system": "^1.2"
|
||||
},
|
||||
"time": "2017-07-25T13:52:42+00:00",
|
||||
"time": "2018-06-07T06:04:58+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@@ -614,11 +613,11 @@
|
||||
"authors": [
|
||||
{
|
||||
"name": "Anastaszor",
|
||||
"role": "developer"
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A smart way to tail files depending of the environment",
|
||||
"homepage": "https://github.com/php-extended/php-tail",
|
||||
"homepage": "https://gitlab.com/php-extended/php-tail",
|
||||
"keywords": [
|
||||
"cheat",
|
||||
"mighty",
|
||||
@@ -775,32 +774,31 @@
|
||||
},
|
||||
{
|
||||
"name": "symfony/lock",
|
||||
"version": "v3.4.9",
|
||||
"version_normalized": "3.4.9.0",
|
||||
"version": "v4.1.0",
|
||||
"version_normalized": "4.1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/lock.git",
|
||||
"reference": "3a707193326d31603824706e34a95af899a59788"
|
||||
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/lock/zipball/3a707193326d31603824706e34a95af899a59788",
|
||||
"reference": "3a707193326d31603824706e34a95af899a59788",
|
||||
"url": "https://api.github.com/repos/symfony/lock/zipball/a1df50492e927ad00ca271f29adb2949a14f2a5a",
|
||||
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.5.9|>=7.0.8",
|
||||
"psr/log": "~1.0",
|
||||
"symfony/polyfill-php70": "~1.0"
|
||||
"php": "^7.1.3",
|
||||
"psr/log": "~1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"predis/predis": "~1.0"
|
||||
},
|
||||
"time": "2018-04-29T14:44:26+00:00",
|
||||
"time": "2018-05-30T07:26:09+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.4-dev"
|
||||
"dev-master": "4.1-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
@@ -837,99 +835,41 @@
|
||||
"semaphore"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php70",
|
||||
"version": "v1.8.0",
|
||||
"version_normalized": "1.8.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php70.git",
|
||||
"reference": "77454693d8f10dd23bb24955cffd2d82db1007a6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6",
|
||||
"reference": "77454693d8f10dd23bb24955cffd2d82db1007a6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"paragonie/random_compat": "~1.0|~2.0",
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"time": "2018-04-26T10:06:28+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.8-dev"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php70\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"classmap": [
|
||||
"Resources/stubs"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"polyfill",
|
||||
"portable",
|
||||
"shim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "vlucas/valitron",
|
||||
"version": "v1.4.2",
|
||||
"version_normalized": "1.4.2.0",
|
||||
"version": "v1.4.3",
|
||||
"version_normalized": "1.4.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/vlucas/valitron.git",
|
||||
"reference": "87775d76268beda2afa085bdd6e44b17e98907c6"
|
||||
"reference": "3c5463315bfa23b17f8949b100a960d035234e43"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/87775d76268beda2afa085bdd6e44b17e98907c6",
|
||||
"reference": "87775d76268beda2afa085bdd6e44b17e98907c6",
|
||||
"url": "https://api.github.com/repos/vlucas/valitron/zipball/3c5463315bfa23b17f8949b100a960d035234e43",
|
||||
"reference": "3c5463315bfa23b17f8949b100a960d035234e43",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.5 || ^6.5"
|
||||
},
|
||||
"time": "2017-10-30T23:15:06+00:00",
|
||||
"suggest": {
|
||||
"ext-mbstring": "It can support the multiple bytes string length."
|
||||
},
|
||||
"time": "2018-05-06T10:45:26+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Valitron": "src/"
|
||||
"psr-4": {
|
||||
"Valitron\\": "src/Valitron"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD"
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
@@ -945,5 +885,47 @@
|
||||
"validation",
|
||||
"validator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "xemlock/htmlpurifier-html5",
|
||||
"version": "v0.1.7",
|
||||
"version_normalized": "0.1.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/xemlock/htmlpurifier-html5.git",
|
||||
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/xemlock/htmlpurifier-html5/zipball/b4b35e51ec75e0207c23035f7d9a354bdcdac359",
|
||||
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ezyang/htmlpurifier": "^4.7",
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.7.*|5.7.*"
|
||||
},
|
||||
"time": "2018-06-07T14:30:17+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"library/HTMLPurifier/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "xemlock",
|
||||
"email": "xemlock@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "HTML Purifier definitions for HTML5 elements"
|
||||
}
|
||||
]
|
||||
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
|
||||
CREDITS
|
||||
|
||||
Almost everything written by Edward Z. Yang (Ambush Commander). Lots of thanks
|
||||
to the DevNetwork Community for their help (see docs/ref-devnetwork.html for
|
||||
more details), Feyd especially (namely IPv6 and optimization). Thanks to RSnake
|
||||
for letting me package his fantastic XSS cheatsheet for a smoketest.
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
Vendored
+373
@@ -0,0 +1,373 @@
|
||||
|
||||
Install
|
||||
How to install HTML Purifier
|
||||
|
||||
HTML Purifier is designed to run out of the box, so actually using the
|
||||
library is extremely easy. (Although... if you were looking for a
|
||||
step-by-step installation GUI, you've downloaded the wrong software!)
|
||||
|
||||
While the impatient can get going immediately with some of the sample
|
||||
code at the bottom of this library, it's well worth reading this entire
|
||||
document--most of the other documentation assumes that you are familiar
|
||||
with these contents.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
1. Compatibility
|
||||
|
||||
HTML Purifier is PHP 5 and PHP 7, and is actively tested from PHP 5.0.5
|
||||
and up. It has no core dependencies with other libraries.
|
||||
|
||||
These optional extensions can enhance the capabilities of HTML Purifier:
|
||||
|
||||
* iconv : Converts text to and from non-UTF-8 encodings
|
||||
* bcmath : Used for unit conversion and imagecrash protection
|
||||
* tidy : Used for pretty-printing HTML
|
||||
|
||||
These optional libraries can enhance the capabilities of HTML Purifier:
|
||||
|
||||
* CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
|
||||
Note: You should use the modernized fork of CSSTidy available
|
||||
at https://github.com/Cerdic/CSSTidy
|
||||
* Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
|
||||
Note: This is not necessary for PHP 5.3 or later
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
2. Reconnaissance
|
||||
|
||||
A big plus of HTML Purifier is its inerrant support of standards, so
|
||||
your web-pages should be standards-compliant. (They should also use
|
||||
semantic markup, but that's another issue altogether, one HTML Purifier
|
||||
cannot fix without reading your mind.)
|
||||
|
||||
HTML Purifier can process these doctypes:
|
||||
|
||||
* XHTML 1.0 Transitional (default)
|
||||
* XHTML 1.0 Strict
|
||||
* HTML 4.01 Transitional
|
||||
* HTML 4.01 Strict
|
||||
* XHTML 1.1
|
||||
|
||||
...and these character encodings:
|
||||
|
||||
* UTF-8 (default)
|
||||
* Any encoding iconv supports (with crippled internationalization support)
|
||||
|
||||
These defaults reflect what my choices would be if I were authoring an
|
||||
HTML document, however, what you choose depends on the nature of your
|
||||
codebase. If you don't know what doctype you are using, you can determine
|
||||
the doctype from this identifier at the top of your source code:
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
...and the character encoding from this code:
|
||||
|
||||
<meta http-equiv="Content-type" content="text/html;charset=ENCODING">
|
||||
|
||||
If the character encoding declaration is missing, STOP NOW, and
|
||||
read 'docs/enduser-utf8.html' (web accessible at
|
||||
http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
|
||||
present, read this document anyway, as many websites specify their
|
||||
document's character encoding incorrectly.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
3. Including the library
|
||||
|
||||
The procedure is quite simple:
|
||||
|
||||
require_once '/path/to/library/HTMLPurifier.auto.php';
|
||||
|
||||
This will setup an autoloader, so the library's files are only included
|
||||
when you use them.
|
||||
|
||||
Only the contents in the library/ folder are necessary, so you can remove
|
||||
everything else when using HTML Purifier in a production environment.
|
||||
|
||||
If you installed HTML Purifier via PEAR, all you need to do is:
|
||||
|
||||
require_once 'HTMLPurifier.auto.php';
|
||||
|
||||
Please note that the usual PEAR practice of including just the classes you
|
||||
want will not work with HTML Purifier's autoloading scheme.
|
||||
|
||||
Advanced users, read on; other users can skip to section 4.
|
||||
|
||||
Autoload compatibility
|
||||
----------------------
|
||||
|
||||
HTML Purifier attempts to be as smart as possible when registering an
|
||||
autoloader, but there are some cases where you will need to change
|
||||
your own code to accomodate HTML Purifier. These are those cases:
|
||||
|
||||
PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
|
||||
Because spl_autoload_register() doesn't exist in early versions
|
||||
of PHP 5, HTML Purifier has no way of adding itself to the autoload
|
||||
stack. Modify your __autoload function to test
|
||||
HTMLPurifier_Bootstrap::autoload($class)
|
||||
|
||||
For example, suppose your autoload function looks like this:
|
||||
|
||||
function __autoload($class) {
|
||||
require str_replace('_', '/', $class) . '.php';
|
||||
return true;
|
||||
}
|
||||
|
||||
A modified version with HTML Purifier would look like this:
|
||||
|
||||
function __autoload($class) {
|
||||
if (HTMLPurifier_Bootstrap::autoload($class)) return true;
|
||||
require str_replace('_', '/', $class) . '.php';
|
||||
return true;
|
||||
}
|
||||
|
||||
Note that there *is* some custom behavior in our autoloader; the
|
||||
original autoloader in our example would work for 99% of the time,
|
||||
but would fail when including language files.
|
||||
|
||||
AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
|
||||
spl_autoload_register() has the curious behavior of disabling
|
||||
the existing __autoload() handler. Users need to explicitly
|
||||
spl_autoload_register('__autoload'). Because we use SPL when it
|
||||
is available, __autoload() will ALWAYS be disabled. If __autoload()
|
||||
is declared before HTML Purifier is loaded, this is not a problem:
|
||||
HTML Purifier will register the function for you. But if it is
|
||||
declared afterwards, it will mysteriously not work. This
|
||||
snippet of code (after your autoloader is defined) will fix it:
|
||||
|
||||
spl_autoload_register('__autoload')
|
||||
|
||||
Users should also be on guard if they use a version of PHP previous
|
||||
to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
|
||||
for you, which can collide with an autoloader that was added by *you*
|
||||
later.
|
||||
|
||||
|
||||
For better performance
|
||||
----------------------
|
||||
|
||||
Opcode caches, which greatly speed up PHP initialization for scripts
|
||||
with large amounts of code (HTML Purifier included), don't like
|
||||
autoloaders. We offer an include file that includes all of HTML Purifier's
|
||||
files in one go in an opcode cache friendly manner:
|
||||
|
||||
// If /path/to/library isn't already in your include path, uncomment
|
||||
// the below line:
|
||||
// require '/path/to/library/HTMLPurifier.path.php';
|
||||
|
||||
require 'HTMLPurifier.includes.php';
|
||||
|
||||
Optional components still need to be included--you'll know if you try to
|
||||
use a feature and you get a class doesn't exists error! The autoloader
|
||||
can be used in conjunction with this approach to catch classes that are
|
||||
missing. Simply add this afterwards:
|
||||
|
||||
require 'HTMLPurifier.autoload.php';
|
||||
|
||||
Standalone version
|
||||
------------------
|
||||
|
||||
HTML Purifier has a standalone distribution; you can also generate
|
||||
a standalone file from the full version by running the script
|
||||
maintenance/generate-standalone.php . The standalone version has the
|
||||
benefit of having most of its code in one file, so parsing is much
|
||||
faster and the library is easier to manage.
|
||||
|
||||
If HTMLPurifier.standalone.php exists in the library directory, you
|
||||
can use it like this:
|
||||
|
||||
require '/path/to/HTMLPurifier.standalone.php';
|
||||
|
||||
This is equivalent to including HTMLPurifier.includes.php, except that
|
||||
the contents of standalone/ will be added to your path. To override this
|
||||
behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
|
||||
be found (usually, this will be one directory up, the "true" library
|
||||
directory in full distributions). Don't forget to set your path too!
|
||||
|
||||
The autoloader can be added to the end to ensure the classes are
|
||||
loaded when necessary; otherwise you can manually include them.
|
||||
To use the autoloader, use this:
|
||||
|
||||
require 'HTMLPurifier.autoload.php';
|
||||
|
||||
For advanced users
|
||||
------------------
|
||||
|
||||
HTMLPurifier.auto.php performs a number of operations that can be done
|
||||
individually. These are:
|
||||
|
||||
HTMLPurifier.path.php
|
||||
Puts /path/to/library in the include path. For high performance,
|
||||
this should be done in php.ini.
|
||||
|
||||
HTMLPurifier.autoload.php
|
||||
Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
|
||||
|
||||
You can do these operations by yourself--in fact, you must modify your own
|
||||
autoload handler if you are using a version of PHP earlier than PHP 5.1.2
|
||||
(See "Autoload compatibility" above).
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
4. Configuration
|
||||
|
||||
HTML Purifier is designed to run out-of-the-box, but occasionally HTML
|
||||
Purifier needs to be told what to do. If you answer no to any of these
|
||||
questions, read on; otherwise, you can skip to the next section (or, if you're
|
||||
into configuring things just for the heck of it, skip to 4.3).
|
||||
|
||||
* Am I using UTF-8?
|
||||
* Am I using XHTML 1.0 Transitional?
|
||||
|
||||
If you answered no to any of these questions, instantiate a configuration
|
||||
object and read on:
|
||||
|
||||
$config = HTMLPurifier_Config::createDefault();
|
||||
|
||||
|
||||
4.1. Setting a different character encoding
|
||||
|
||||
You really shouldn't use any other encoding except UTF-8, especially if you
|
||||
plan to support multilingual websites (read section three for more details).
|
||||
However, switching to UTF-8 is not always immediately feasible, so we can
|
||||
adapt.
|
||||
|
||||
HTML Purifier uses iconv to support other character encodings, as such,
|
||||
any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
|
||||
HTML Purifier supports with this code:
|
||||
|
||||
$config->set('Core.Encoding', /* put your encoding here */);
|
||||
|
||||
An example usage for Latin-1 websites (the most common encoding for English
|
||||
websites):
|
||||
|
||||
$config->set('Core.Encoding', 'ISO-8859-1');
|
||||
|
||||
Note that HTML Purifier's support for non-Unicode encodings is crippled by the
|
||||
fact that any character not supported by that encoding will be silently
|
||||
dropped, EVEN if it is ampersand escaped. If you want to work around
|
||||
this, you are welcome to read docs/enduser-utf8.html for a fix,
|
||||
but please be cognizant of the issues the "solution" creates (for this
|
||||
reason, I do not include the solution in this document).
|
||||
|
||||
|
||||
4.2. Setting a different doctype
|
||||
|
||||
For those of you using HTML 4.01 Transitional, you can disable
|
||||
XHTML output like this:
|
||||
|
||||
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
|
||||
|
||||
Other supported doctypes include:
|
||||
|
||||
* HTML 4.01 Strict
|
||||
* HTML 4.01 Transitional
|
||||
* XHTML 1.0 Strict
|
||||
* XHTML 1.0 Transitional
|
||||
* XHTML 1.1
|
||||
|
||||
|
||||
4.3. Other settings
|
||||
|
||||
There are more configuration directives which can be read about
|
||||
here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
|
||||
but they can help out for those of you who like to exert maximum control over
|
||||
your code. Some of the more interesting ones are configurable at the
|
||||
demo <http://htmlpurifier.org/demo.php> and are well worth looking into
|
||||
for your own system.
|
||||
|
||||
For example, you can fine tune allowed elements and attributes, convert
|
||||
relative URLs to absolute ones, and even autoparagraph input text! These
|
||||
are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
|
||||
%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
|
||||
translates to:
|
||||
|
||||
$config->set('Namespace.Directive', $value);
|
||||
|
||||
E.g.
|
||||
|
||||
$config->set('HTML.Allowed', 'p,b,a[href],i');
|
||||
$config->set('URI.Base', 'http://www.example.com');
|
||||
$config->set('URI.MakeAbsolute', true);
|
||||
$config->set('AutoFormat.AutoParagraph', true);
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
5. Caching
|
||||
|
||||
HTML Purifier generates some cache files (generally one or two) to speed up
|
||||
its execution. For maximum performance, make sure that
|
||||
library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
|
||||
|
||||
If you are in the library/ folder of HTML Purifier, you can set the
|
||||
appropriate permissions using:
|
||||
|
||||
chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
|
||||
|
||||
If the above command doesn't work, you may need to assign write permissions
|
||||
to group:
|
||||
|
||||
chmod -R 0775 HTMLPurifier/DefinitionCache/Serializer
|
||||
|
||||
You can also chmod files via your FTP client; this option
|
||||
is usually accessible by right clicking the corresponding directory and
|
||||
then selecting "chmod" or "file permissions".
|
||||
|
||||
Starting with 2.0.1, HTML Purifier will generate friendly error messages
|
||||
that will tell you exactly what you have to chmod the directory to, if in doubt,
|
||||
follow its advice.
|
||||
|
||||
If you are unable or unwilling to give write permissions to the cache
|
||||
directory, you can either disable the cache (and suffer a performance
|
||||
hit):
|
||||
|
||||
$config->set('Core.DefinitionCache', null);
|
||||
|
||||
Or move the cache directory somewhere else (no trailing slash):
|
||||
|
||||
$config->set('Cache.SerializerPath', '/home/user/absolute/path');
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
6. Using the code
|
||||
|
||||
The interface is mind-numbingly simple:
|
||||
|
||||
$purifier = new HTMLPurifier($config);
|
||||
$clean_html = $purifier->purify( $dirty_html );
|
||||
|
||||
That's it! For more examples, check out docs/examples/ (they aren't very
|
||||
different though). Also, docs/enduser-slow.html gives advice on what to
|
||||
do if HTML Purifier is slowing down your application.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
7. Quick install
|
||||
|
||||
First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
|
||||
writable by the webserver (see Section 5: Caching above for details).
|
||||
If your website is in UTF-8 and XHTML Transitional, use this code:
|
||||
|
||||
<?php
|
||||
require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
|
||||
|
||||
$config = HTMLPurifier_Config::createDefault();
|
||||
$purifier = new HTMLPurifier($config);
|
||||
$clean_html = $purifier->purify($dirty_html);
|
||||
?>
|
||||
|
||||
If your website is in a different encoding or doctype, use this code:
|
||||
|
||||
<?php
|
||||
require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
|
||||
|
||||
$config = HTMLPurifier_Config::createDefault();
|
||||
$config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
|
||||
$config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
|
||||
$purifier = new HTMLPurifier($config);
|
||||
|
||||
$clean_html = $purifier->purify($dirty_html);
|
||||
?>
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
|
||||
Installation
|
||||
Comment installer HTML Purifier
|
||||
|
||||
Attention : Ce document est encodé en UTF-8, si les lettres avec des accents
|
||||
ne s'affichent pas, prenez un meilleur éditeur de texte.
|
||||
|
||||
L'installation de HTML Purifier est très simple, parce qu'il n'a pas besoin
|
||||
de configuration. Pour les utilisateurs impatients, le code se trouve dans le
|
||||
pied de page, mais je recommande de lire le document.
|
||||
|
||||
1. Compatibilité
|
||||
|
||||
HTML Purifier fonctionne avec PHP 5. PHP 5.0.5 est la dernière version testée.
|
||||
Il ne dépend pas d'autres librairies.
|
||||
|
||||
Les extensions optionnelles sont iconv (généralement déjà installée) et tidy
|
||||
(répendue aussi). Si vous utilisez UTF-8 et que vous ne voulez pas l'indentation,
|
||||
vous pouvez utiliser HTML Purifier sans ces extensions.
|
||||
|
||||
|
||||
2. Inclure la librairie
|
||||
|
||||
Quand vous devez l'utilisez, incluez le :
|
||||
|
||||
require_once('/path/to/library/HTMLPurifier.auto.php');
|
||||
|
||||
Ne pas l'inclure si ce n'est pas nécessaire, car HTML Purifier est lourd.
|
||||
|
||||
HTML Purifier utilise "autoload". Si vous avez défini la fonction __autoload,
|
||||
vous devez ajouter cette fonction :
|
||||
|
||||
spl_autoload_register('__autoload')
|
||||
|
||||
Plus d'informations dans le document "INSTALL".
|
||||
|
||||
3. Installation rapide
|
||||
|
||||
Si votre site Web est en UTF-8 et XHTML Transitional, utilisez :
|
||||
|
||||
<?php
|
||||
require_once('/path/to/htmlpurifier/library/HTMLPurifier.auto.php');
|
||||
$purificateur = new HTMLPurifier();
|
||||
$html_propre = $purificateur->purify($html_a_purifier);
|
||||
?>
|
||||
|
||||
Sinon, utilisez :
|
||||
|
||||
<?php
|
||||
require_once('/path/to/html/purifier/library/HTMLPurifier.auto.load');
|
||||
$config = $HTMLPurifier_Config::createDefault();
|
||||
$config->set('Core', 'Encoding', 'ISO-8859-1'); //Remplacez par votre
|
||||
encodage
|
||||
$config->set('Core', 'XHTML', true); //Remplacer par false si HTML 4.01
|
||||
$purificateur = new HTMLPurifier($config);
|
||||
$html_propre = $purificateur->purify($html_a_purifier);
|
||||
?>
|
||||
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
Vendored
+504
@@ -0,0 +1,504 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
Vendored
+1190
@@ -0,0 +1,1190 @@
|
||||
NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
|
||||
= KEY ====================
|
||||
# Breaks back-compat
|
||||
! Feature
|
||||
- Bugfix
|
||||
+ Sub-comment
|
||||
. Internal change
|
||||
==========================
|
||||
|
||||
4.10.0, released 2018-02-22
|
||||
# PHP 5.3 is no longer officially supported by HTML Purifier
|
||||
(we did not specifically break support, but we are no longer
|
||||
testing on PHP 5.3)
|
||||
! Relative CSS length units are now supported
|
||||
- A few PHP 7.2 compatibility fixes, thanks John Flatness
|
||||
<john@zerocrates.org>
|
||||
- Improve portability with old versions of libxml which don't
|
||||
support accessing the data of a node
|
||||
- IDNA2008 is now used for converting domains to ASCII, fixing
|
||||
some rather strange bugs with international domains
|
||||
- Fix race condition resulting in E_WARNING when creating
|
||||
directories with Serializer
|
||||
|
||||
4.9.3, released 2017-06-02
|
||||
- Workaround PHP 7.1 infinite loop when opcode cache is enabled.
|
||||
Thanks @Xiphin (#134, #135)
|
||||
- Don't use autoloader when testing for DOMDocument. Hypothetically,
|
||||
this could cause your install to start using DirectLex if you had
|
||||
previously been monkeypatching in a custom, autoloaded implementation
|
||||
of DOMDocument. Don't do that. Thanks @Izumi-kun (#130)
|
||||
|
||||
4.9.2, released 2017-03-12
|
||||
- Fixes PHP 5.3 compatibility
|
||||
- Fix breakage when decoding decimal entities. Thanks @rybakit (#129)
|
||||
|
||||
4.9.1, released 2017-03-08
|
||||
! %URI.DefaultScheme can now be set to null, in which case
|
||||
all relative paths are removed.
|
||||
! New CSS properties: min-width, max-width, min-height, max-height (#94)
|
||||
! Transparency (rgba) and hsl/hsla supported where color CSS is present.
|
||||
Thanks @fxbt for contributing the patch. (#118)
|
||||
- When idn_to_ascii is defined, we might accept malformed
|
||||
hostnames. Apply validation to the result in such cases.
|
||||
- Close directory when done in Serializer DefinitionCache (#100)
|
||||
- Deleted some asserts to avoid linters from choking (#97)
|
||||
- Rework Serializer cache behavior to avoid chmod'ing if possible (#32)
|
||||
- Embedded semicolons in strings in CSS are now handled correctly!
|
||||
- We accidentally dropped certain Unicode characters if there was
|
||||
one or more invalid characters. This has been fixed, thanks
|
||||
to mpyw <ryosuke_i_628@yahoo.co.jp>
|
||||
- Fix for "Don't truncate upon encountering </div> when using DOMLex"
|
||||
caused a regression with HTML 4.01 Strict parsing with libxml 2.9.1
|
||||
(and maybe later versions, but known OK with libxml 2.9.4). The
|
||||
fix is to go about handling truncation a bit more cleverly so that
|
||||
we can wrap with divs (sidestepping the bug) but slurping out the
|
||||
rest of the text in case it ran off the end. (#78)
|
||||
- Fix PREG_BACKTRACK_LIMIT_ERROR in HTMLPurifier_Filter_ExtractStyle.
|
||||
Thanks @breathbath for contributing the report and fix (#120)
|
||||
- Fix entity decoding algorithm to be more conservative about
|
||||
decoding entities that are missing trailing semicolon.
|
||||
To get old behavior, set %Core.LegacyEntityDecoder to true.
|
||||
(#119)
|
||||
- Workaround libxml bug when HTML tags are embedded inside
|
||||
script tags. To disable workaround set %Core.AggressivelyRemoveScript
|
||||
to false. (#83)
|
||||
# By default, when a link has a target attribute associated
|
||||
with it, we now also add rel="noopener" in order to
|
||||
prevent the new window from being able to overwrite
|
||||
the original frame. To disable this protection,
|
||||
set %HTML.TargetNoopener to FALSE.
|
||||
|
||||
4.9.0 was cut on Git but never properly released; when we did the
|
||||
real release we decided to skip this version number.
|
||||
|
||||
4.8.0, released 2016-07-16
|
||||
# By default, when a link has a target attribute associated
|
||||
with it, we now also add rel="noreferrer" in order to
|
||||
prevent the new window from being able to overwrite
|
||||
the original frame. To disable this protection,
|
||||
set %HTML.TargetNoreferrer to FALSE.
|
||||
! Full PHP 7 compatibility, the test suite is ALL GO.
|
||||
! %CSS.AllowDuplicates permits duplicate CSS properties.
|
||||
! Support for 'tel' URIs.
|
||||
! Partial support for 'border-radius' properties when %CSS.AllowProprietary is true.
|
||||
The slash syntax, i.e., 'border-radius: 2em 1em 4em / 0.5em 3em' is not
|
||||
yet supported.
|
||||
! %Attr.ID.HTML5 turns on HTML5-style ID handling.
|
||||
- alt truncation could result in malformed UTF-8 sequence. Don't
|
||||
truncate. Thanks Brandon Farber for reporting.
|
||||
- Linkify regex is smarter, based off of Gruber's regex.
|
||||
- IDNA supported natively on PHP 5.3 and later.
|
||||
- Non all-numeric top-level names (e.g., foo.1f, 1f) are now
|
||||
allowed.
|
||||
- Minor bounds error fix to squash a PHP 7 notice.
|
||||
- Support non-/tmp temporary directories for data:// validation
|
||||
- Give a better error message when a user attempts to allow
|
||||
ul/ol without allowing li.
|
||||
- On some versions of PHP, the Serializer DefinitionCache could
|
||||
infinite loop when the directory exists but is not listable. (#49)
|
||||
- Don't match for <body> inside comments with
|
||||
%Core.ConvertDocumentToFragment. (#67)
|
||||
- SafeObject is now less case sensitive. (#57)
|
||||
- AutoFormat.RemoveEmpty.Predicate now correctly renders in
|
||||
web form. (#85)
|
||||
|
||||
4.7.0, released 2015-08-04
|
||||
# opacity is now considered a "tricky" CSS property rather than a
|
||||
proprietary one.
|
||||
! %AutoFormat.RemoveEmpty.Predicate for specifying exactly when
|
||||
an element should be considered "empty" (maybe preserve if it
|
||||
has attributes), and modify iframe support so that the iframe
|
||||
is removed if it is missing a src attribute. Thanks meeva for
|
||||
reporting.
|
||||
- Don't truncate upon encountering </div> when using DOMLex. Thanks
|
||||
Myrto Christina for finally convincing me to fix this.
|
||||
- Update YouTube filter for new code.
|
||||
- Fix parsing of rgb() values with spaces in them for 'border'
|
||||
attribute.
|
||||
- Don't remove foo="" attributes if foo is a boolean attribute. Thanks
|
||||
valME for reporting.
|
||||
|
||||
4.6.0, released 2013-11-30
|
||||
# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
|
||||
Please update any verification scripts you may have.
|
||||
# URI parsing algorithm was made more strict, so only prefixes which
|
||||
looks like schemes will actually be schemes. Thanks
|
||||
Michael Gusev <mgusev@sugarcrm.com> for fixing.
|
||||
# %Core.EscapeInvalidChildren is no longer supported, and no longer does
|
||||
anything.
|
||||
! New directive %Core.AllowHostnameUnderscore which allows underscores
|
||||
in hostnames.
|
||||
- Eliminate quadratic behavior in DOMLex by using a proper queue.
|
||||
Thanks Ole Laursen for noticing this.
|
||||
- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
|
||||
behavior in the rest of the purificaiton pipeline. Thanks Chedburn
|
||||
Networks for sponsoring this work.
|
||||
- Made Linkify URL parser a bit less permissive, so that non-breaking
|
||||
spaces and commas are not included as part of URL. Thanks nAS for fixing.
|
||||
- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
|
||||
David Hirtz for reporting.
|
||||
- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
|
||||
for reporting.
|
||||
|
||||
4.5.0, released 2013-02-17
|
||||
# Fix bug where stacked attribute transforms clobber each other;
|
||||
this also means it's no longer possible to override attribute
|
||||
transforms in later modules. No internal code was using this
|
||||
but this may break some clients.
|
||||
# We now use SHA-1 to identify cached definitions, instead of MD5.
|
||||
! Support display:inline-block
|
||||
! Support for more white-space CSS values.
|
||||
! Permit underscores in font families
|
||||
! Support for page-break-* CSS3 properties when proprietary properties
|
||||
are enabled.
|
||||
! New directive %Core.DisableExcludes; can be set to 'true' to turn off
|
||||
SGML excludes checking. If HTML Purifier is removing too much text
|
||||
and you don't care about full standards compliance, try setting this to
|
||||
'true'.
|
||||
- Use prepend for SPL autoloading on PHP 5.3 and later.
|
||||
- Fix bug with nofollow transform when pre-existing rel exists.
|
||||
- Fix bug where background:url() always gets lower-cased
|
||||
(but not background-image:url())
|
||||
- Fix bug with non lower-case color names in HTML
|
||||
- Fix bug where data URI validation doesn't remove temporary files.
|
||||
Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
|
||||
- Don't remove certain empty tags on RemoveEmpty.
|
||||
|
||||
4.4.0, released 2012-01-18
|
||||
# Removed PEARSax3 handler.
|
||||
# URI.Munge now munges URIs inside the same host that go from https
|
||||
to http. Reported by Neike Taika-Tessaro.
|
||||
# Core.EscapeNonASCIICharacters now always transforms entities to
|
||||
entities, even if target encoding is UTF-8.
|
||||
# Tighten up selector validation in ExtractStyleBlocks.
|
||||
Non-syntactically valid selectors are now rejected, along with
|
||||
some of the more obscure ones such as attribute selectors, the
|
||||
:lang pseudoselector, and anything not in CSS2.1. Furthermore,
|
||||
ID and class selectors now work properly with the relevant
|
||||
configuration attributes. Also, mute errors when parsing CSS
|
||||
with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
|
||||
! Added support for 'scope' attribute on tables.
|
||||
! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
|
||||
! Properly handle sub-lists directly nested inside of lists in
|
||||
a standards compliant way, by moving them into the preceding <li>
|
||||
! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
|
||||
limited allowed comments in untrusted situations.
|
||||
! Implement iframes, and allow them to be used in untrusted mode with
|
||||
%HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
|
||||
<brad.froehle@gmail.com> for submitting an initial version of the patch.
|
||||
! The Forms module now works properly for transitional doctypes.
|
||||
! Added support for internationalized domain names. You need the PEAR
|
||||
Net_IDNA2 module to be in your path; if it is installed, ensure the
|
||||
class can be loaded and then set %Core.EnableIDNA to true.
|
||||
- Color keywords are now case insensitive. Thanks Yzmir Ramirez
|
||||
<yramirez-htmlpurifier@adicio.com> for reporting.
|
||||
- Explicitly initialize anonModule variable to null.
|
||||
- Do not duplicate nofollow if already present. Thanks 178
|
||||
for reporting.
|
||||
- Do not add nofollow if hostname matches our current host. Thanks 178
|
||||
for reporting, and Neike Taika-Tessaro for helping diagnose.
|
||||
- Do not unset parser variable; this fixes intermittent serialization
|
||||
problems. Thanks Neike Taika-Tessaro for reporting, bill
|
||||
<10010tiger@gmail.com> for diagnosing.
|
||||
- Fix iconv truncation bug, where non-UTF-8 target encodings see
|
||||
output truncated after around 8000 characters. Thanks Jörg Ludwig
|
||||
<joerg.ludwig@iserv.eu> for reporting.
|
||||
- Fix broken table content model for XHTML1.1 (and also earlier
|
||||
versions, although the W3C validator doesn't catch those violations).
|
||||
Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
|
||||
|
||||
4.3.0, released 2011-03-27
|
||||
# Fixed broken caching of customized raw definitions, but requires an
|
||||
API change. The old API still works but will emit a warning,
|
||||
see http://htmlpurifier.org/docs/enduser-customize.html#optimized
|
||||
for how to upgrade your code.
|
||||
# Protect against Internet Explorer innerHTML behavior by specially
|
||||
treating attributes with backticks but no angled brackets, quotes or
|
||||
spaces. This constitutes a slight semantic change, which can be
|
||||
reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
|
||||
and Mario Heiderich.
|
||||
# Protect against cssText/innerHTML by restricting allowed characters
|
||||
used in fonts further than mandated by the specification and encoding
|
||||
some extra special characters in URLs. Reported by Neike
|
||||
Taika-Tessaro and Mario Heiderich.
|
||||
! Added %HTML.Nofollow to add rel="nofollow" to external links.
|
||||
! More types of SPL autoloaders allowed on later versions of PHP.
|
||||
! Implementations for position, top, left, right, bottom, z-index
|
||||
when %CSS.Trusted is on.
|
||||
! Add %Cache.SerializerPermissions option for custom serializer
|
||||
directory/file permissions
|
||||
! Fix longstanding bug in Flash support for non-IE browsers, and
|
||||
allow more wmode attributes.
|
||||
! Add %CSS.AllowedFonts to restrict permissible font names.
|
||||
- Switch to an iterative traversal of the DOM, which prevents us
|
||||
from running out of stack space for deeply nested documents.
|
||||
Thanks Maxim Krizhanovsky for contributing a patch.
|
||||
- Make removal of conditional IE comments ungreedy; thanks Bernd
|
||||
for reporting.
|
||||
- Escape CDATA before removing Internet Explorer comments.
|
||||
- Fix removal of id attributes under certain conditions by ensuring
|
||||
armor attributes are preserved when recreating tags.
|
||||
- Check if schema.ser was corrupted.
|
||||
- Check if zend.ze1_compatibility_mode is on, and error out if it is.
|
||||
This safety check is only done for HTMLPurifier.auto.php; if you
|
||||
are using standalone or the specialized includes files, you're
|
||||
expected to know what you're doing.
|
||||
- Stop repeatedly writing the cache file after I'm done customizing a
|
||||
raw definition. Reported by ajh.
|
||||
- Switch to using require_once in the Bootstrap to work around bad
|
||||
interaction with Zend Debugger and APC. Reported by Antonio Parraga.
|
||||
- Fix URI handling when hostname is missing but scheme is present.
|
||||
Reported by Neike Taika-Tessaro.
|
||||
- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
|
||||
for reporting.
|
||||
- Fix harmless notice from indexing into empty string. Thanks Matthijs
|
||||
Kooijman <matthijs@stdin.nl> for reporting.
|
||||
- Don't autoclose no parent elements are able to support the element
|
||||
that triggered the autoclose. In particular fixes strange behavior
|
||||
of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
|
||||
Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
|
||||
|
||||
4.2.0, released 2010-09-15
|
||||
! Added %Core.RemoveProcessingInstructions, which lets you remove
|
||||
<? ... ?> statements.
|
||||
! Added %URI.DisableResources functionality; the directive originally
|
||||
did nothing. Thanks David Rothstein for reporting.
|
||||
! Add documentation about configuration directive types.
|
||||
! Add %CSS.ForbiddenProperties configuration directive.
|
||||
! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
|
||||
to utilize full-screen mode.
|
||||
! Add optional support for the <code>file</code> URI scheme, enable
|
||||
by explicitly setting %URI.AllowedSchemes.
|
||||
! Add %Core.NormalizeNewlines options to allow turning off newline
|
||||
normalization.
|
||||
- Fix improper handling of Internet Explorer conditional comments
|
||||
by parser. Thanks zmonteca for reporting.
|
||||
- Fix missing attributes bug when running on Mac Snow Leopard and APC.
|
||||
Thanks sidepodcast for the fix.
|
||||
- Warn if an element is allowed, but an attribute it requires is
|
||||
not allowed.
|
||||
|
||||
4.1.1, released 2010-05-31
|
||||
- Fix undefined index warnings in maintenance scripts.
|
||||
- Fix bug in DirectLex for parsing elements with a single attribute
|
||||
with entities.
|
||||
- Rewrite CSS output logic for font-family and url(). Thanks Mario
|
||||
Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
|
||||
Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
|
||||
- Emit an error for CollectErrors if a body is extracted
|
||||
- Fix bug where in background-position for center keyword handling.
|
||||
- Fix infinite loop when a wrapper element is inserted in a context
|
||||
where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
|
||||
- Remove +x bit and shebang from index.php; only supported mode is to
|
||||
explicitly call it with php.
|
||||
- Make test script less chatty when log_errors is on.
|
||||
|
||||
4.1.0, released 2010-04-26
|
||||
! Support proprietary height attribute on table element
|
||||
! Support YouTube slideshows that contain /cp/ in their URL.
|
||||
! Support for data: URI scheme; not enabled by default, add it using
|
||||
%URI.AllowedSchemes
|
||||
! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
|
||||
! Support for Internet Explorer compatibility with %HTML.SafeObject
|
||||
using %Output.FlashCompat.
|
||||
! Handle <ol><ol> properly, by inserting the necessary <li> tag.
|
||||
- Always quote the insides of url(...) in CSS.
|
||||
|
||||
4.0.0, released 2009-07-07
|
||||
# APIs for ConfigSchema subsystem have substantially changed. See
|
||||
docs/dev-config-bcbreaks.txt for details; in essence, anything that
|
||||
had both namespace and directive now have a single unified key.
|
||||
# Some configuration directives were renamed, specifically:
|
||||
%AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
|
||||
%FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
|
||||
%FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
|
||||
%FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
|
||||
As usual, the old directive names will still work, but will throw E_NOTICE
|
||||
errors.
|
||||
# The allowed values for class have been relaxed to allow all of CDATA for
|
||||
doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
|
||||
%Attr.ClassUseCDATA to false.
|
||||
# Instead of appending the content model to an old content model, a blank
|
||||
element will replace the old content model. You can use #SUPER to get
|
||||
the old content model.
|
||||
! More robust support for name="" and id=""
|
||||
! HTMLPurifier_Config::inherit($config) allows you to inherit one
|
||||
configuration, and have changes to that configuration be propagated
|
||||
to all of its children.
|
||||
! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
|
||||
the name attribute when set. Use with care. Thanks Ian Cook for
|
||||
sponsoring.
|
||||
! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
|
||||
tags that contain non-breaking spaces as well other whitespace. You
|
||||
can also modify which tags should have maintained with
|
||||
%AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
|
||||
! Implement %Attr.AllowedClasses, which allows administrators to restrict
|
||||
classes users can use to a specified finite set of classes, and
|
||||
%Attr.ForbiddenClasses, which is the logical inverse.
|
||||
! You can now maintain your own configuration schema directories by
|
||||
creating a config-schema.php file or passing an extra argument. Check
|
||||
docs/dev-config-schema.html for more details.
|
||||
! Added HTMLPurifier_Config->serialize() method, which lets you save away
|
||||
your configuration in a compact serial file, which you can unserialize
|
||||
and use directly without having to go through the overhead of setup.
|
||||
- Fix bug where URIDefinition would not get cleared if it's directives got
|
||||
changed.
|
||||
- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
|
||||
- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
|
||||
- Make %URI.Munge not apply to links that have the same host as your host.
|
||||
- Prevent stray </body> tag from truncating output, if a second </body>
|
||||
is present.
|
||||
. Created script maintenance/rename-config.php for renaming a configuration
|
||||
directive while maintaining its alias. This script does not change source code.
|
||||
. Implement namespace locking for definition construction, to prevent
|
||||
bugs where a directive is used for definition construction but is not
|
||||
used to construct the cache hash.
|
||||
|
||||
3.3.0, released 2009-02-16
|
||||
! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
|
||||
! Implement generic property list classess
|
||||
- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
|
||||
does not do the "right thing" with characters not supported in the output
|
||||
set.
|
||||
- Spellcheck UTF-8: The Secret To Character Encoding
|
||||
- Fix improper removal of the contents of elements with only whitespace. Thanks
|
||||
Eric Wald for reporting.
|
||||
- Fix broken test suite in versions of PHP without spl_autoload_register()
|
||||
- Fix degenerate case with YouTube filter involving double hyphens.
|
||||
Thanks Pierre Attar for reporting.
|
||||
- Fix YouTube rendering problem on certain versions of Firefox.
|
||||
- Fix CSSDefinition Printer problems with decorators
|
||||
- Add text parameter to unit tests, forces text output
|
||||
. Add verbose mode to command line test runner, use (--verbose)
|
||||
. Turn on unit tests for UnitConverter
|
||||
. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
|
||||
. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
|
||||
tested on Linux.
|
||||
. Removed trailing whitespace from all text files, see
|
||||
remote-trailing-whitespace.php maintenance script.
|
||||
. Convert configuration to use property list backend.
|
||||
|
||||
3.2.0, released 2008-10-31
|
||||
# Using %Core.CollectErrors forces line number/column tracking on, whereas
|
||||
previously you could theoretically turn it off.
|
||||
# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
|
||||
use handleEnd() instead.
|
||||
! %Output.AttrSort for when you need your attributes in alphabetical order to
|
||||
deal with a bug in FCKEditor. Requested by frank farmer.
|
||||
! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
|
||||
! Proper support for name attribute. It is now allowed and equivalent to the id
|
||||
attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
|
||||
is heavy (for all doctypes).
|
||||
! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
|
||||
use on hand-written HTML.
|
||||
! Add error-cases for unsupported elements in MakeWellFormed. This enables
|
||||
the strategy to be used, standalone, on untrusted input.
|
||||
! %Core.AggressivelyFixLt is on by default. This causes more sensible
|
||||
processing of left angled brackets in smileys and other whatnot.
|
||||
! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
|
||||
'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
|
||||
the --only-phpt parameter, although for backwards-compatibility the flag
|
||||
will still work.
|
||||
! AutoParagraph auto-formatter will now preserve double-newlines upon output.
|
||||
Users who are not performing inbound filtering, this may seem a little
|
||||
useless, but as a bonus, the test suite and handling of edge cases is also
|
||||
improved.
|
||||
! Experimental implementation of forms for %HTML.Trusted
|
||||
! Track column numbers when maintain line numbers is on
|
||||
! Proprietary 'background' attribute on table-related elements converted into
|
||||
corresponding CSS. Thanks Fusemail for sponsoring this feature!
|
||||
! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
|
||||
supertype.
|
||||
! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
|
||||
time of operation varies slightly from notifyEnd() as *all* end tokens are
|
||||
processed by the injector before they are subject to the well-formedness rules.
|
||||
! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
|
||||
basename of image when not present.
|
||||
! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
|
||||
- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
|
||||
the other involving an undefined $is_folder error.
|
||||
- Throw error when %Core.Encoding is set to a spurious value. Previously,
|
||||
this errored silently and returned false.
|
||||
- Redirected stderr to stdout for flush error output.
|
||||
- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
|
||||
available.
|
||||
- Do not re-munge URL if the output URL has the same host as the input URL.
|
||||
Requested by Chris.
|
||||
- Fix error in documentation regarding %Filter.ExtractStyleBlocks
|
||||
- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
|
||||
- Fix bug with inline elements in blockquotes conflicting with strict doctype
|
||||
- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
|
||||
- Fix bug where dots and double-dots in absolute URLs without hostname were
|
||||
not collapsed by URIFilter_MakeAbsolute.
|
||||
- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
|
||||
by reordering their addition.
|
||||
- Will now throw exception on many error conditions during lexer creation; also
|
||||
throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
|
||||
is being used.
|
||||
- Detect if domxml extension is loaded, and use DirectLEx accordingly.
|
||||
- Improve handling of big numbers with floating point arithmetic in UnitConverter.
|
||||
Reported by David Morton.
|
||||
. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
|
||||
for more interesting filter-backtracking
|
||||
. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
|
||||
index to reprocess tokens.
|
||||
. StringHashParser now allows for multiline sections with "empty" content;
|
||||
previously the section would remain undefined.
|
||||
. Added --quick option to multitest.php, which tests only the most recent
|
||||
release for each series.
|
||||
. Added --distro option to multitest.php, which accepts either 'normal' or
|
||||
'standalone'. This supercedes --exclude-normal and --exclude-standalone
|
||||
|
||||
3.1.1, released 2008-06-19
|
||||
# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
|
||||
In order to enable this again, please set %URI.MungeResources to true.
|
||||
! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
|
||||
and height/width HTML with %HTML.MaxImgLength.
|
||||
! %URI.MungeSecretKey for secure URI munging. Thanks Chris
|
||||
for sponsoring this feature. Check out the corresponding documentation
|
||||
for details. (Att Nightly testers: The API for this feature changed before
|
||||
the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
|
||||
%URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
|
||||
! Implemented post URI filtering. Set member variable $post to true to set
|
||||
a URIFilter as such.
|
||||
! Allow modules to define injectors via $info_injector. Injectors are
|
||||
automatically disabled if injector's needed elements are not found.
|
||||
! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
|
||||
Thanks Chris for sponsoring. If you've been using ad hoc code from the
|
||||
forums, PLEASE use this instead.
|
||||
! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
|
||||
embedded, tag name, attribute name, CSS property name). See %URI.Munge
|
||||
for more details. Requested by Jochem Blok.
|
||||
- Disable percent height/width attributes for img.
|
||||
- AttrValidator operations are now atomic; updates to attributes are not
|
||||
manifest in token until end of operations. This prevents naughty internal
|
||||
code from directly modifying CurrentToken when they're not supposed to.
|
||||
This semantics change was requested by frank farmer.
|
||||
- Percent encoding checks enabled for URI query and fragment
|
||||
- Fix stray backslashes in font-family; CSS Unicode character escapes are
|
||||
now properly resolved (although *only* in font-family). Thanks Takeshi Terada
|
||||
for reporting.
|
||||
- Improve parseCDATA algorithm to take into account newline normalization
|
||||
- Account for browser confusion between Yen character and backslash in
|
||||
Shift_JIS encoding. This fix generalizes to any other encoding which is not
|
||||
a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
|
||||
- Fix missing configuration parameter in Generator calls. Thanks vs for the
|
||||
partial patch.
|
||||
- Improved adherence to Unicode by checking for non-character codepoints.
|
||||
Thanks Geoffrey Sneddon for reporting. This may result in degraded
|
||||
performance for extremely large inputs.
|
||||
- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
|
||||
for reporting.
|
||||
. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
|
||||
handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
|
||||
this class.
|
||||
. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
|
||||
to __construct($min, $max). __construct(true) is equivalent to
|
||||
__construct('0').
|
||||
. Added HTMLPurifier_AttrDef_Switch class
|
||||
. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
|
||||
up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
|
||||
get this called with the configuration object. All modules now
|
||||
use this rather than __construct(), although legacy code using constructors
|
||||
will still work--the new format, however, lets modules access the
|
||||
configuration object for HTML namespace dependant tweaks.
|
||||
. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
|
||||
. ConfigSchema data-structure heavily optimized; on average it uses a third
|
||||
the memory it did previously. The interface has changed accordingly,
|
||||
consult changes to HTMLPurifier_Config for details.
|
||||
. Variable parsing types now are magic integers instead of strings
|
||||
. Added benchmark for ConfigSchema
|
||||
. HTMLPurifier_Generator requires $config and $context parameters. If you
|
||||
don't know what they should be, use HTMLPurifier_Config::createDefault()
|
||||
and new HTMLPurifier_Context().
|
||||
. Printers now properly distinguish between output configuration, and
|
||||
target configuration. This is not applicable to scripts using
|
||||
the Printers for HTML Purifier related tasks.
|
||||
. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
|
||||
fatal errors will ensue.
|
||||
. URIFilter->prepare can return false in order to abort loading of the filter
|
||||
. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
|
||||
an external resource.
|
||||
. %URI.Munge functionality factored out into a post-filter class.
|
||||
. Added CurrentCSSProperty context variable during CSS validation
|
||||
|
||||
3.1.0, released 2008-05-18
|
||||
# Unnecessary references to objects (vestiges of PHP4) removed from method
|
||||
signatures. The following methods do not need references when assigning from
|
||||
them and will result in E_STRICT errors if you try:
|
||||
+ HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
|
||||
+ HTMLPurifier_ConfigSchema::instance()
|
||||
+ HTMLPurifier_DefinitionCacheFactory::instance()
|
||||
+ HTMLPurifier_DefinitionCacheFactory->create()
|
||||
+ HTMLPurifier_DoctypeRegistry->register()
|
||||
+ HTMLPurifier_DoctypeRegistry->get()
|
||||
+ HTMLPurifier_HTMLModule->addElement()
|
||||
+ HTMLPurifier_HTMLModule->addBlankElement()
|
||||
+ HTMLPurifier_LanguageFactory::instance()
|
||||
# Printer_ConfigForm's get*() functions were static-ified
|
||||
# %HTML.ForbiddenAttributes requires attribute declarations to be in the
|
||||
form of tag@attr, NOT tag.attr (which will throw an error and won't do
|
||||
anything). This is for forwards compatibility with XML; you'd do best
|
||||
to migrate an %HTML.AllowedAttributes directives to this syntax too.
|
||||
! Allow index to be false for config from form creation
|
||||
! Added HTMLPurifier::VERSION constant
|
||||
! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
|
||||
and allows for version numbers like "3.1.0-dev".
|
||||
! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
|
||||
! HTML Purifier's URI handling is a lot more robust, with much stricter
|
||||
validation checks and better percent encoding handling. Thanks Gareth Heyes
|
||||
for indicating security vulnerabilities from lax percent encoding.
|
||||
! Bootstrap autoloader deals more robustly with classes that don't exist,
|
||||
preventing class_exists($class, true) from barfing.
|
||||
- InterchangeBuilder now alphabetizes its lists
|
||||
- Validation error in configdoc output fixed
|
||||
- Iconv and other encoding errors muted even with custom error handlers that
|
||||
do not honor error_reporting
|
||||
- Add protection against imagecrash attack with CSS height/width
|
||||
- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
|
||||
- Fixed and revamped broken ConfigForm smoketest
|
||||
- Bug with bool/null fields in Printer_ConfigForm fixed
|
||||
- Bug with global forbidden attributes fixed
|
||||
- Improved error messages for allowed and forbidden HTML elements and attributes
|
||||
- Missing (or null) in configdoc documentation restored
|
||||
- If DOM throws and exception during parsing with PH5P (occurs in newer versions
|
||||
of DOM), HTML Purifier punts to DirectLex
|
||||
- Fatal error with unserialization of ScriptRequired
|
||||
- Created directories are now chmod'ed properly
|
||||
- Fixed bug with fallback languages in LanguageFactory
|
||||
- Standalone testing setup properly with autoload
|
||||
. Out-of-date documentation revised
|
||||
. UTF-8 encoding check optimization as suggested by Diego
|
||||
. HTMLPurifier_Error removed in favor of exceptions
|
||||
. More copy() function removed; should use clone instead
|
||||
. More extensive unit tests for HTMLDefinition
|
||||
. assertPurification moved to central harness
|
||||
. HTMLPurifier_Generator accepts $config and $context parameters during
|
||||
instantiation, not runtime
|
||||
. Double-quotes outside of attribute values are now unescaped
|
||||
|
||||
3.1.0rc1, released 2008-04-22
|
||||
# Autoload support added. Internal require_once's removed in favor of an
|
||||
explicit require list or autoloading. To use HTML Purifier,
|
||||
you must now either use HTMLPurifier.auto.php
|
||||
or HTMLPurifier.includes.php; setting the include path and including
|
||||
HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
|
||||
as well to register our autoload handler (or modify your autoload function
|
||||
to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
|
||||
HTMLPurifier.safe-includes.php for a less performance friendly but more
|
||||
user-friendly library load.
|
||||
# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
|
||||
information is stored in the ConfigSchema directory, and the
|
||||
maintenance/generate-schema-cache.php generates the schema.ser file, which
|
||||
is now instantiated. Support for userland schema changes coming soon!
|
||||
# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
|
||||
alias; to get rid of these errors just modify your configuration to use
|
||||
the new directive name.
|
||||
# HTMLPurifier->addFilter is deprecated; built-in filters can now be
|
||||
enabled using %Filter.$filter_name or by setting your own filters using
|
||||
%Filter.Custom
|
||||
# Directive-level safety properties superceded in favor of module-level
|
||||
safety. Internal method HTMLModule->addElement() has changed, although
|
||||
the externally visible HTMLDefinition->addElement has *not* changed.
|
||||
! Extra utility classes for testing and non-library operations can
|
||||
be found in extras/. Specifically, these are FSTools and ConfigDoc.
|
||||
You may find a use for these in your own project, but right now they
|
||||
are highly experimental and volatile.
|
||||
! Integration with PHPT allows for automated smoketests
|
||||
! Limited support for proprietary HTML elements, namely <marquee>, sponsored
|
||||
by Chris. You can enable them with %HTML.Proprietary if your client
|
||||
demands them.
|
||||
! Support for !important CSS cascade modifier. By default, this will be stripped
|
||||
from CSS, but you can enable it using %CSS.AllowImportant
|
||||
! Support for display and visibility CSS properties added, set %CSS.AllowTricky
|
||||
to true to use them.
|
||||
! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
|
||||
Developer error (not enduser error) can cause these to be triggered.
|
||||
! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
|
||||
! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
|
||||
mucking around with HTMLPurifier_CSSDefinition
|
||||
! ConfigDoc output has been enhanced with version and deprecation info.
|
||||
! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
|
||||
- Autoclose now operates iteratively, i.e. <span><span><div> now has
|
||||
both span tags closed.
|
||||
- Various HTMLPurifier_Config convenience functions now accept another parameter
|
||||
$schema which defines what HTMLPurifier_ConfigSchema to use besides the
|
||||
global default.
|
||||
- Fix bug with trusted script handling in libxml versions later than 2.6.28.
|
||||
- Fix bug in ExtractStyleBlocks with comments in style tags
|
||||
- Fix bug in comment parsing for DirectLex
|
||||
- Flush output now displayed when in command line mode for unit tester
|
||||
- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
|
||||
- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
|
||||
on the same element without emitting errors.
|
||||
- Fixed fatal error in PH5P lexer with invalid tag names
|
||||
. Plugins now get their own changelogs according to project conventions.
|
||||
. Convert tokens to use instanceof, reducing memory footprint and
|
||||
improving comparison speed.
|
||||
. Dry runs now supported in SimpleTest; testing facilities improved
|
||||
. Bootstrap class added for handling autoloading functionality
|
||||
. Implemented recursive glob at FSTools->globr
|
||||
. ConfigSchema now has instance methods for all corresponding define*
|
||||
static methods.
|
||||
. A couple of new historical maintenance scripts were added.
|
||||
. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
|
||||
. tests/index.php can now be run from any directory.
|
||||
. HTMLPurifier_Token subclasses split into seperate files
|
||||
. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
|
||||
. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
|
||||
. New --php=php flag added, allows PHP executable to be specified (command
|
||||
line only!)
|
||||
. htmlpurifier_add_test() preferred method to translate test files in to
|
||||
classes, because it handles PHPT files too.
|
||||
. Debugger class is deprecated and will be removed soon.
|
||||
. Command line argument parsing for testing scripts revamped, now --opt value
|
||||
format is supported.
|
||||
. Smoketests now cleanup after magic quotes
|
||||
. Generator now can output comments (however, comments are still stripped
|
||||
from HTML Purifier output)
|
||||
. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
|
||||
HTMLPurifier_VarParser->parse()
|
||||
. Integers auto-cast into float type by VarParser.
|
||||
. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
|
||||
during cache generation
|
||||
. Reordered script calls in maintenance/flush.php
|
||||
. Command line scripts now honor exit codes
|
||||
. When --flush fails in unit testers, abort tests and print message
|
||||
. Improved documentation in docs/dev-flush.html about the maintenance scripts
|
||||
. copy() methods removed in favor of clone keyword
|
||||
|
||||
3.0.0, released 2008-01-06
|
||||
# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
|
||||
until PHP 4 is completely deprecated, but no new features will be added
|
||||
to it.
|
||||
+ Visibility declarations added
|
||||
+ Constructor methods renamed to __construct()
|
||||
+ PHP4 reference cruft removed (in progress)
|
||||
! CSS properties are now case-insensitive
|
||||
! DefinitionCacheFactory now can register new implementations
|
||||
! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
|
||||
documents and cleaning their contents up. Requires the CSSTidy library
|
||||
<http://csstidy.sourceforge.net/>. You can access the blocks with the
|
||||
'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
|
||||
The output CSS can also be "scoped" for a specific element, use:
|
||||
%Filter.ExtractStyleBlocksScope
|
||||
! Experimental support for some proprietary CSS attributes allowed:
|
||||
opacity (and all of the browser-specific equivalents) and scrollbar colors.
|
||||
Enable by setting %CSS.Proprietary to true.
|
||||
- Colors missing # but in hex form will be corrected
|
||||
- CSS Number algorithm improved
|
||||
- Unit testing and multi-testing now on steroids: command lines,
|
||||
XML output, and other goodies now added.
|
||||
. Unit tests for Injector improved
|
||||
. New classes:
|
||||
+ HTMLPurifier_AttrDef_CSS_AlphaValue
|
||||
+ HTMLPurifier_AttrDef_CSS_Filter
|
||||
. Multitest now has a file docblock
|
||||
|
||||
2.1.3, released 2007-11-05
|
||||
! tests/multitest.php allows you to test multiple versions by running
|
||||
tests/index.php through multiple interpreters using `phpv` shell
|
||||
script (you must provide this script!)
|
||||
- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
|
||||
on some systems.
|
||||
- Injector algorithm further refined: off-by-one error regarding skip
|
||||
counts for dormant injectors fixed
|
||||
- Corrective blockquote definition now enabled for HTML 4.01 Strict
|
||||
- Fatal error when <img> tag (or any other element with required attributes)
|
||||
has 'id' attribute fixed, thanks NykO18 for reporting
|
||||
- Fix warning emitted when a non-supported URI scheme is passed to the
|
||||
MakeAbsolute URIFilter, thanks NykO18 (again)
|
||||
- Further refine AutoParagraph injector. Behavior inside of elements
|
||||
allowing paragraph tags clarified: only inline content delimeted by
|
||||
double newlines (not block elements) are paragraphed.
|
||||
- Buggy treatment of end tags of elements that have required attributes
|
||||
fixed (does not manifest on default tag-set)
|
||||
- Spurious internal content reorganization error suppressed
|
||||
- HTMLDefinition->addElement now returns a reference to the created
|
||||
element object, as implied by the documentation
|
||||
- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
|
||||
- Fix a theoretical class of infinite loops from DirectLex reported
|
||||
by Nate Abele
|
||||
- Work around unnecessary DOMElement type-cast in PH5P that caused errors
|
||||
in PHP 5.1
|
||||
- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
|
||||
HTMLDefinition errors, this may indicate problems with error-collecting
|
||||
facilities in PHP 5
|
||||
- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
|
||||
- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
|
||||
. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
|
||||
to better communicate its purpose
|
||||
. Error unit tests can now specify the expectation of no errors. Future
|
||||
iterations of the harness will be extremely strict about what errors
|
||||
are allowed
|
||||
. Extend Injector hooks to allow for more powerful injector routines
|
||||
. HTMLDefinition->addBlankElement created, as according to the HTMLModule
|
||||
method
|
||||
. Doxygen configuration file updated, with minor improvements
|
||||
. Test runner now checks for similarly named files in conf/ directory too.
|
||||
. Minor cosmetic change to flush-definition-cache.php: trailing newline is
|
||||
outputted
|
||||
. Maintenance script for generating PH5P patch added, original PH5P source
|
||||
file also added under version control
|
||||
. Full unit test runner script title made more descriptive with PHP version
|
||||
. Updated INSTALL file to state that 4.3.7 is the earliest version we
|
||||
are actively testing
|
||||
|
||||
2.1.2, released 2007-09-03
|
||||
! Implemented Object module for trusted users
|
||||
! Implemented experimental HTML5 parsing mode using PH5P. To use, add
|
||||
this to your code:
|
||||
require_once 'HTMLPurifier/Lexer/PH5P.php';
|
||||
$config->set('Core', 'LexerImpl', 'PH5P');
|
||||
Note that this Lexer introduces some classes not in the HTMLPurifier
|
||||
namespace. Also, this is PHP5 only.
|
||||
! CSS property border-spacing implemented
|
||||
- Fix non-visible parsing error in DirectLex with empty tags that have
|
||||
slashes inside attribute values.
|
||||
- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
|
||||
accepted as valid CSS. Usually non-visible, because this styling is the
|
||||
default for tables in most browsers. Thanks Brett Zamir for pointing
|
||||
this out.
|
||||
- Fix validation errors in configuration form
|
||||
- Hammer out a bunch of edge-case bugs in the standalone distribution
|
||||
- Inclusion reflection removed from URISchemeRegistry; you must manually
|
||||
include any new schema files you wish to use
|
||||
- Numerous typo fixes in documentation thanks to Brett Zamir
|
||||
. Unit test refactoring for one logical test per test function
|
||||
. Config and context parameters in ComplexHarness deprecated: instead, edit
|
||||
the $config and $context member variables
|
||||
. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
|
||||
really make a difference, but is good for completeness sake
|
||||
. merge-library.php script refactored for greater code reusability and
|
||||
PHP4 compatibility
|
||||
|
||||
2.1.1, released 2007-08-04
|
||||
- Fix show-stopper bug in %URI.MakeAbsolute functionality
|
||||
- Fix PHP4 syntax error in standalone version
|
||||
. Add prefix directory to include path for standalone, this prevents
|
||||
other installations from clobbering the standalone's URI schemes
|
||||
. Single test methods can be invoked by prefixing with __only
|
||||
|
||||
2.1.0, released 2007-08-02
|
||||
# flush-htmldefinition-cache.php superseded in favor of a generic
|
||||
flush-definition-cache.php script, you can clear a specific cache
|
||||
by passing its name as a parameter to the script
|
||||
! Phorum mod implemented for HTML Purifier
|
||||
! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
|
||||
trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
|
||||
for PHP4 (DirectLex).
|
||||
! Standalone file now available, which greatly reduces the amount of
|
||||
includes (although there are still a few files that reside in the
|
||||
standalone folder)
|
||||
! Relative URIs can now be transformed into their absolute equivalents
|
||||
using %URI.Base and %URI.MakeAbsolute
|
||||
! Ruby implemented for XHTML 1.1
|
||||
! You can now define custom URI filtering behavior, see enduser-uri-filter.html
|
||||
for more details
|
||||
! UTF-8 font names now supported in CSS
|
||||
- AutoFormatters emit friendly error messages if tags or attributes they
|
||||
need are not allowed
|
||||
- ConfigForm's compactification of directive names is now configurable
|
||||
- AutoParagraph autoformatter algorithm refined after field-testing
|
||||
- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
|
||||
blockquote wrapping
|
||||
- Contents of <style> tags removed by default when tags are removed
|
||||
. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
|
||||
for output cache invalidation
|
||||
. ConfigForm printer now can retrieve CSS and JS files as strings, in
|
||||
case HTML Purifier's directory is not publically accessible
|
||||
. Introduce new text/itext configuration directive values: these represent
|
||||
longer strings that would be more appropriately edited with a textarea
|
||||
. Allow newlines to act as separators for lists, hashes, lookups and
|
||||
%HTML.Allowed
|
||||
. ConfigForm generates textareas instead of text inputs for lists, hashes,
|
||||
lookups, text and itext fields
|
||||
. Hidden element content removal genericized: %Core.HiddenElements can
|
||||
be used to customize this behavior, by default <script> and <style> are
|
||||
hidden
|
||||
. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
|
||||
. Custom ChildDef added to default include list
|
||||
. URIScheme reflection improved: will not attempt to include file if class
|
||||
already exists. May clobber autoload, so I need to keep an eye on it
|
||||
. ConfigSchema heavily optimized, will only collect information and validate
|
||||
definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
|
||||
. AttrDef_URI unit tests and implementation refactored
|
||||
. benchmarks/ directory now protected from public view with .htaccess file;
|
||||
run the tests via command line
|
||||
. URI scheme is munged off if there is no authority and the scheme is the
|
||||
default one
|
||||
. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
|
||||
. Interface for URIScheme changed
|
||||
. Generic URI object to hold components of URI added, most systems involved
|
||||
in URI validation have been migrated to use it
|
||||
. Custom filtering for URIs factored out to URIDefinition interface for
|
||||
maximum extensibility
|
||||
|
||||
2.0.1, released 2007-06-27
|
||||
! Tag auto-closing now based on a ChildDef heuristic rather than a
|
||||
manually set auto_close array; some behavior may change
|
||||
! Experimental AutoFormat functionality added: auto-paragraph and
|
||||
linkify your HTML input by setting %AutoFormat.AutoParagraph and
|
||||
%AutoFormat.Linkify to true
|
||||
! Newlines normalized internally, and then converted back to the
|
||||
value of PHP_EOL. If this is not desired, set your newline format
|
||||
using %Output.Newline.
|
||||
! Beta error collection, messages are implemented for the most generic
|
||||
cases involving Lexing or Strategies
|
||||
- Clean up special case code for <script> tags
|
||||
- Reorder includes for DefinitionCache decorators, fixes a possible
|
||||
missing class error
|
||||
- Fixed bug where manually modified definitions were not saved via cache
|
||||
(mostly harmless, except for the fact that it would be a little slower)
|
||||
- Configuration objects with different serials do not clobber each
|
||||
others when revision numbers are unequal
|
||||
- Improve Serializer DefinitionCache directory permissions checks
|
||||
- DefinitionCache no longer throws errors when it encounters old
|
||||
serial files that do not conform to the current style
|
||||
- Stray xmlns attributes removed from configuration documentation
|
||||
- configForm.php smoketest no longer has XSS vulnerability due to
|
||||
unescaped print_r output
|
||||
- Printer adheres to configuration's directives on output format
|
||||
- Fix improperly named form field in ConfigForm printer
|
||||
. Rewire some test-cases to swallow errors rather than expect them
|
||||
. HTMLDefinition printer updated with some of the new attributes
|
||||
. DefinitionCache keys reordered to reflect precedence: version number,
|
||||
hash, then revision number
|
||||
. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
|
||||
. Interlinking in configuration documentation added using
|
||||
Injector_PurifierLinkify
|
||||
. Directives now keep track of aliases to themselves
|
||||
. Error collector now requires a severity to be passed, use PHP's internal
|
||||
error constants for this
|
||||
. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
|
||||
much easier selective embedding of configuration values
|
||||
. Doctype objects now accept public and system DTD identifiers
|
||||
. %HTML.Doctype is now constrained by specific values, to specify a custom
|
||||
doctype use new %HTML.CustomDoctype
|
||||
. ConfigForm truncates long directives to keep the form small, and does
|
||||
not re-output namespaces
|
||||
|
||||
2.0.0, released 2007-06-20
|
||||
# Completely refactored HTMLModuleManager, decentralizing safety
|
||||
information
|
||||
# Transform modules changed to Tidy modules, which offer more flexibility
|
||||
and better modularization
|
||||
# Configuration object now finalizes itself when a read operation is
|
||||
performed on it, ensuring that its internal state stays consistent.
|
||||
To revert this behavior, you can set the $autoFinalize member variable
|
||||
off, but it's not recommended.
|
||||
# New compact syntax for AttrDef objects that can be used to instantiate
|
||||
new objects via make()
|
||||
# Definitions (esp. HTMLDefinition) are now cached for a significant
|
||||
performance boost. You can disable caching by setting %Core.DefinitionCache
|
||||
to null. You CANNOT edit raw definitions without setting the corresponding
|
||||
DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
|
||||
# Contents between <script> tags are now completely removed if <script>
|
||||
is not allowed
|
||||
# Prototype-declarations for Lexer removed in favor of configuration
|
||||
determination of Lexer implementations.
|
||||
! HTML Purifier now works in PHP 4.3.2.
|
||||
! Configuration form-editing API makes tweaking HTMLPurifier_Config a
|
||||
breeze!
|
||||
! Configuration directives that accept hashes now allow new string
|
||||
format: key1:value1,key2:value2
|
||||
! ConfigDoc now factored into OOP design
|
||||
! All deprecated elements now natively supported
|
||||
! Implement TinyMCE styled whitelist specification format in
|
||||
%HTML.Allowed
|
||||
! Config object gives more friendly error messages when things go wrong
|
||||
! Advanced API implemented: easy functions for creating elements (addElement)
|
||||
and attributes (addAttribute) on HTMLDefinition
|
||||
! Add native support for required attributes
|
||||
- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
|
||||
- DOMLex will not emit errors when a custom error handler that does not
|
||||
honor error_reporting is used
|
||||
- StrictBlockquote child definition refrains from wrapping whitespace
|
||||
in tags now.
|
||||
- Bug resulting from tag transforms to non-allowed elements fixed
|
||||
- ChildDef_Custom's regex generation has been improved, removing several
|
||||
false positives
|
||||
. Unit test for ElementDef created, ElementDef behavior modified to
|
||||
be more flexible
|
||||
. Added convenience functions for HTMLModule constructors
|
||||
. AttrTypes now has accessor functions that should be used instead
|
||||
of directly manipulating info
|
||||
. TagTransform_Center deprecated in favor of generic TagTransform_Simple
|
||||
. Add extra protection in AttrDef_URI against phantom Schemes
|
||||
. Doctype object added to HTMLDefinition which describes certain aspects
|
||||
of the operational document type
|
||||
. Lexer is now pre-emptively included, with a conditional include for the
|
||||
PHP5 only version.
|
||||
. HTMLDefinition and CSSDefinition have a common parent class: Definition.
|
||||
. DirectLex can now track line-numbers
|
||||
. Preliminary error collector is in place, although no code actually reports
|
||||
errors yet
|
||||
. Factor out most of ValidateAttributes to new AttrValidator class
|
||||
|
||||
1.6.1, released 2007-05-05
|
||||
! Support for more deprecated attributes via transformations:
|
||||
+ hspace and vspace in img
|
||||
+ size and noshade in hr
|
||||
+ nowrap in td
|
||||
+ clear in br
|
||||
+ align in caption, table, img and hr
|
||||
+ type in ul, ol and li
|
||||
! DirectLex now preserves text in which a < bracket is followed by
|
||||
a non-alphanumeric character. This means that certain emoticons
|
||||
are now preserved.
|
||||
! %Core.RemoveInvalidImg is now operational, when set to false invalid
|
||||
images will hang around with an empty src
|
||||
! target attribute in a tag supported, use %Attr.AllowedFrameTargets
|
||||
to enable
|
||||
! CSS property white-space now allows nowrap (supported in all modern
|
||||
browsers) but not others (which have spotty browser implementations)
|
||||
! XHTML 1.1 mode now sort-of works without any fatal errors, and
|
||||
lang is now moved over to xml:lang.
|
||||
! Attribute transformation smoketest available at smoketests/attrTransform.php
|
||||
! Transformation of font's size attribute now handles super-large numbers
|
||||
- Possibly fatal bug with __autoload() fixed in module manager
|
||||
- Invert HTMLModuleManager->addModule() processing order to check
|
||||
prefixes first and then the literal module
|
||||
- Empty strings get converted to empty arrays instead of arrays with
|
||||
an empty string in them.
|
||||
- Merging in attribute lists now works.
|
||||
. Demo script removed: it has been added to the website's repository
|
||||
. Basic.php script modified to work out of the box
|
||||
. Refactor AttrTransform classes to reduce duplication
|
||||
. AttrTransform_TextAlign axed in favor of a more general
|
||||
AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
|
||||
see how the new equivalent is implemented
|
||||
. Unit tests now use exclusively assertIdentical
|
||||
|
||||
1.6.0, released 2007-04-01
|
||||
! Support for most common deprecated attributes via transformations:
|
||||
+ bgcolor in td, th, tr and table
|
||||
+ border in img
|
||||
+ name in a and img
|
||||
+ width in td, th and hr
|
||||
+ height in td, th
|
||||
! Support for CSS attribute 'height' added
|
||||
! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
|
||||
and %Attr.AllowedRev to activate
|
||||
- You can define ID blacklists using regular expressions via
|
||||
%Attr.IDBlacklistRegexp
|
||||
- Error messages are emitted when you attempt to "allow" elements or
|
||||
attributes that HTML Purifier does not support
|
||||
- Fix segfault in unit test. The problem is not very reproduceable and
|
||||
I don't know what causes it, but a six line patch fixed it.
|
||||
|
||||
1.5.0, released 2007-03-23
|
||||
! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
|
||||
doesn't actually do anything yet, but keep your eyes peeled.
|
||||
! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
|
||||
! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
|
||||
I am loathe to release beta quality APIs, but this is exactly that;
|
||||
don't use the internal interfaces if you're not willing to do migration
|
||||
later on.
|
||||
- Allow 'x' subtag in language codes
|
||||
- Fixed buggy chameleon-support for ins and del
|
||||
. Added support for IDREF attributes (i.e. for)
|
||||
. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
|
||||
. Removed context variable ParentType, replaced with IsInline, which
|
||||
is false when you're not inline and an integer of the parent that
|
||||
caused you to become inline when you are (so possibly zero)
|
||||
. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
|
||||
and HTMLDefinition->content_sets
|
||||
. StrictBlockquote now reports what elements its supposed to allow,
|
||||
rather than what it does allow
|
||||
. Removed HTMLDefinition->info_flow_elements in favor of
|
||||
HTMLDefinition->content_sets['Flow']
|
||||
. Removed redundant "exclusionary" definitions from DTD roster
|
||||
. StrictBlockquote now requires a construction parameter as if it
|
||||
were an Required ChildDef, this is the "real" set of allowed elements
|
||||
. AttrDef partitioned into HTML, CSS and URI segments
|
||||
. Modify Youtube filter regexp to be multiline
|
||||
. Require both PHP5 and DOM extension in order to use DOMLex, fixes
|
||||
some edge cases where a DOMDocument class exists in a PHP4 environment
|
||||
due to DOM XML extension.
|
||||
|
||||
1.4.1, released 2007-01-21
|
||||
! docs/enduser-youtube.html updated according to new functionality
|
||||
- YouTube IDs can have underscores and dashes
|
||||
|
||||
1.4.0, released 2007-01-21
|
||||
! Implemented list-style-image, URIs now allowed in list-style
|
||||
! Implemented background-image, background-repeat, background-attachment
|
||||
and background-position CSS properties. Shorthand property background
|
||||
supports all of these properties.
|
||||
! Configuration documentation looks nicer
|
||||
! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
|
||||
characters while %Core.Encoding is set to a non-UTF-8 encoding.
|
||||
! Support for configuration directive aliases added
|
||||
! Config object can now be instantiated from ini files
|
||||
! YouTube preservation code added to the core, with two lines of code
|
||||
you can add it as a filter to your code. See smoketests/preserveYouTube.php
|
||||
for sample code.
|
||||
! Moved SLOW to docs/enduser-slow.html and added code examples
|
||||
- Replaced version check with functionality check for DOM (thanks Stephen
|
||||
Khoo)
|
||||
. Added smoketest 'all.php', which loads all other smoketests via frames
|
||||
. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
|
||||
. Added convenient single test selector form on test runner
|
||||
|
||||
1.3.2, released 2006-12-25
|
||||
! HTMLPurifier object now accepts configuration arrays, no need to manually
|
||||
instantiate a configuration object
|
||||
! Context object now accessible to outside
|
||||
! Added enduser-youtube.html, explains how to embed YouTube videos. See
|
||||
also corresponding smoketest preserveYouTube.php.
|
||||
! Added purifyArray(), which takes a list of HTML and purifies it all
|
||||
! Added static member variable $version to HTML Purifier with PHP-compatible
|
||||
version number string.
|
||||
- Fixed fatal error thrown by upper-cased language attributes
|
||||
- printDefinition.php: added labels, added better clarification
|
||||
. HTMLPurifier_Config::create() added, takes mixed variable and converts into
|
||||
a HTMLPurifier_Config object.
|
||||
|
||||
1.3.1, released 2006-12-06
|
||||
! Added HTMLPurifier.func.php stub for a convenient function to call the library
|
||||
- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
|
||||
(thanks to .mario for reporting this)
|
||||
. Standardized all attribute handling variables to attr, made it plural
|
||||
|
||||
1.3.0, released 2006-11-26
|
||||
# Invalid images are now removed, rather than replaced with a dud
|
||||
<img src="" alt="Invalid image" />. Previous behavior can be restored
|
||||
with new directive %Core.RemoveInvalidImg set to false.
|
||||
! (X)HTML Strict now supported
|
||||
+ Transparently handles inline elements in block context (blockquote)
|
||||
! Added GET method to demo for easier validation, added 50kb max input size
|
||||
! New directive %HTML.BlockWrapper, for block-ifying inline elements
|
||||
! New directive %HTML.Parent, allows you to only allow inline content
|
||||
! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
|
||||
users narrow the set of allowed tags
|
||||
! <li value="4"> and <ul start="2"> now allowed in loose mode
|
||||
! New directives %URI.DisableExternalResources and %URI.DisableResources
|
||||
! New directive %Attr.DisableURI, which eliminates all hyperlinking
|
||||
! New directive %URI.Munge, munges URI so you can use some sort of redirector
|
||||
service to avoid PageRank leaks or warn users that they are exiting your site.
|
||||
! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
|
||||
the configuration settings and see how the internal rules are affected.
|
||||
! New directive %URI.HostBlacklist for blocking links to bad hosts.
|
||||
xssAttacks.php smoketest updated accordingly.
|
||||
- Added missing type to ChildDef_Chameleon
|
||||
- Remove Tidy option from demo if there is not Tidy available
|
||||
. ChildDef_Required guards against empty tags
|
||||
. Lookup table HTMLDefinition->info_flow_elements added
|
||||
. Added peace-of-mind variable initialization to Strategy_FixNesting
|
||||
. Added HTMLPurifier->info_parent_def, parent child processing made special
|
||||
. Added internal documents briefly summarizing future progression of HTML
|
||||
. HTMLPurifier_Config->getBatch($namespace) added
|
||||
. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
|
||||
. Refactored ChildDef classes into their own files
|
||||
|
||||
1.2.0, released 2006-11-19
|
||||
# ID attributes now disabled by default. New directives:
|
||||
+ %HTML.EnableAttrID - restores old behavior by allowing IDs
|
||||
+ %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
|
||||
so that they don't collide with your IDs
|
||||
+ %Attr.IDPrefixLocal - Same as above, but for when there are multiple
|
||||
instances of user content on the page
|
||||
+ Profuse documentation on how to use these available in docs/enduser-id.txt
|
||||
! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
|
||||
! Added percent encoding normalization
|
||||
! XSS attacks smoketest given facelift
|
||||
! Configuration documentation now has table of contents
|
||||
! Added %URI.DisableExternal, which prevents links to external websites. You
|
||||
can also use %URI.Host to permit absolute linking to subdomains
|
||||
! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
|
||||
- Type variable in HTMLDefinition was not being set properly, fixed
|
||||
- Documentation updated
|
||||
+ TODO added request Phalanger
|
||||
+ TODO added request Native compression
|
||||
+ TODO added request Remove redundant tags
|
||||
+ TODO added possible plaintext formatter for HTML Purifier documentation
|
||||
+ Updated ConfigDoc TODO
|
||||
+ Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
|
||||
and AttrDef/Host.php
|
||||
+ Revamped documentation into HTML, along with misc updates
|
||||
- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
|
||||
to retrieve a non-existent variable
|
||||
. Switched to purify()-wide Context object registry
|
||||
. Refactored unit tests to minimize duplication
|
||||
. XSS attack sheet updated
|
||||
. configdoc.xml now has xml:space attached to default value nodes
|
||||
. Allow configuration directives to permit null values
|
||||
. Cleaned up test-cases to remove unnecessary swallowErrors()
|
||||
|
||||
1.1.2, released 2006-09-30
|
||||
! Add HTMLPurifier.auto.php stub file that configures include_path
|
||||
- Documentation updated
|
||||
+ INSTALL document rewritten
|
||||
+ TODO added semi-lossy conversion
|
||||
+ API Doxygen docs' file exclusions updated
|
||||
+ Added notes on HTML versus XML attribute whitespace handling
|
||||
+ Noted that HTMLPurifier_ChildDef_Custom isn't being used
|
||||
+ Noted that config object's definitions are cached versions
|
||||
- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
|
||||
- ftp:// URIs now have their typecodes checked
|
||||
- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
|
||||
. Line endings standardized throughout project (svn:eol-style standardized)
|
||||
. Refactored parseData() to general Lexer class
|
||||
. Tester named "HTML Purifier" not "HTMLPurifier"
|
||||
|
||||
1.1.1, released 2006-09-24
|
||||
! Configuration option to optionally Tidy up output for indentation to make up
|
||||
for dropped whitespace by DOMLex (pretty-printing for the entire application
|
||||
should be done by a page-wide Tidy)
|
||||
- Various documentation updates
|
||||
- Fixed parse error in configuration documentation script
|
||||
- Fixed fatal error in benchmark scripts, slightly augmented
|
||||
- As far as possible, whitespace is preserved in-between table children
|
||||
- Sample test-settings.php file included
|
||||
|
||||
1.1.0, released 2006-09-16
|
||||
! Directive documentation generation using XSLT
|
||||
! XHTML can now be turned off, output becomes <br>
|
||||
- Made URI validator more forgiving: will ignore leading and trailing
|
||||
quotes, apostrophes and less than or greater than signs.
|
||||
- Enforce alphanumeric namespace and directive names for configuration.
|
||||
- Table child definition made more flexible, will fix up poorly ordered elements
|
||||
. Renamed ConfigDef to ConfigSchema
|
||||
|
||||
1.0.1, released 2006-09-04
|
||||
- Fixed slight bug in DOMLex attribute parsing
|
||||
- Fixed rejection of case-insensitive configuration values when there is a
|
||||
set of allowed values. This manifested in %Core.Encoding.
|
||||
- Fixed rejection of inline style declarations that had lots of extra
|
||||
space in them. This manifested in TinyMCE.
|
||||
|
||||
1.0.0, released 2006-09-01
|
||||
! Shorthand CSS properties implemented: font, border, background, list-style
|
||||
! Basic color keywords translated into hexadecimal values
|
||||
! Table CSS properties implemented
|
||||
! Support for charsets other than UTF-8 (defined by iconv)
|
||||
! Malformed UTF-8 and non-SGML character detection and cleaning implemented
|
||||
- Fixed broken numeric entity conversion
|
||||
- API documentation completed
|
||||
. (HTML|CSS)Definition de-singleton-ized
|
||||
|
||||
1.0.0beta, released 2006-08-16
|
||||
! First public release, most functionality implemented. Notable omissions are:
|
||||
+ Shorthand CSS properties
|
||||
+ Table CSS properties
|
||||
+ Deprecated attribute transformations
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
Vendored
+29
@@ -0,0 +1,29 @@
|
||||
HTML Purifier [](http://travis-ci.org/ezyang/htmlpurifier)
|
||||
=============
|
||||
|
||||
HTML Purifier is an HTML filtering solution that uses a unique combination
|
||||
of robust whitelists and aggressive parsing to ensure that not only are
|
||||
XSS attacks thwarted, but the resulting HTML is standards compliant.
|
||||
|
||||
HTML Purifier is oriented towards richly formatted documents from
|
||||
untrusted sources that require CSS and a full tag-set. This library can
|
||||
be configured to accept a more restrictive set of tags, but it won't be
|
||||
as efficient as more bare-bones parsers. It will, however, do the job
|
||||
right, which may be more important.
|
||||
|
||||
Places to go:
|
||||
|
||||
* See INSTALL for a quick installation guide
|
||||
* See docs/ for developer-oriented documentation, code examples and
|
||||
an in-depth installation guide.
|
||||
* See WYSIWYG for information on editors like TinyMCE and FCKeditor
|
||||
|
||||
HTML Purifier can be found on the web at: [http://htmlpurifier.org/](http://htmlpurifier.org/)
|
||||
|
||||
## Installation
|
||||
|
||||
Package available on [Composer](https://packagist.org/packages/ezyang/htmlpurifier).
|
||||
|
||||
If you're using Composer to manage dependencies, you can use
|
||||
|
||||
$ composer require "ezyang/htmlpurifier":"dev-master"
|
||||
Vendored
+150
@@ -0,0 +1,150 @@
|
||||
|
||||
TODO List
|
||||
|
||||
= KEY ====================
|
||||
# Flagship
|
||||
- Regular
|
||||
? Maybe I'll Do It
|
||||
==========================
|
||||
|
||||
If no interest is expressed for a feature that may require a considerable
|
||||
amount of effort to implement, it may get endlessly delayed. Do not be
|
||||
afraid to cast your vote for the next feature to be implemented!
|
||||
|
||||
Things to do as soon as possible:
|
||||
|
||||
- http://htmlpurifier.org/phorum/read.php?3,5560,6307#msg-6307
|
||||
- Think about allowing explicit order of operations hooks for transforms
|
||||
- Fix "<.<" bug (trailing < is removed if not EOD)
|
||||
- Build in better internal state dumps and debugging tools for remote
|
||||
debugging
|
||||
- Allowed/Allowed* have strange interactions when both set
|
||||
? Transform lone embeds into object tags
|
||||
- Deprecated config options that emit warnings when you set them (with'
|
||||
a way of muting the warning if you really want to)
|
||||
- Make HTML.Trusted work with Output.FlashCompat
|
||||
- HTML.Trusted and HTML.SafeObject have funny interaction; general
|
||||
problem is what to do when a module "supersedes" another
|
||||
(see also tables and basic tables.) This is a little dicier
|
||||
because HTML.SafeObject has some extra functionality that
|
||||
trusted might find useful. See http://htmlpurifier.org/phorum/read.php?3,5762,6100
|
||||
|
||||
FUTURE VERSIONS
|
||||
---------------
|
||||
|
||||
4.9 release [OMG CONFIG PONIES]
|
||||
! Fix Printer. It's from the old days when we didn't have decent XML classes
|
||||
! Factor demo.php into a set of Printer classes, and then create a stub
|
||||
file for users here (inside the actual HTML Purifier library)
|
||||
- Fix error handling with form construction
|
||||
- Do encoding validation in Printers, or at least, where user data comes in
|
||||
- Config: Add examples to everything (make built-in which also automatically
|
||||
gives output)
|
||||
- Add "register" field to config schemas to eliminate dependence on
|
||||
naming conventions (try to remember why we ultimately decided on tihs)
|
||||
|
||||
5.0 release [HTML 5]
|
||||
# Swap out code to use html5lib tokenizer and tree-builder
|
||||
! Allow turning off of FixNesting and required attribute insertion
|
||||
|
||||
5.1 release [It's All About Trust] (floating)
|
||||
# Implement untrusted, dangerous elements/attributes
|
||||
# Implement IDREF support (harder than it seems, since you cannot have
|
||||
IDREFs to non-existent IDs)
|
||||
- Implement <area> (client and server side image maps are blocking
|
||||
on IDREF support)
|
||||
# Frameset XHTML 1.0 and HTML 4.01 doctypes
|
||||
- Figure out how to simultaneously set %CSS.Trusted and %HTML.Trusted (?)
|
||||
|
||||
5.2 release [Error'ed]
|
||||
# Error logging for filtering/cleanup procedures
|
||||
# Additional support for poorly written HTML
|
||||
- Microsoft Word HTML cleaning (i.e. MsoNormal, but research essential!)
|
||||
- Friendly strict handling of <address> (block -> <br>)
|
||||
- XSS-attempt detection--certain errors are flagged XSS-like
|
||||
- Append something to duplicate IDs so they're still usable (impl. note: the
|
||||
dupe detector would also need to detect the suffix as well)
|
||||
|
||||
6.0 release [Beyond HTML]
|
||||
# Legit token based CSS parsing (will require revamping almost every
|
||||
AttrDef class). Probably will use CSSTidy
|
||||
# More control over allowed CSS properties using a modularization
|
||||
# IRI support (this includes IDN)
|
||||
- Standardize token armor for all areas of processing
|
||||
|
||||
7.0 release [To XML and Beyond]
|
||||
- Extended HTML capabilities based on namespacing and tag transforms (COMPLEX)
|
||||
- Hooks for adding custom processors to custom namespaced tags and
|
||||
attributes, offer default implementation
|
||||
- Lots of documentation and samples
|
||||
|
||||
Ongoing
|
||||
- More refactoring to take advantage of PHP5's facilities
|
||||
- Refactor unit tests into lots of test methods
|
||||
- Plugins for major CMSes (COMPLEX)
|
||||
- phpBB
|
||||
- Also, a FAQ for extension writers with HTML Purifier
|
||||
|
||||
AutoFormat
|
||||
- Smileys
|
||||
- Syntax highlighting (with GeSHi) with <pre> and possibly <?php
|
||||
- Look at http://drupal.org/project/Modules/category/63 for ideas
|
||||
|
||||
Neat feature related
|
||||
! Support exporting configuration, so users can easily tweak settings
|
||||
in the demo, and then copy-paste into their own setup
|
||||
- Advanced URI filtering schemes (see docs/proposal-new-directives.txt)
|
||||
- Allow scoped="scoped" attribute in <style> tags; may be troublesome
|
||||
because regular CSS has no way of uniquely identifying nodes, so we'd
|
||||
have to generate IDs
|
||||
- Explain how to use HTML Purifier in non-PHP languages / create
|
||||
a simple command line stub (or complicated?)
|
||||
- Fixes for Firefox's inability to handle COL alignment props (Bug 915)
|
||||
- Automatically add non-breaking spaces to empty table cells when
|
||||
empty-cells:show is applied to have compatibility with Internet Explorer
|
||||
- Table of Contents generation (XHTML Compiler might be reusable). May also
|
||||
be out-of-band information.
|
||||
- Full set of color keywords. Also, a way to add onto them without
|
||||
finalizing the configuration object.
|
||||
- Write a var_export and memcached DefinitionCache - Denis
|
||||
- Built-in support for target="_blank" on all external links
|
||||
- Convert RTL/LTR override characters to <bdo> tags, or vice versa on demand.
|
||||
Also, enable disabling of directionality
|
||||
? Externalize inline CSS to promote clean HTML, proposed by Sander Tekelenburg
|
||||
? Remove redundant tags, ex. <u><u>Underlined</u></u>. Implementation notes:
|
||||
1. Analyzing which tags to remove duplicants
|
||||
2. Ensure attributes are merged into the parent tag
|
||||
3. Extend the tag exclusion system to specify whether or not the
|
||||
contents should be dropped or not (currently, there's code that could do
|
||||
something like this if it didn't drop the inner text too.)
|
||||
? Make AutoParagraph also support paragraph-izing double <br> tags, and not
|
||||
just double newlines. This is kind of tough to do in the current framework,
|
||||
though, and might be reasonably approximated by search replacing double <br>s
|
||||
with newlines before running it through HTML Purifier.
|
||||
|
||||
Maintenance related (slightly boring)
|
||||
# CHMOD install script for PEAR installs
|
||||
! Factor out command line parser into its own class, and unit test it
|
||||
- Reduce size of internal data-structures (esp. HTMLDefinition)
|
||||
- Allow merging configurations. Thus,
|
||||
a -> b -> default
|
||||
c -> d -> default
|
||||
becomes
|
||||
a -> b -> c -> d -> default
|
||||
Maybe allow more fine-grained tuning of this behavior. Alternatively,
|
||||
encourage people to use short plist depths before building them up.
|
||||
- Time PHPT tests
|
||||
|
||||
ChildDef related (very boring)
|
||||
- Abstract ChildDef_BlockQuote to work with all elements that only
|
||||
allow blocks in them, required or optional
|
||||
- Implement lenient <ruby> child validation
|
||||
|
||||
Wontfix
|
||||
- Non-lossy smart alternate character encoding transformations (unless
|
||||
patch provided)
|
||||
- Pretty-printing HTML: users can use Tidy on the output on entire page
|
||||
- Native content compression, whitespace stripping: use gzip if this is
|
||||
really important
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
4.10.0
|
||||
Vendored
+13
@@ -0,0 +1,13 @@
|
||||
HTML Purifier 4.9.x is a maintenance release, collecting a year
|
||||
of accumulated bug fixes plus a few new features. New features
|
||||
include support for min/max-width/height CSS, and rgba/hsl/hsla
|
||||
in color specifications. Major bugfixes include improvements
|
||||
in the Serializer cache to avoid chmod'ing directories, better
|
||||
entity decoding (we won't accidentally encode entities that occur
|
||||
in URLs) and rel="noopener" on links with target attributes,
|
||||
to prevent them from overwriting the original frame.
|
||||
|
||||
4.9.3 works around an infinite loop bug in PHP 7.1 with the opcode
|
||||
cache (and has one other, minor bugfix, avoiding using autoloading
|
||||
when testing for DOMDocument presence). If these bugs do not
|
||||
affect you, you do not need to upgrade.
|
||||
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
|
||||
WYSIWYG - What You See Is What You Get
|
||||
HTML Purifier: A Pretty Good Fit for TinyMCE and FCKeditor
|
||||
|
||||
Javascript-based WYSIWYG editors, simply stated, are quite amazing. But I've
|
||||
always been wary about using them due to security issues: they handle the
|
||||
client-side magic, but once you've been served a piping hot load of unfiltered
|
||||
HTML, what should be done then? In some situations, you can serve it uncleaned,
|
||||
since you only offer these facilities to trusted(?) authors.
|
||||
|
||||
Unfortunantely, for blog comments and anonymous input, BBCode, Textile and
|
||||
other markup languages still reign supreme. Put simply: filtering HTML is
|
||||
hard work, and these WYSIWYG authors don't offer anything to alleviate that
|
||||
trouble. Therein lies the solution:
|
||||
|
||||
HTML Purifier is perfect for filtering pure-HTML input from WYSIWYG editors.
|
||||
|
||||
Enough said.
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "ezyang/htmlpurifier",
|
||||
"description": "Standards compliant HTML filter written in PHP",
|
||||
"type": "library",
|
||||
"keywords": ["html"],
|
||||
"homepage": "http://htmlpurifier.org/",
|
||||
"license": "LGPL",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Edward Z. Yang",
|
||||
"email": "admin@htmlpurifier.org",
|
||||
"homepage": "http://ezyang.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"simpletest/simpletest": "^1.1"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": { "HTMLPurifier": "library/" },
|
||||
"files": ["library/HTMLPurifier.composer.php"]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Decorator/extender XSLT processor specifically for HTML documents.
|
||||
*/
|
||||
class ConfigDoc_HTMLXSLTProcessor
|
||||
{
|
||||
|
||||
/**
|
||||
* Instance of XSLTProcessor
|
||||
*/
|
||||
protected $xsltProcessor;
|
||||
|
||||
public function __construct($proc = false)
|
||||
{
|
||||
if ($proc === false) $proc = new XSLTProcessor();
|
||||
$this->xsltProcessor = $proc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @note Allows a string $xsl filename to be passed
|
||||
*/
|
||||
public function importStylesheet($xsl)
|
||||
{
|
||||
if (is_string($xsl)) {
|
||||
$xsl_file = $xsl;
|
||||
$xsl = new DOMDocument();
|
||||
$xsl->load($xsl_file);
|
||||
}
|
||||
return $this->xsltProcessor->importStylesheet($xsl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms an XML file into compatible XHTML based on the stylesheet
|
||||
* @param $xml XML DOM tree, or string filename
|
||||
* @return string HTML output
|
||||
* @todo Rename to transformToXHTML, as transformToHTML is misleading
|
||||
*/
|
||||
public function transformToHTML($xml)
|
||||
{
|
||||
if (is_string($xml)) {
|
||||
$dom = new DOMDocument();
|
||||
$dom->load($xml);
|
||||
} else {
|
||||
$dom = $xml;
|
||||
}
|
||||
$out = $this->xsltProcessor->transformToXML($dom);
|
||||
|
||||
// fudges for HTML backwards compatibility
|
||||
// assumes that document is XHTML
|
||||
$out = str_replace('/>', ' />', $out); // <br /> not <br/>
|
||||
$out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns
|
||||
|
||||
if (class_exists('Tidy')) {
|
||||
// cleanup output
|
||||
$config = array(
|
||||
'indent' => true,
|
||||
'output-xhtml' => true,
|
||||
'wrap' => 80
|
||||
);
|
||||
$tidy = new Tidy;
|
||||
$tidy->parseString($out, $config, 'utf8');
|
||||
$tidy->cleanRepair();
|
||||
$out = (string) $tidy;
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bulk sets parameters for the XSL stylesheet
|
||||
* @param array $options Associative array of options to set
|
||||
*/
|
||||
public function setParameters($options)
|
||||
{
|
||||
foreach ($options as $name => $value) {
|
||||
$this->xsltProcessor->setParameter('', $name, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Forward any other calls to the XSLT processor
|
||||
*/
|
||||
public function __call($name, $arguments)
|
||||
{
|
||||
call_user_func_array(array($this->xsltProcessor, $name), $arguments);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Filesystem tools not provided by default; can recursively create, copy
|
||||
* and delete folders. Some template methods are provided for extensibility.
|
||||
*
|
||||
* @note This class must be instantiated to be used, although it does
|
||||
* not maintain state.
|
||||
*/
|
||||
class FSTools
|
||||
{
|
||||
|
||||
private static $singleton;
|
||||
|
||||
/**
|
||||
* Returns a global instance of FSTools
|
||||
*/
|
||||
public static function singleton()
|
||||
{
|
||||
if (empty(FSTools::$singleton)) FSTools::$singleton = new FSTools();
|
||||
return FSTools::$singleton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets our global singleton to something else; useful for overloading
|
||||
* functions.
|
||||
*/
|
||||
public static function setSingleton($singleton)
|
||||
{
|
||||
FSTools::$singleton = $singleton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively creates a directory
|
||||
* @param string $folder Name of folder to create
|
||||
* @note Adapted from the PHP manual comment 76612
|
||||
*/
|
||||
public function mkdirr($folder)
|
||||
{
|
||||
$folders = preg_split("#[\\\\/]#", $folder);
|
||||
$base = '';
|
||||
for($i = 0, $c = count($folders); $i < $c; $i++) {
|
||||
if(empty($folders[$i])) {
|
||||
if (!$i) {
|
||||
// special case for root level
|
||||
$base .= DIRECTORY_SEPARATOR;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
$base .= $folders[$i];
|
||||
if(!is_dir($base)){
|
||||
$this->mkdir($base);
|
||||
}
|
||||
$base .= DIRECTORY_SEPARATOR;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a file, or recursively copy a folder and its contents; modified
|
||||
* so that copied files, if PHP, have includes removed
|
||||
* @note Adapted from http://aidanlister.com/repos/v/function.copyr.php
|
||||
*/
|
||||
public function copyr($source, $dest)
|
||||
{
|
||||
// Simple copy for a file
|
||||
if (is_file($source)) {
|
||||
return $this->copy($source, $dest);
|
||||
}
|
||||
// Make destination directory
|
||||
if (!is_dir($dest)) {
|
||||
$this->mkdir($dest);
|
||||
}
|
||||
// Loop through the folder
|
||||
$dir = $this->dir($source);
|
||||
while ( false !== ($entry = $dir->read()) ) {
|
||||
// Skip pointers
|
||||
if ($entry == '.' || $entry == '..') {
|
||||
continue;
|
||||
}
|
||||
if (!$this->copyable($entry)) {
|
||||
continue;
|
||||
}
|
||||
// Deep copy directories
|
||||
if ($dest !== "$source/$entry") {
|
||||
$this->copyr("$source/$entry", "$dest/$entry");
|
||||
}
|
||||
}
|
||||
// Clean up
|
||||
$dir->close();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overloadable function that tests a filename for copyability. By
|
||||
* default, everything should be copied; you can restrict things to
|
||||
* ignore hidden files, unreadable files, etc. This function
|
||||
* applies to copyr().
|
||||
*/
|
||||
public function copyable($file)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a file, or a folder and its contents
|
||||
* @note Adapted from http://aidanlister.com/repos/v/function.rmdirr.php
|
||||
*/
|
||||
public function rmdirr($dirname)
|
||||
{
|
||||
// Sanity check
|
||||
if (!$this->file_exists($dirname)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Simple delete for a file
|
||||
if ($this->is_file($dirname) || $this->is_link($dirname)) {
|
||||
return $this->unlink($dirname);
|
||||
}
|
||||
|
||||
// Loop through the folder
|
||||
$dir = $this->dir($dirname);
|
||||
while (false !== $entry = $dir->read()) {
|
||||
// Skip pointers
|
||||
if ($entry == '.' || $entry == '..') {
|
||||
continue;
|
||||
}
|
||||
// Recurse
|
||||
$this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
|
||||
}
|
||||
|
||||
// Clean up
|
||||
$dir->close();
|
||||
return $this->rmdir($dirname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively globs a directory.
|
||||
*/
|
||||
public function globr($dir, $pattern, $flags = NULL)
|
||||
{
|
||||
$files = $this->glob("$dir/$pattern", $flags);
|
||||
if ($files === false) $files = array();
|
||||
$sub_dirs = $this->glob("$dir/*", GLOB_ONLYDIR);
|
||||
if ($sub_dirs === false) $sub_dirs = array();
|
||||
foreach ($sub_dirs as $sub_dir) {
|
||||
$sub_files = $this->globr($sub_dir, $pattern, $flags);
|
||||
$files = array_merge($files, $sub_files);
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows for PHP functions to be called and be stubbed.
|
||||
* @warning This function will not work for functions that need
|
||||
* to pass references; manually define a stub function for those.
|
||||
*/
|
||||
public function __call($name, $args)
|
||||
{
|
||||
return call_user_func_array($name, $args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Represents a file in the filesystem
|
||||
*
|
||||
* @warning Be sure to distinguish between get() and write() versus
|
||||
* read() and put(), the former operates on the entire file, while
|
||||
* the latter operates on a handle.
|
||||
*/
|
||||
class FSTools_File
|
||||
{
|
||||
|
||||
/** Filename of file this object represents */
|
||||
protected $name;
|
||||
|
||||
/** Handle for the file */
|
||||
protected $handle = false;
|
||||
|
||||
/** Instance of FSTools for interfacing with filesystem */
|
||||
protected $fs;
|
||||
|
||||
/**
|
||||
* Filename of file you wish to instantiate.
|
||||
* @note This file need not exist
|
||||
*/
|
||||
public function __construct($name, $fs = false)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->fs = $fs ? $fs : FSTools::singleton();
|
||||
}
|
||||
|
||||
/** Returns the filename of the file. */
|
||||
public function getName() {return $this->name;}
|
||||
|
||||
/** Returns directory of the file without trailing slash */
|
||||
public function getDirectory() {return $this->fs->dirname($this->name);}
|
||||
|
||||
/**
|
||||
* Retrieves the contents of a file
|
||||
* @todo Throw an exception if file doesn't exist
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
return $this->fs->file_get_contents($this->name);
|
||||
}
|
||||
|
||||
/** Writes contents to a file, creates new file if necessary */
|
||||
public function write($contents)
|
||||
{
|
||||
return $this->fs->file_put_contents($this->name, $contents);
|
||||
}
|
||||
|
||||
/** Deletes the file */
|
||||
public function delete()
|
||||
{
|
||||
return $this->fs->unlink($this->name);
|
||||
}
|
||||
|
||||
/** Returns true if file exists and is a file. */
|
||||
public function exists()
|
||||
{
|
||||
return $this->fs->is_file($this->name);
|
||||
}
|
||||
|
||||
/** Returns last file modification time */
|
||||
public function getMTime()
|
||||
{
|
||||
return $this->fs->filemtime($this->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Chmod a file
|
||||
* @note We ignore errors because of some weird owner trickery due
|
||||
* to SVN duality
|
||||
*/
|
||||
public function chmod($octal_code)
|
||||
{
|
||||
return @$this->fs->chmod($this->name, $octal_code);
|
||||
}
|
||||
|
||||
/** Opens file's handle */
|
||||
public function open($mode)
|
||||
{
|
||||
if ($this->handle) $this->close();
|
||||
$this->handle = $this->fs->fopen($this->name, $mode);
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Closes file's handle */
|
||||
public function close()
|
||||
{
|
||||
if (!$this->handle) return false;
|
||||
$status = $this->fs->fclose($this->handle);
|
||||
$this->handle = false;
|
||||
return $status;
|
||||
}
|
||||
|
||||
/** Retrieves a line from an open file, with optional max length $length */
|
||||
public function getLine($length = null)
|
||||
{
|
||||
if (!$this->handle) $this->open('r');
|
||||
if ($length === null) return $this->fs->fgets($this->handle);
|
||||
else return $this->fs->fgets($this->handle, $length);
|
||||
}
|
||||
|
||||
/** Retrieves a character from an open file */
|
||||
public function getChar()
|
||||
{
|
||||
if (!$this->handle) $this->open('r');
|
||||
return $this->fs->fgetc($this->handle);
|
||||
}
|
||||
|
||||
/** Retrieves an $length bytes of data from an open data */
|
||||
public function read($length)
|
||||
{
|
||||
if (!$this->handle) $this->open('r');
|
||||
return $this->fs->fread($this->handle, $length);
|
||||
}
|
||||
|
||||
/** Writes to an open file */
|
||||
public function put($string)
|
||||
{
|
||||
if (!$this->handle) $this->open('a');
|
||||
return $this->fs->fwrite($this->handle, $string);
|
||||
}
|
||||
|
||||
/** Returns TRUE if the end of the file has been reached */
|
||||
public function eof()
|
||||
{
|
||||
if (!$this->handle) return true;
|
||||
return $this->fs->feof($this->handle);
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
if ($this->handle) $this->close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This is a stub include that automatically configures the include path.
|
||||
*/
|
||||
|
||||
set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
|
||||
require_once 'HTMLPurifierExtras.php';
|
||||
require_once 'HTMLPurifierExtras.autoload.php';
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Legacy autoloader for systems lacking spl_autoload_register
|
||||
*
|
||||
* Must be separate to prevent deprecation warning on PHP 7.2
|
||||
*/
|
||||
|
||||
function __autoload($class)
|
||||
{
|
||||
return HTMLPurifierExtras::autoload($class);
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Convenience file that registers autoload handler for HTML Purifier.
|
||||
*
|
||||
* @warning
|
||||
* This autoloader does not contain the compatibility code seen in
|
||||
* HTMLPurifier_Bootstrap; the user is expected to make any necessary
|
||||
* changes to use this library.
|
||||
*/
|
||||
|
||||
if (function_exists('spl_autoload_register')) {
|
||||
spl_autoload_register(array('HTMLPurifierExtras', 'autoload'));
|
||||
if (function_exists('__autoload')) {
|
||||
// Be polite and ensure that userland autoload gets retained
|
||||
spl_autoload_register('__autoload');
|
||||
}
|
||||
} elseif (!function_exists('__autoload')) {
|
||||
require dirname(__FILE__) . '/HTMLPurifierExtras.autoload-legacy.php';
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Meta-class for HTML Purifier's extra class hierarchies, similar to
|
||||
* HTMLPurifier_Bootstrap.
|
||||
*/
|
||||
class HTMLPurifierExtras
|
||||
{
|
||||
|
||||
public static function autoload($class)
|
||||
{
|
||||
$path = HTMLPurifierExtras::getPath($class);
|
||||
if (!$path) return false;
|
||||
require $path;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function getPath($class)
|
||||
{
|
||||
if (
|
||||
strncmp('FSTools', $class, 7) !== 0 &&
|
||||
strncmp('ConfigDoc', $class, 9) !== 0
|
||||
) return false;
|
||||
// Custom implementations can go here
|
||||
// Standard implementation:
|
||||
return str_replace('_', '/', $class) . '.php';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
|
||||
HTML Purifier Extras
|
||||
The Method Behind The Madness!
|
||||
|
||||
The extras/ folder in HTML Purifier contains--you guessed it--extra things
|
||||
for HTML Purifier. Specifically, these are two extra libraries called
|
||||
FSTools and ConfigSchema. They're extra for a reason: you don't need them
|
||||
if you're using HTML Purifier for normal usage: filtering HTML. However,
|
||||
if you're a developer, and would like to test HTML Purifier, or need to
|
||||
use one of HTML Purifier's maintenance scripts, chances are they'll need
|
||||
these libraries. Who knows: maybe you'll find them useful too!
|
||||
|
||||
Here are the libraries:
|
||||
|
||||
|
||||
FSTools
|
||||
-------
|
||||
|
||||
Short for File System Tools, this is a poor-man's object-oriented wrapper for
|
||||
the filesystem. It currently consists of two classes:
|
||||
|
||||
- FSTools: This is a singleton that contains a manner of useful functions
|
||||
such as recursive glob, directory removal, etc, as well as the ability
|
||||
to call arbitrary native PHP functions through it like $FS->fopen(...).
|
||||
This makes it a lot simpler to mock these filesystem calls for unit testing.
|
||||
|
||||
- FSTools_File: This object represents a single file, and has almost any
|
||||
method imaginable one would need.
|
||||
|
||||
Check the files themselves for more information.
|
||||
|
||||
vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This is a stub include that automatically configures the include path.
|
||||
*/
|
||||
|
||||
set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
|
||||
require_once 'HTMLPurifier/Bootstrap.php';
|
||||
require_once 'HTMLPurifier.autoload.php';
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Legacy autoloader for systems lacking spl_autoload_register
|
||||
*
|
||||
* Must be separate to prevent deprecation warning on PHP 7.2
|
||||
*/
|
||||
|
||||
function __autoload($class)
|
||||
{
|
||||
return HTMLPurifier_Bootstrap::autoload($class);
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Convenience file that registers autoload handler for HTML Purifier.
|
||||
* It also does some sanity checks.
|
||||
*/
|
||||
|
||||
if (function_exists('spl_autoload_register') && function_exists('spl_autoload_unregister')) {
|
||||
// We need unregister for our pre-registering functionality
|
||||
HTMLPurifier_Bootstrap::registerAutoload();
|
||||
if (function_exists('__autoload')) {
|
||||
// Be polite and ensure that userland autoload gets retained
|
||||
spl_autoload_register('__autoload');
|
||||
}
|
||||
} elseif (!function_exists('__autoload')) {
|
||||
require dirname(__FILE__) . '/HTMLPurifier.autoload-legacy.php';
|
||||
}
|
||||
|
||||
if (ini_get('zend.ze1_compatibility_mode')) {
|
||||
trigger_error("HTML Purifier is not compatible with zend.ze1_compatibility_mode; please turn it off", E_USER_ERROR);
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,4 @@
|
||||
<?php
|
||||
if (!defined('HTMLPURIFIER_PREFIX')) {
|
||||
define('HTMLPURIFIER_PREFIX', dirname(__FILE__));
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Defines a function wrapper for HTML Purifier for quick use.
|
||||
* @note ''HTMLPurifier()'' is NOT the same as ''new HTMLPurifier()''
|
||||
*/
|
||||
|
||||
/**
|
||||
* Purify HTML.
|
||||
* @param string $html String HTML to purify
|
||||
* @param mixed $config Configuration to use, can be any value accepted by
|
||||
* HTMLPurifier_Config::create()
|
||||
* @return string
|
||||
*/
|
||||
function HTMLPurifier($html, $config = null)
|
||||
{
|
||||
static $purifier = false;
|
||||
if (!$purifier) {
|
||||
$purifier = new HTMLPurifier();
|
||||
}
|
||||
return $purifier->purify($html, $config);
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,234 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* This file was auto-generated by generate-includes.php and includes all of
|
||||
* the core files required by HTML Purifier. Use this if performance is a
|
||||
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
|
||||
* FILE, changes will be overwritten the next time the script is run.
|
||||
*
|
||||
* @version 4.10.0
|
||||
*
|
||||
* @warning
|
||||
* You must *not* include any other HTML Purifier files before this file,
|
||||
* because 'require' not 'require_once' is used.
|
||||
*
|
||||
* @warning
|
||||
* This file requires that the include path contains the HTML Purifier
|
||||
* library directory; this is not auto-set.
|
||||
*/
|
||||
|
||||
require 'HTMLPurifier.php';
|
||||
require 'HTMLPurifier/Arborize.php';
|
||||
require 'HTMLPurifier/AttrCollections.php';
|
||||
require 'HTMLPurifier/AttrDef.php';
|
||||
require 'HTMLPurifier/AttrTransform.php';
|
||||
require 'HTMLPurifier/AttrTypes.php';
|
||||
require 'HTMLPurifier/AttrValidator.php';
|
||||
require 'HTMLPurifier/Bootstrap.php';
|
||||
require 'HTMLPurifier/Definition.php';
|
||||
require 'HTMLPurifier/CSSDefinition.php';
|
||||
require 'HTMLPurifier/ChildDef.php';
|
||||
require 'HTMLPurifier/Config.php';
|
||||
require 'HTMLPurifier/ConfigSchema.php';
|
||||
require 'HTMLPurifier/ContentSets.php';
|
||||
require 'HTMLPurifier/Context.php';
|
||||
require 'HTMLPurifier/DefinitionCache.php';
|
||||
require 'HTMLPurifier/DefinitionCacheFactory.php';
|
||||
require 'HTMLPurifier/Doctype.php';
|
||||
require 'HTMLPurifier/DoctypeRegistry.php';
|
||||
require 'HTMLPurifier/ElementDef.php';
|
||||
require 'HTMLPurifier/Encoder.php';
|
||||
require 'HTMLPurifier/EntityLookup.php';
|
||||
require 'HTMLPurifier/EntityParser.php';
|
||||
require 'HTMLPurifier/ErrorCollector.php';
|
||||
require 'HTMLPurifier/ErrorStruct.php';
|
||||
require 'HTMLPurifier/Exception.php';
|
||||
require 'HTMLPurifier/Filter.php';
|
||||
require 'HTMLPurifier/Generator.php';
|
||||
require 'HTMLPurifier/HTMLDefinition.php';
|
||||
require 'HTMLPurifier/HTMLModule.php';
|
||||
require 'HTMLPurifier/HTMLModuleManager.php';
|
||||
require 'HTMLPurifier/IDAccumulator.php';
|
||||
require 'HTMLPurifier/Injector.php';
|
||||
require 'HTMLPurifier/Language.php';
|
||||
require 'HTMLPurifier/LanguageFactory.php';
|
||||
require 'HTMLPurifier/Length.php';
|
||||
require 'HTMLPurifier/Lexer.php';
|
||||
require 'HTMLPurifier/Node.php';
|
||||
require 'HTMLPurifier/PercentEncoder.php';
|
||||
require 'HTMLPurifier/PropertyList.php';
|
||||
require 'HTMLPurifier/PropertyListIterator.php';
|
||||
require 'HTMLPurifier/Queue.php';
|
||||
require 'HTMLPurifier/Strategy.php';
|
||||
require 'HTMLPurifier/StringHash.php';
|
||||
require 'HTMLPurifier/StringHashParser.php';
|
||||
require 'HTMLPurifier/TagTransform.php';
|
||||
require 'HTMLPurifier/Token.php';
|
||||
require 'HTMLPurifier/TokenFactory.php';
|
||||
require 'HTMLPurifier/URI.php';
|
||||
require 'HTMLPurifier/URIDefinition.php';
|
||||
require 'HTMLPurifier/URIFilter.php';
|
||||
require 'HTMLPurifier/URIParser.php';
|
||||
require 'HTMLPurifier/URIScheme.php';
|
||||
require 'HTMLPurifier/URISchemeRegistry.php';
|
||||
require 'HTMLPurifier/UnitConverter.php';
|
||||
require 'HTMLPurifier/VarParser.php';
|
||||
require 'HTMLPurifier/VarParserException.php';
|
||||
require 'HTMLPurifier/Zipper.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS.php';
|
||||
require 'HTMLPurifier/AttrDef/Clone.php';
|
||||
require 'HTMLPurifier/AttrDef/Enum.php';
|
||||
require 'HTMLPurifier/AttrDef/Integer.php';
|
||||
require 'HTMLPurifier/AttrDef/Lang.php';
|
||||
require 'HTMLPurifier/AttrDef/Switch.php';
|
||||
require 'HTMLPurifier/AttrDef/Text.php';
|
||||
require 'HTMLPurifier/AttrDef/URI.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Number.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Background.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Border.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Color.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Composite.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Filter.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Font.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Ident.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Length.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
|
||||
require 'HTMLPurifier/AttrDef/CSS/URI.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Bool.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Class.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Color.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/ID.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/Length.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
|
||||
require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
|
||||
require 'HTMLPurifier/AttrDef/URI/Email.php';
|
||||
require 'HTMLPurifier/AttrDef/URI/Host.php';
|
||||
require 'HTMLPurifier/AttrDef/URI/IPv4.php';
|
||||
require 'HTMLPurifier/AttrDef/URI/IPv6.php';
|
||||
require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
|
||||
require 'HTMLPurifier/AttrTransform/Background.php';
|
||||
require 'HTMLPurifier/AttrTransform/BdoDir.php';
|
||||
require 'HTMLPurifier/AttrTransform/BgColor.php';
|
||||
require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
|
||||
require 'HTMLPurifier/AttrTransform/Border.php';
|
||||
require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
|
||||
require 'HTMLPurifier/AttrTransform/ImgRequired.php';
|
||||
require 'HTMLPurifier/AttrTransform/ImgSpace.php';
|
||||
require 'HTMLPurifier/AttrTransform/Input.php';
|
||||
require 'HTMLPurifier/AttrTransform/Lang.php';
|
||||
require 'HTMLPurifier/AttrTransform/Length.php';
|
||||
require 'HTMLPurifier/AttrTransform/Name.php';
|
||||
require 'HTMLPurifier/AttrTransform/NameSync.php';
|
||||
require 'HTMLPurifier/AttrTransform/Nofollow.php';
|
||||
require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
|
||||
require 'HTMLPurifier/AttrTransform/SafeObject.php';
|
||||
require 'HTMLPurifier/AttrTransform/SafeParam.php';
|
||||
require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
|
||||
require 'HTMLPurifier/AttrTransform/TargetBlank.php';
|
||||
require 'HTMLPurifier/AttrTransform/TargetNoopener.php';
|
||||
require 'HTMLPurifier/AttrTransform/TargetNoreferrer.php';
|
||||
require 'HTMLPurifier/AttrTransform/Textarea.php';
|
||||
require 'HTMLPurifier/ChildDef/Chameleon.php';
|
||||
require 'HTMLPurifier/ChildDef/Custom.php';
|
||||
require 'HTMLPurifier/ChildDef/Empty.php';
|
||||
require 'HTMLPurifier/ChildDef/List.php';
|
||||
require 'HTMLPurifier/ChildDef/Required.php';
|
||||
require 'HTMLPurifier/ChildDef/Optional.php';
|
||||
require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
|
||||
require 'HTMLPurifier/ChildDef/Table.php';
|
||||
require 'HTMLPurifier/DefinitionCache/Decorator.php';
|
||||
require 'HTMLPurifier/DefinitionCache/Null.php';
|
||||
require 'HTMLPurifier/DefinitionCache/Serializer.php';
|
||||
require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
|
||||
require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
|
||||
require 'HTMLPurifier/HTMLModule/Bdo.php';
|
||||
require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
|
||||
require 'HTMLPurifier/HTMLModule/Edit.php';
|
||||
require 'HTMLPurifier/HTMLModule/Forms.php';
|
||||
require 'HTMLPurifier/HTMLModule/Hypertext.php';
|
||||
require 'HTMLPurifier/HTMLModule/Iframe.php';
|
||||
require 'HTMLPurifier/HTMLModule/Image.php';
|
||||
require 'HTMLPurifier/HTMLModule/Legacy.php';
|
||||
require 'HTMLPurifier/HTMLModule/List.php';
|
||||
require 'HTMLPurifier/HTMLModule/Name.php';
|
||||
require 'HTMLPurifier/HTMLModule/Nofollow.php';
|
||||
require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
|
||||
require 'HTMLPurifier/HTMLModule/Object.php';
|
||||
require 'HTMLPurifier/HTMLModule/Presentation.php';
|
||||
require 'HTMLPurifier/HTMLModule/Proprietary.php';
|
||||
require 'HTMLPurifier/HTMLModule/Ruby.php';
|
||||
require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
|
||||
require 'HTMLPurifier/HTMLModule/SafeObject.php';
|
||||
require 'HTMLPurifier/HTMLModule/SafeScripting.php';
|
||||
require 'HTMLPurifier/HTMLModule/Scripting.php';
|
||||
require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tables.php';
|
||||
require 'HTMLPurifier/HTMLModule/Target.php';
|
||||
require 'HTMLPurifier/HTMLModule/TargetBlank.php';
|
||||
require 'HTMLPurifier/HTMLModule/TargetNoopener.php';
|
||||
require 'HTMLPurifier/HTMLModule/TargetNoreferrer.php';
|
||||
require 'HTMLPurifier/HTMLModule/Text.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy.php';
|
||||
require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
|
||||
require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
|
||||
require 'HTMLPurifier/Injector/AutoParagraph.php';
|
||||
require 'HTMLPurifier/Injector/DisplayLinkURI.php';
|
||||
require 'HTMLPurifier/Injector/Linkify.php';
|
||||
require 'HTMLPurifier/Injector/PurifierLinkify.php';
|
||||
require 'HTMLPurifier/Injector/RemoveEmpty.php';
|
||||
require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
|
||||
require 'HTMLPurifier/Injector/SafeObject.php';
|
||||
require 'HTMLPurifier/Lexer/DOMLex.php';
|
||||
require 'HTMLPurifier/Lexer/DirectLex.php';
|
||||
require 'HTMLPurifier/Node/Comment.php';
|
||||
require 'HTMLPurifier/Node/Element.php';
|
||||
require 'HTMLPurifier/Node/Text.php';
|
||||
require 'HTMLPurifier/Strategy/Composite.php';
|
||||
require 'HTMLPurifier/Strategy/Core.php';
|
||||
require 'HTMLPurifier/Strategy/FixNesting.php';
|
||||
require 'HTMLPurifier/Strategy/MakeWellFormed.php';
|
||||
require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
|
||||
require 'HTMLPurifier/Strategy/ValidateAttributes.php';
|
||||
require 'HTMLPurifier/TagTransform/Font.php';
|
||||
require 'HTMLPurifier/TagTransform/Simple.php';
|
||||
require 'HTMLPurifier/Token/Comment.php';
|
||||
require 'HTMLPurifier/Token/Tag.php';
|
||||
require 'HTMLPurifier/Token/Empty.php';
|
||||
require 'HTMLPurifier/Token/End.php';
|
||||
require 'HTMLPurifier/Token/Start.php';
|
||||
require 'HTMLPurifier/Token/Text.php';
|
||||
require 'HTMLPurifier/URIFilter/DisableExternal.php';
|
||||
require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
|
||||
require 'HTMLPurifier/URIFilter/DisableResources.php';
|
||||
require 'HTMLPurifier/URIFilter/HostBlacklist.php';
|
||||
require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
|
||||
require 'HTMLPurifier/URIFilter/Munge.php';
|
||||
require 'HTMLPurifier/URIFilter/SafeIframe.php';
|
||||
require 'HTMLPurifier/URIScheme/data.php';
|
||||
require 'HTMLPurifier/URIScheme/file.php';
|
||||
require 'HTMLPurifier/URIScheme/ftp.php';
|
||||
require 'HTMLPurifier/URIScheme/http.php';
|
||||
require 'HTMLPurifier/URIScheme/https.php';
|
||||
require 'HTMLPurifier/URIScheme/mailto.php';
|
||||
require 'HTMLPurifier/URIScheme/news.php';
|
||||
require 'HTMLPurifier/URIScheme/nntp.php';
|
||||
require 'HTMLPurifier/URIScheme/tel.php';
|
||||
require 'HTMLPurifier/VarParser/Flexible.php';
|
||||
require 'HTMLPurifier/VarParser/Native.php';
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Emulation layer for code that used kses(), substituting in HTML Purifier.
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__) . '/HTMLPurifier.auto.php';
|
||||
|
||||
function kses($string, $allowed_html, $allowed_protocols = null)
|
||||
{
|
||||
$config = HTMLPurifier_Config::createDefault();
|
||||
$allowed_elements = array();
|
||||
$allowed_attributes = array();
|
||||
foreach ($allowed_html as $element => $attributes) {
|
||||
$allowed_elements[$element] = true;
|
||||
foreach ($attributes as $attribute => $x) {
|
||||
$allowed_attributes["$element.$attribute"] = true;
|
||||
}
|
||||
}
|
||||
$config->set('HTML.AllowedElements', $allowed_elements);
|
||||
$config->set('HTML.AllowedAttributes', $allowed_attributes);
|
||||
if ($allowed_protocols !== null) {
|
||||
$config->set('URI.AllowedSchemes', $allowed_protocols);
|
||||
}
|
||||
$purifier = new HTMLPurifier($config);
|
||||
return $purifier->purify($string);
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Convenience stub file that adds HTML Purifier's library file to the path
|
||||
* without any other side-effects.
|
||||
*/
|
||||
|
||||
set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+292
@@ -0,0 +1,292 @@
|
||||
<?php
|
||||
|
||||
/*! @mainpage
|
||||
*
|
||||
* HTML Purifier is an HTML filter that will take an arbitrary snippet of
|
||||
* HTML and rigorously test, validate and filter it into a version that
|
||||
* is safe for output onto webpages. It achieves this by:
|
||||
*
|
||||
* -# Lexing (parsing into tokens) the document,
|
||||
* -# Executing various strategies on the tokens:
|
||||
* -# Removing all elements not in the whitelist,
|
||||
* -# Making the tokens well-formed,
|
||||
* -# Fixing the nesting of the nodes, and
|
||||
* -# Validating attributes of the nodes; and
|
||||
* -# Generating HTML from the purified tokens.
|
||||
*
|
||||
* However, most users will only need to interface with the HTMLPurifier
|
||||
* and HTMLPurifier_Config.
|
||||
*/
|
||||
|
||||
/*
|
||||
HTML Purifier 4.10.0 - Standards Compliant HTML Filtering
|
||||
Copyright (C) 2006-2008 Edward Z. Yang
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
|
||||
*
|
||||
* @note There are several points in which configuration can be specified
|
||||
* for HTML Purifier. The precedence of these (from lowest to
|
||||
* highest) is as follows:
|
||||
* -# Instance: new HTMLPurifier($config)
|
||||
* -# Invocation: purify($html, $config)
|
||||
* These configurations are entirely independent of each other and
|
||||
* are *not* merged (this behavior may change in the future).
|
||||
*
|
||||
* @todo We need an easier way to inject strategies using the configuration
|
||||
* object.
|
||||
*/
|
||||
class HTMLPurifier
|
||||
{
|
||||
|
||||
/**
|
||||
* Version of HTML Purifier.
|
||||
* @type string
|
||||
*/
|
||||
public $version = '4.10.0';
|
||||
|
||||
/**
|
||||
* Constant with version of HTML Purifier.
|
||||
*/
|
||||
const VERSION = '4.10.0';
|
||||
|
||||
/**
|
||||
* Global configuration object.
|
||||
* @type HTMLPurifier_Config
|
||||
*/
|
||||
public $config;
|
||||
|
||||
/**
|
||||
* Array of extra filter objects to run on HTML,
|
||||
* for backwards compatibility.
|
||||
* @type HTMLPurifier_Filter[]
|
||||
*/
|
||||
private $filters = array();
|
||||
|
||||
/**
|
||||
* Single instance of HTML Purifier.
|
||||
* @type HTMLPurifier
|
||||
*/
|
||||
private static $instance;
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_Strategy_Core
|
||||
*/
|
||||
protected $strategy;
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_Generator
|
||||
*/
|
||||
protected $generator;
|
||||
|
||||
/**
|
||||
* Resultant context of last run purification.
|
||||
* Is an array of contexts if the last called method was purifyArray().
|
||||
* @type HTMLPurifier_Context
|
||||
*/
|
||||
public $context;
|
||||
|
||||
/**
|
||||
* Initializes the purifier.
|
||||
*
|
||||
* @param HTMLPurifier_Config|mixed $config Optional HTMLPurifier_Config object
|
||||
* for all instances of the purifier, if omitted, a default
|
||||
* configuration is supplied (which can be overridden on a
|
||||
* per-use basis).
|
||||
* The parameter can also be any type that
|
||||
* HTMLPurifier_Config::create() supports.
|
||||
*/
|
||||
public function __construct($config = null)
|
||||
{
|
||||
$this->config = HTMLPurifier_Config::create($config);
|
||||
$this->strategy = new HTMLPurifier_Strategy_Core();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a filter to process the output. First come first serve
|
||||
*
|
||||
* @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
|
||||
*/
|
||||
public function addFilter($filter)
|
||||
{
|
||||
trigger_error(
|
||||
'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
|
||||
' in the Filter namespace or Filter.Custom',
|
||||
E_USER_WARNING
|
||||
);
|
||||
$this->filters[] = $filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters an HTML snippet/document to be XSS-free and standards-compliant.
|
||||
*
|
||||
* @param string $html String of HTML to purify
|
||||
* @param HTMLPurifier_Config $config Config object for this operation,
|
||||
* if omitted, defaults to the config object specified during this
|
||||
* object's construction. The parameter can also be any type
|
||||
* that HTMLPurifier_Config::create() supports.
|
||||
*
|
||||
* @return string Purified HTML
|
||||
*/
|
||||
public function purify($html, $config = null)
|
||||
{
|
||||
// :TODO: make the config merge in, instead of replace
|
||||
$config = $config ? HTMLPurifier_Config::create($config) : $this->config;
|
||||
|
||||
// implementation is partially environment dependant, partially
|
||||
// configuration dependant
|
||||
$lexer = HTMLPurifier_Lexer::create($config);
|
||||
|
||||
$context = new HTMLPurifier_Context();
|
||||
|
||||
// setup HTML generator
|
||||
$this->generator = new HTMLPurifier_Generator($config, $context);
|
||||
$context->register('Generator', $this->generator);
|
||||
|
||||
// set up global context variables
|
||||
if ($config->get('Core.CollectErrors')) {
|
||||
// may get moved out if other facilities use it
|
||||
$language_factory = HTMLPurifier_LanguageFactory::instance();
|
||||
$language = $language_factory->create($config, $context);
|
||||
$context->register('Locale', $language);
|
||||
|
||||
$error_collector = new HTMLPurifier_ErrorCollector($context);
|
||||
$context->register('ErrorCollector', $error_collector);
|
||||
}
|
||||
|
||||
// setup id_accumulator context, necessary due to the fact that
|
||||
// AttrValidator can be called from many places
|
||||
$id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
|
||||
$context->register('IDAccumulator', $id_accumulator);
|
||||
|
||||
$html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
|
||||
|
||||
// setup filters
|
||||
$filter_flags = $config->getBatch('Filter');
|
||||
$custom_filters = $filter_flags['Custom'];
|
||||
unset($filter_flags['Custom']);
|
||||
$filters = array();
|
||||
foreach ($filter_flags as $filter => $flag) {
|
||||
if (!$flag) {
|
||||
continue;
|
||||
}
|
||||
if (strpos($filter, '.') !== false) {
|
||||
continue;
|
||||
}
|
||||
$class = "HTMLPurifier_Filter_$filter";
|
||||
$filters[] = new $class;
|
||||
}
|
||||
foreach ($custom_filters as $filter) {
|
||||
// maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
|
||||
$filters[] = $filter;
|
||||
}
|
||||
$filters = array_merge($filters, $this->filters);
|
||||
// maybe prepare(), but later
|
||||
|
||||
for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
|
||||
$html = $filters[$i]->preFilter($html, $config, $context);
|
||||
}
|
||||
|
||||
// purified HTML
|
||||
$html =
|
||||
$this->generator->generateFromTokens(
|
||||
// list of tokens
|
||||
$this->strategy->execute(
|
||||
// list of un-purified tokens
|
||||
$lexer->tokenizeHTML(
|
||||
// un-purified HTML
|
||||
$html,
|
||||
$config,
|
||||
$context
|
||||
),
|
||||
$config,
|
||||
$context
|
||||
)
|
||||
);
|
||||
|
||||
for ($i = $filter_size - 1; $i >= 0; $i--) {
|
||||
$html = $filters[$i]->postFilter($html, $config, $context);
|
||||
}
|
||||
|
||||
$html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
|
||||
$this->context =& $context;
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters an array of HTML snippets
|
||||
*
|
||||
* @param string[] $array_of_html Array of html snippets
|
||||
* @param HTMLPurifier_Config $config Optional config object for this operation.
|
||||
* See HTMLPurifier::purify() for more details.
|
||||
*
|
||||
* @return string[] Array of purified HTML
|
||||
*/
|
||||
public function purifyArray($array_of_html, $config = null)
|
||||
{
|
||||
$context_array = array();
|
||||
foreach ($array_of_html as $key => $html) {
|
||||
$array_of_html[$key] = $this->purify($html, $config);
|
||||
$context_array[$key] = $this->context;
|
||||
}
|
||||
$this->context = $context_array;
|
||||
return $array_of_html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Singleton for enforcing just one HTML Purifier in your system
|
||||
*
|
||||
* @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
|
||||
* HTMLPurifier instance to overload singleton with,
|
||||
* or HTMLPurifier_Config instance to configure the
|
||||
* generated version with.
|
||||
*
|
||||
* @return HTMLPurifier
|
||||
*/
|
||||
public static function instance($prototype = null)
|
||||
{
|
||||
if (!self::$instance || $prototype) {
|
||||
if ($prototype instanceof HTMLPurifier) {
|
||||
self::$instance = $prototype;
|
||||
} elseif ($prototype) {
|
||||
self::$instance = new HTMLPurifier($prototype);
|
||||
} else {
|
||||
self::$instance = new HTMLPurifier();
|
||||
}
|
||||
}
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Singleton for enforcing just one HTML Purifier in your system
|
||||
*
|
||||
* @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
|
||||
* HTMLPurifier instance to overload singleton with,
|
||||
* or HTMLPurifier_Config instance to configure the
|
||||
* generated version with.
|
||||
*
|
||||
* @return HTMLPurifier
|
||||
* @note Backwards compatibility, see instance()
|
||||
*/
|
||||
public static function getInstance($prototype = null)
|
||||
{
|
||||
return HTMLPurifier::instance($prototype);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,228 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* This file was auto-generated by generate-includes.php and includes all of
|
||||
* the core files required by HTML Purifier. This is a convenience stub that
|
||||
* includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
|
||||
* EDIT THIS FILE, changes will be overwritten the next time the script is run.
|
||||
*
|
||||
* Changes to include_path are not necessary.
|
||||
*/
|
||||
|
||||
$__dir = dirname(__FILE__);
|
||||
|
||||
require_once $__dir . '/HTMLPurifier.php';
|
||||
require_once $__dir . '/HTMLPurifier/Arborize.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrCollections.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTypes.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrValidator.php';
|
||||
require_once $__dir . '/HTMLPurifier/Bootstrap.php';
|
||||
require_once $__dir . '/HTMLPurifier/Definition.php';
|
||||
require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef.php';
|
||||
require_once $__dir . '/HTMLPurifier/Config.php';
|
||||
require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
|
||||
require_once $__dir . '/HTMLPurifier/ContentSets.php';
|
||||
require_once $__dir . '/HTMLPurifier/Context.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
|
||||
require_once $__dir . '/HTMLPurifier/Doctype.php';
|
||||
require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
|
||||
require_once $__dir . '/HTMLPurifier/ElementDef.php';
|
||||
require_once $__dir . '/HTMLPurifier/Encoder.php';
|
||||
require_once $__dir . '/HTMLPurifier/EntityLookup.php';
|
||||
require_once $__dir . '/HTMLPurifier/EntityParser.php';
|
||||
require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
|
||||
require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
|
||||
require_once $__dir . '/HTMLPurifier/Exception.php';
|
||||
require_once $__dir . '/HTMLPurifier/Filter.php';
|
||||
require_once $__dir . '/HTMLPurifier/Generator.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
|
||||
require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector.php';
|
||||
require_once $__dir . '/HTMLPurifier/Language.php';
|
||||
require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
|
||||
require_once $__dir . '/HTMLPurifier/Length.php';
|
||||
require_once $__dir . '/HTMLPurifier/Lexer.php';
|
||||
require_once $__dir . '/HTMLPurifier/Node.php';
|
||||
require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
|
||||
require_once $__dir . '/HTMLPurifier/PropertyList.php';
|
||||
require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
|
||||
require_once $__dir . '/HTMLPurifier/Queue.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy.php';
|
||||
require_once $__dir . '/HTMLPurifier/StringHash.php';
|
||||
require_once $__dir . '/HTMLPurifier/StringHashParser.php';
|
||||
require_once $__dir . '/HTMLPurifier/TagTransform.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token.php';
|
||||
require_once $__dir . '/HTMLPurifier/TokenFactory.php';
|
||||
require_once $__dir . '/HTMLPurifier/URI.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIDefinition.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIParser.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme.php';
|
||||
require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
|
||||
require_once $__dir . '/HTMLPurifier/UnitConverter.php';
|
||||
require_once $__dir . '/HTMLPurifier/VarParser.php';
|
||||
require_once $__dir . '/HTMLPurifier/VarParserException.php';
|
||||
require_once $__dir . '/HTMLPurifier/Zipper.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoopener.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoreferrer.php';
|
||||
require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
|
||||
require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
|
||||
require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoopener.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoreferrer.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
|
||||
require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
|
||||
require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
|
||||
require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
|
||||
require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
|
||||
require_once $__dir . '/HTMLPurifier/Node/Comment.php';
|
||||
require_once $__dir . '/HTMLPurifier/Node/Element.php';
|
||||
require_once $__dir . '/HTMLPurifier/Node/Text.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
|
||||
require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
|
||||
require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
|
||||
require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/Comment.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/Tag.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/Empty.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/End.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/Start.php';
|
||||
require_once $__dir . '/HTMLPurifier/Token/Text.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
|
||||
require_once $__dir . '/HTMLPurifier/URIScheme/tel.php';
|
||||
require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
|
||||
require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
|
||||
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
|
||||
* and back again.
|
||||
*
|
||||
* @note This transformation is not an equivalence. We mutate the input
|
||||
* token stream to make it so; see all [MUT] markers in code.
|
||||
*/
|
||||
class HTMLPurifier_Arborize
|
||||
{
|
||||
public static function arborize($tokens, $config, $context) {
|
||||
$definition = $config->getHTMLDefinition();
|
||||
$parent = new HTMLPurifier_Token_Start($definition->info_parent);
|
||||
$stack = array($parent->toNode());
|
||||
foreach ($tokens as $token) {
|
||||
$token->skip = null; // [MUT]
|
||||
$token->carryover = null; // [MUT]
|
||||
if ($token instanceof HTMLPurifier_Token_End) {
|
||||
$token->start = null; // [MUT]
|
||||
$r = array_pop($stack);
|
||||
//assert($r->name === $token->name);
|
||||
//assert(empty($token->attr));
|
||||
$r->endCol = $token->col;
|
||||
$r->endLine = $token->line;
|
||||
$r->endArmor = $token->armor;
|
||||
continue;
|
||||
}
|
||||
$node = $token->toNode();
|
||||
$stack[count($stack)-1]->children[] = $node;
|
||||
if ($token instanceof HTMLPurifier_Token_Start) {
|
||||
$stack[] = $node;
|
||||
}
|
||||
}
|
||||
//assert(count($stack) == 1);
|
||||
return $stack[0];
|
||||
}
|
||||
|
||||
public static function flatten($node, $config, $context) {
|
||||
$level = 0;
|
||||
$nodes = array($level => new HTMLPurifier_Queue(array($node)));
|
||||
$closingTokens = array();
|
||||
$tokens = array();
|
||||
do {
|
||||
while (!$nodes[$level]->isEmpty()) {
|
||||
$node = $nodes[$level]->shift(); // FIFO
|
||||
list($start, $end) = $node->toTokenPair();
|
||||
if ($level > 0) {
|
||||
$tokens[] = $start;
|
||||
}
|
||||
if ($end !== NULL) {
|
||||
$closingTokens[$level][] = $end;
|
||||
}
|
||||
if ($node instanceof HTMLPurifier_Node_Element) {
|
||||
$level++;
|
||||
$nodes[$level] = new HTMLPurifier_Queue();
|
||||
foreach ($node->children as $childNode) {
|
||||
$nodes[$level]->push($childNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
$level--;
|
||||
if ($level && isset($closingTokens[$level])) {
|
||||
while ($token = array_pop($closingTokens[$level])) {
|
||||
$tokens[] = $token;
|
||||
}
|
||||
}
|
||||
} while ($level > 0);
|
||||
return $tokens;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Defines common attribute collections that modules reference
|
||||
*/
|
||||
|
||||
class HTMLPurifier_AttrCollections
|
||||
{
|
||||
|
||||
/**
|
||||
* Associative array of attribute collections, indexed by name.
|
||||
* @type array
|
||||
*/
|
||||
public $info = array();
|
||||
|
||||
/**
|
||||
* Performs all expansions on internal data for use by other inclusions
|
||||
* It also collects all attribute collection extensions from
|
||||
* modules
|
||||
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
|
||||
* @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
|
||||
*/
|
||||
public function __construct($attr_types, $modules)
|
||||
{
|
||||
$this->doConstruct($attr_types, $modules);
|
||||
}
|
||||
|
||||
public function doConstruct($attr_types, $modules)
|
||||
{
|
||||
// load extensions from the modules
|
||||
foreach ($modules as $module) {
|
||||
foreach ($module->attr_collections as $coll_i => $coll) {
|
||||
if (!isset($this->info[$coll_i])) {
|
||||
$this->info[$coll_i] = array();
|
||||
}
|
||||
foreach ($coll as $attr_i => $attr) {
|
||||
if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
|
||||
// merge in includes
|
||||
$this->info[$coll_i][$attr_i] = array_merge(
|
||||
$this->info[$coll_i][$attr_i],
|
||||
$attr
|
||||
);
|
||||
continue;
|
||||
}
|
||||
$this->info[$coll_i][$attr_i] = $attr;
|
||||
}
|
||||
}
|
||||
}
|
||||
// perform internal expansions and inclusions
|
||||
foreach ($this->info as $name => $attr) {
|
||||
// merge attribute collections that include others
|
||||
$this->performInclusions($this->info[$name]);
|
||||
// replace string identifiers with actual attribute objects
|
||||
$this->expandIdentifiers($this->info[$name], $attr_types);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a reference to an attribute associative array and performs
|
||||
* all inclusions specified by the zero index.
|
||||
* @param array &$attr Reference to attribute array
|
||||
*/
|
||||
public function performInclusions(&$attr)
|
||||
{
|
||||
if (!isset($attr[0])) {
|
||||
return;
|
||||
}
|
||||
$merge = $attr[0];
|
||||
$seen = array(); // recursion guard
|
||||
// loop through all the inclusions
|
||||
for ($i = 0; isset($merge[$i]); $i++) {
|
||||
if (isset($seen[$merge[$i]])) {
|
||||
continue;
|
||||
}
|
||||
$seen[$merge[$i]] = true;
|
||||
// foreach attribute of the inclusion, copy it over
|
||||
if (!isset($this->info[$merge[$i]])) {
|
||||
continue;
|
||||
}
|
||||
foreach ($this->info[$merge[$i]] as $key => $value) {
|
||||
if (isset($attr[$key])) {
|
||||
continue;
|
||||
} // also catches more inclusions
|
||||
$attr[$key] = $value;
|
||||
}
|
||||
if (isset($this->info[$merge[$i]][0])) {
|
||||
// recursion
|
||||
$merge = array_merge($merge, $this->info[$merge[$i]][0]);
|
||||
}
|
||||
}
|
||||
unset($attr[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expands all string identifiers in an attribute array by replacing
|
||||
* them with the appropriate values inside HTMLPurifier_AttrTypes
|
||||
* @param array &$attr Reference to attribute array
|
||||
* @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
|
||||
*/
|
||||
public function expandIdentifiers(&$attr, $attr_types)
|
||||
{
|
||||
// because foreach will process new elements we add, make sure we
|
||||
// skip duplicates
|
||||
$processed = array();
|
||||
|
||||
foreach ($attr as $def_i => $def) {
|
||||
// skip inclusions
|
||||
if ($def_i === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($processed[$def_i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// determine whether or not attribute is required
|
||||
if ($required = (strpos($def_i, '*') !== false)) {
|
||||
// rename the definition
|
||||
unset($attr[$def_i]);
|
||||
$def_i = trim($def_i, '*');
|
||||
$attr[$def_i] = $def;
|
||||
}
|
||||
|
||||
$processed[$def_i] = true;
|
||||
|
||||
// if we've already got a literal object, move on
|
||||
if (is_object($def)) {
|
||||
// preserve previous required
|
||||
$attr[$def_i]->required = ($required || $attr[$def_i]->required);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($def === false) {
|
||||
unset($attr[$def_i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($t = $attr_types->get($def)) {
|
||||
$attr[$def_i] = $t;
|
||||
$attr[$def_i]->required = $required;
|
||||
} else {
|
||||
unset($attr[$def_i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Base class for all validating attribute definitions.
|
||||
*
|
||||
* This family of classes forms the core for not only HTML attribute validation,
|
||||
* but also any sort of string that needs to be validated or cleaned (which
|
||||
* means CSS properties and composite definitions are defined here too).
|
||||
* Besides defining (through code) what precisely makes the string valid,
|
||||
* subclasses are also responsible for cleaning the code if possible.
|
||||
*/
|
||||
|
||||
abstract class HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* Tells us whether or not an HTML attribute is minimized.
|
||||
* Has no meaning in other contexts.
|
||||
* @type bool
|
||||
*/
|
||||
public $minimized = false;
|
||||
|
||||
/**
|
||||
* Tells us whether or not an HTML attribute is required.
|
||||
* Has no meaning in other contexts
|
||||
* @type bool
|
||||
*/
|
||||
public $required = false;
|
||||
|
||||
/**
|
||||
* Validates and cleans passed string according to a definition.
|
||||
*
|
||||
* @param string $string String to be validated and cleaned.
|
||||
* @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
|
||||
* @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
|
||||
*/
|
||||
abstract public function validate($string, $config, $context);
|
||||
|
||||
/**
|
||||
* Convenience method that parses a string as if it were CDATA.
|
||||
*
|
||||
* This method process a string in the manner specified at
|
||||
* <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
|
||||
* leading and trailing whitespace, ignoring line feeds, and replacing
|
||||
* carriage returns and tabs with spaces. While most useful for HTML
|
||||
* attributes specified as CDATA, it can also be applied to most CSS
|
||||
* values.
|
||||
*
|
||||
* @note This method is not entirely standards compliant, as trim() removes
|
||||
* more types of whitespace than specified in the spec. In practice,
|
||||
* this is rarely a problem, as those extra characters usually have
|
||||
* already been removed by HTMLPurifier_Encoder.
|
||||
*
|
||||
* @warning This processing is inconsistent with XML's whitespace handling
|
||||
* as specified by section 3.3.3 and referenced XHTML 1.0 section
|
||||
* 4.7. However, note that we are NOT necessarily
|
||||
* parsing XML, thus, this behavior may still be correct. We
|
||||
* assume that newlines have been normalized.
|
||||
*/
|
||||
public function parseCDATA($string)
|
||||
{
|
||||
$string = trim($string);
|
||||
$string = str_replace(array("\n", "\t", "\r"), ' ', $string);
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method for creating this class from a string.
|
||||
* @param string $string String construction info
|
||||
* @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
|
||||
*/
|
||||
public function make($string)
|
||||
{
|
||||
// default implementation, return a flyweight of this object.
|
||||
// If $string has an effect on the returned object (i.e. you
|
||||
// need to overload this method), it is best
|
||||
// to clone or instantiate new copies. (Instantiation is safer.)
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
|
||||
* properly. THIS IS A HACK!
|
||||
* @param string $string a CSS colour definition
|
||||
* @return string
|
||||
*/
|
||||
protected function mungeRgb($string)
|
||||
{
|
||||
$p = '\s*(\d+(\.\d+)?([%]?))\s*';
|
||||
|
||||
if (preg_match('/(rgba|hsla)\(/', $string)) {
|
||||
return preg_replace('/(rgba|hsla)\('.$p.','.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8,\11)', $string);
|
||||
}
|
||||
|
||||
return preg_replace('/(rgb|hsl)\('.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8)', $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a possibly escaped CSS string and returns the "pure"
|
||||
* version of it.
|
||||
*/
|
||||
protected function expandCSSEscape($string)
|
||||
{
|
||||
// flexibly parse it
|
||||
$ret = '';
|
||||
for ($i = 0, $c = strlen($string); $i < $c; $i++) {
|
||||
if ($string[$i] === '\\') {
|
||||
$i++;
|
||||
if ($i >= $c) {
|
||||
$ret .= '\\';
|
||||
break;
|
||||
}
|
||||
if (ctype_xdigit($string[$i])) {
|
||||
$code = $string[$i];
|
||||
for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
|
||||
if (!ctype_xdigit($string[$i])) {
|
||||
break;
|
||||
}
|
||||
$code .= $string[$i];
|
||||
}
|
||||
// We have to be extremely careful when adding
|
||||
// new characters, to make sure we're not breaking
|
||||
// the encoding.
|
||||
$char = HTMLPurifier_Encoder::unichr(hexdec($code));
|
||||
if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
|
||||
continue;
|
||||
}
|
||||
$ret .= $char;
|
||||
if ($i < $c && trim($string[$i]) !== '') {
|
||||
$i--;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if ($string[$i] === "\n") {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$ret .= $string[$i];
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,136 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Validates the HTML attribute style, otherwise known as CSS.
|
||||
* @note We don't implement the whole CSS specification, so it might be
|
||||
* difficult to reuse this component in the context of validating
|
||||
* actual stylesheet declarations.
|
||||
* @note If we were really serious about validating the CSS, we would
|
||||
* tokenize the styles and then parse the tokens. Obviously, we
|
||||
* are not doing that. Doing that could seriously harm performance,
|
||||
* but would make these components a lot more viable for a CSS
|
||||
* filtering solution.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* @param string $css
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($css, $config, $context)
|
||||
{
|
||||
$css = $this->parseCDATA($css);
|
||||
|
||||
$definition = $config->getCSSDefinition();
|
||||
$allow_duplicates = $config->get("CSS.AllowDuplicates");
|
||||
|
||||
|
||||
// According to the CSS2.1 spec, the places where a
|
||||
// non-delimiting semicolon can appear are in strings
|
||||
// escape sequences. So here is some dumb hack to
|
||||
// handle quotes.
|
||||
$len = strlen($css);
|
||||
$accum = "";
|
||||
$declarations = array();
|
||||
$quoted = false;
|
||||
for ($i = 0; $i < $len; $i++) {
|
||||
$c = strcspn($css, ";'\"", $i);
|
||||
$accum .= substr($css, $i, $c);
|
||||
$i += $c;
|
||||
if ($i == $len) break;
|
||||
$d = $css[$i];
|
||||
if ($quoted) {
|
||||
$accum .= $d;
|
||||
if ($d == $quoted) {
|
||||
$quoted = false;
|
||||
}
|
||||
} else {
|
||||
if ($d == ";") {
|
||||
$declarations[] = $accum;
|
||||
$accum = "";
|
||||
} else {
|
||||
$accum .= $d;
|
||||
$quoted = $d;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($accum != "") $declarations[] = $accum;
|
||||
|
||||
$propvalues = array();
|
||||
$new_declarations = '';
|
||||
|
||||
/**
|
||||
* Name of the current CSS property being validated.
|
||||
*/
|
||||
$property = false;
|
||||
$context->register('CurrentCSSProperty', $property);
|
||||
|
||||
foreach ($declarations as $declaration) {
|
||||
if (!$declaration) {
|
||||
continue;
|
||||
}
|
||||
if (!strpos($declaration, ':')) {
|
||||
continue;
|
||||
}
|
||||
list($property, $value) = explode(':', $declaration, 2);
|
||||
$property = trim($property);
|
||||
$value = trim($value);
|
||||
$ok = false;
|
||||
do {
|
||||
if (isset($definition->info[$property])) {
|
||||
$ok = true;
|
||||
break;
|
||||
}
|
||||
if (ctype_lower($property)) {
|
||||
break;
|
||||
}
|
||||
$property = strtolower($property);
|
||||
if (isset($definition->info[$property])) {
|
||||
$ok = true;
|
||||
break;
|
||||
}
|
||||
} while (0);
|
||||
if (!$ok) {
|
||||
continue;
|
||||
}
|
||||
// inefficient call, since the validator will do this again
|
||||
if (strtolower(trim($value)) !== 'inherit') {
|
||||
// inherit works for everything (but only on the base property)
|
||||
$result = $definition->info[$property]->validate(
|
||||
$value,
|
||||
$config,
|
||||
$context
|
||||
);
|
||||
} else {
|
||||
$result = 'inherit';
|
||||
}
|
||||
if ($result === false) {
|
||||
continue;
|
||||
}
|
||||
if ($allow_duplicates) {
|
||||
$new_declarations .= "$property:$result;";
|
||||
} else {
|
||||
$propvalues[$property] = $result;
|
||||
}
|
||||
}
|
||||
|
||||
$context->destroy('CurrentCSSProperty');
|
||||
|
||||
// procedure does not write the new CSS simultaneously, so it's
|
||||
// slightly inefficient, but it's the only way of getting rid of
|
||||
// duplicates. Perhaps config to optimize it, but not now.
|
||||
|
||||
foreach ($propvalues as $prop => $value) {
|
||||
$new_declarations .= "$prop:$value;";
|
||||
}
|
||||
|
||||
return $new_declarations ? $new_declarations : false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
class HTMLPurifier_AttrDef_CSS_AlphaValue extends HTMLPurifier_AttrDef_CSS_Number
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(false); // opacity is non-negative, but we will clamp it
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $number
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return string
|
||||
*/
|
||||
public function validate($number, $config, $context)
|
||||
{
|
||||
$result = parent::validate($number, $config, $context);
|
||||
if ($result === false) {
|
||||
return $result;
|
||||
}
|
||||
$float = (float)$result;
|
||||
if ($float < 0.0) {
|
||||
$result = '0';
|
||||
}
|
||||
if ($float > 1.0) {
|
||||
$result = '1';
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Validates shorthand CSS property background.
|
||||
* @warning Does not support url tokens that have internal spaces.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_Background extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* Local copy of component validators.
|
||||
* @type HTMLPurifier_AttrDef[]
|
||||
* @note See HTMLPurifier_AttrDef_Font::$info for a similar impl.
|
||||
*/
|
||||
protected $info;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Config $config
|
||||
*/
|
||||
public function __construct($config)
|
||||
{
|
||||
$def = $config->getCSSDefinition();
|
||||
$this->info['background-color'] = $def->info['background-color'];
|
||||
$this->info['background-image'] = $def->info['background-image'];
|
||||
$this->info['background-repeat'] = $def->info['background-repeat'];
|
||||
$this->info['background-attachment'] = $def->info['background-attachment'];
|
||||
$this->info['background-position'] = $def->info['background-position'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($string, $config, $context)
|
||||
{
|
||||
// regular pre-processing
|
||||
$string = $this->parseCDATA($string);
|
||||
if ($string === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// munge rgb() decl if necessary
|
||||
$string = $this->mungeRgb($string);
|
||||
|
||||
// assumes URI doesn't have spaces in it
|
||||
$bits = explode(' ', $string); // bits to process
|
||||
|
||||
$caught = array();
|
||||
$caught['color'] = false;
|
||||
$caught['image'] = false;
|
||||
$caught['repeat'] = false;
|
||||
$caught['attachment'] = false;
|
||||
$caught['position'] = false;
|
||||
|
||||
$i = 0; // number of catches
|
||||
|
||||
foreach ($bits as $bit) {
|
||||
if ($bit === '') {
|
||||
continue;
|
||||
}
|
||||
foreach ($caught as $key => $status) {
|
||||
if ($key != 'position') {
|
||||
if ($status !== false) {
|
||||
continue;
|
||||
}
|
||||
$r = $this->info['background-' . $key]->validate($bit, $config, $context);
|
||||
} else {
|
||||
$r = $bit;
|
||||
}
|
||||
if ($r === false) {
|
||||
continue;
|
||||
}
|
||||
if ($key == 'position') {
|
||||
if ($caught[$key] === false) {
|
||||
$caught[$key] = '';
|
||||
}
|
||||
$caught[$key] .= $r . ' ';
|
||||
} else {
|
||||
$caught[$key] = $r;
|
||||
}
|
||||
$i++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$i) {
|
||||
return false;
|
||||
}
|
||||
if ($caught['position'] !== false) {
|
||||
$caught['position'] = $this->info['background-position']->
|
||||
validate($caught['position'], $config, $context);
|
||||
}
|
||||
|
||||
$ret = array();
|
||||
foreach ($caught as $value) {
|
||||
if ($value === false) {
|
||||
continue;
|
||||
}
|
||||
$ret[] = $value;
|
||||
}
|
||||
|
||||
if (empty($ret)) {
|
||||
return false;
|
||||
}
|
||||
return implode(' ', $ret);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+157
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
/* W3C says:
|
||||
[ // adjective and number must be in correct order, even if
|
||||
// you could switch them without introducing ambiguity.
|
||||
// some browsers support that syntax
|
||||
[
|
||||
<percentage> | <length> | left | center | right
|
||||
]
|
||||
[
|
||||
<percentage> | <length> | top | center | bottom
|
||||
]?
|
||||
] |
|
||||
[ // this signifies that the vertical and horizontal adjectives
|
||||
// can be arbitrarily ordered, however, there can only be two,
|
||||
// one of each, or none at all
|
||||
[
|
||||
left | center | right
|
||||
] ||
|
||||
[
|
||||
top | center | bottom
|
||||
]
|
||||
]
|
||||
top, left = 0%
|
||||
center, (none) = 50%
|
||||
bottom, right = 100%
|
||||
*/
|
||||
|
||||
/* QuirksMode says:
|
||||
keyword + length/percentage must be ordered correctly, as per W3C
|
||||
|
||||
Internet Explorer and Opera, however, support arbitrary ordering. We
|
||||
should fix it up.
|
||||
|
||||
Minor issue though, not strictly necessary.
|
||||
*/
|
||||
|
||||
// control freaks may appreciate the ability to convert these to
|
||||
// percentages or something, but it's not necessary
|
||||
|
||||
/**
|
||||
* Validates the value of background-position.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_AttrDef_CSS_Length
|
||||
*/
|
||||
protected $length;
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_AttrDef_CSS_Percentage
|
||||
*/
|
||||
protected $percentage;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->length = new HTMLPurifier_AttrDef_CSS_Length();
|
||||
$this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($string, $config, $context)
|
||||
{
|
||||
$string = $this->parseCDATA($string);
|
||||
$bits = explode(' ', $string);
|
||||
|
||||
$keywords = array();
|
||||
$keywords['h'] = false; // left, right
|
||||
$keywords['v'] = false; // top, bottom
|
||||
$keywords['ch'] = false; // center (first word)
|
||||
$keywords['cv'] = false; // center (second word)
|
||||
$measures = array();
|
||||
|
||||
$i = 0;
|
||||
|
||||
$lookup = array(
|
||||
'top' => 'v',
|
||||
'bottom' => 'v',
|
||||
'left' => 'h',
|
||||
'right' => 'h',
|
||||
'center' => 'c'
|
||||
);
|
||||
|
||||
foreach ($bits as $bit) {
|
||||
if ($bit === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// test for keyword
|
||||
$lbit = ctype_lower($bit) ? $bit : strtolower($bit);
|
||||
if (isset($lookup[$lbit])) {
|
||||
$status = $lookup[$lbit];
|
||||
if ($status == 'c') {
|
||||
if ($i == 0) {
|
||||
$status = 'ch';
|
||||
} else {
|
||||
$status = 'cv';
|
||||
}
|
||||
}
|
||||
$keywords[$status] = $lbit;
|
||||
$i++;
|
||||
}
|
||||
|
||||
// test for length
|
||||
$r = $this->length->validate($bit, $config, $context);
|
||||
if ($r !== false) {
|
||||
$measures[] = $r;
|
||||
$i++;
|
||||
}
|
||||
|
||||
// test for percentage
|
||||
$r = $this->percentage->validate($bit, $config, $context);
|
||||
if ($r !== false) {
|
||||
$measures[] = $r;
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$i) {
|
||||
return false;
|
||||
} // no valid values were caught
|
||||
|
||||
$ret = array();
|
||||
|
||||
// first keyword
|
||||
if ($keywords['h']) {
|
||||
$ret[] = $keywords['h'];
|
||||
} elseif ($keywords['ch']) {
|
||||
$ret[] = $keywords['ch'];
|
||||
$keywords['cv'] = false; // prevent re-use: center = center center
|
||||
} elseif (count($measures)) {
|
||||
$ret[] = array_shift($measures);
|
||||
}
|
||||
|
||||
if ($keywords['v']) {
|
||||
$ret[] = $keywords['v'];
|
||||
} elseif ($keywords['cv']) {
|
||||
$ret[] = $keywords['cv'];
|
||||
} elseif (count($measures)) {
|
||||
$ret[] = array_shift($measures);
|
||||
}
|
||||
|
||||
if (empty($ret)) {
|
||||
return false;
|
||||
}
|
||||
return implode(' ', $ret);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Validates the border property as defined by CSS.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_Border extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* Local copy of properties this property is shorthand for.
|
||||
* @type HTMLPurifier_AttrDef[]
|
||||
*/
|
||||
protected $info = array();
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_Config $config
|
||||
*/
|
||||
public function __construct($config)
|
||||
{
|
||||
$def = $config->getCSSDefinition();
|
||||
$this->info['border-width'] = $def->info['border-width'];
|
||||
$this->info['border-style'] = $def->info['border-style'];
|
||||
$this->info['border-top-color'] = $def->info['border-top-color'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($string, $config, $context)
|
||||
{
|
||||
$string = $this->parseCDATA($string);
|
||||
$string = $this->mungeRgb($string);
|
||||
$bits = explode(' ', $string);
|
||||
$done = array(); // segments we've finished
|
||||
$ret = ''; // return value
|
||||
foreach ($bits as $bit) {
|
||||
foreach ($this->info as $propname => $validator) {
|
||||
if (isset($done[$propname])) {
|
||||
continue;
|
||||
}
|
||||
$r = $validator->validate($bit, $config, $context);
|
||||
if ($r !== false) {
|
||||
$ret .= $r . ' ';
|
||||
$done[$propname] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return rtrim($ret);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,161 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Validates Color as defined by CSS.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* @type HTMLPurifier_AttrDef_CSS_AlphaValue
|
||||
*/
|
||||
protected $alpha;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->alpha = new HTMLPurifier_AttrDef_CSS_AlphaValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $color
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($color, $config, $context)
|
||||
{
|
||||
static $colors = null;
|
||||
if ($colors === null) {
|
||||
$colors = $config->get('Core.ColorKeywords');
|
||||
}
|
||||
|
||||
$color = trim($color);
|
||||
if ($color === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$lower = strtolower($color);
|
||||
if (isset($colors[$lower])) {
|
||||
return $colors[$lower];
|
||||
}
|
||||
|
||||
if (preg_match('#(rgb|rgba|hsl|hsla)\(#', $color, $matches) === 1) {
|
||||
$length = strlen($color);
|
||||
if (strpos($color, ')') !== $length - 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// get used function : rgb, rgba, hsl or hsla
|
||||
$function = $matches[1];
|
||||
|
||||
$parameters_size = 3;
|
||||
$alpha_channel = false;
|
||||
if (substr($function, -1) === 'a') {
|
||||
$parameters_size = 4;
|
||||
$alpha_channel = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allowed types for values :
|
||||
* parameter_position => [type => max_value]
|
||||
*/
|
||||
$allowed_types = array(
|
||||
1 => array('percentage' => 100, 'integer' => 255),
|
||||
2 => array('percentage' => 100, 'integer' => 255),
|
||||
3 => array('percentage' => 100, 'integer' => 255),
|
||||
);
|
||||
$allow_different_types = false;
|
||||
|
||||
if (strpos($function, 'hsl') !== false) {
|
||||
$allowed_types = array(
|
||||
1 => array('integer' => 360),
|
||||
2 => array('percentage' => 100),
|
||||
3 => array('percentage' => 100),
|
||||
);
|
||||
$allow_different_types = true;
|
||||
}
|
||||
|
||||
$values = trim(str_replace($function, '', $color), ' ()');
|
||||
|
||||
$parts = explode(',', $values);
|
||||
if (count($parts) !== $parameters_size) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$type = false;
|
||||
$new_parts = array();
|
||||
$i = 0;
|
||||
|
||||
foreach ($parts as $part) {
|
||||
$i++;
|
||||
$part = trim($part);
|
||||
|
||||
if ($part === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
// different check for alpha channel
|
||||
if ($alpha_channel === true && $i === count($parts)) {
|
||||
$result = $this->alpha->validate($part, $config, $context);
|
||||
|
||||
if ($result === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$new_parts[] = (string)$result;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (substr($part, -1) === '%') {
|
||||
$current_type = 'percentage';
|
||||
} else {
|
||||
$current_type = 'integer';
|
||||
}
|
||||
|
||||
if (!array_key_exists($current_type, $allowed_types[$i])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$type) {
|
||||
$type = $current_type;
|
||||
}
|
||||
|
||||
if ($allow_different_types === false && $type != $current_type) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$max_value = $allowed_types[$i][$current_type];
|
||||
|
||||
if ($current_type == 'integer') {
|
||||
// Return value between range 0 -> $max_value
|
||||
$new_parts[] = (int)max(min($part, $max_value), 0);
|
||||
} elseif ($current_type == 'percentage') {
|
||||
$new_parts[] = (float)max(min(rtrim($part, '%'), $max_value), 0) . '%';
|
||||
}
|
||||
}
|
||||
|
||||
$new_values = implode(',', $new_parts);
|
||||
|
||||
$color = $function . '(' . $new_values . ')';
|
||||
} else {
|
||||
// hexadecimal handling
|
||||
if ($color[0] === '#') {
|
||||
$hex = substr($color, 1);
|
||||
} else {
|
||||
$hex = $color;
|
||||
$color = '#' . $color;
|
||||
}
|
||||
$length = strlen($hex);
|
||||
if ($length !== 3 && $length !== 6) {
|
||||
return false;
|
||||
}
|
||||
if (!ctype_xdigit($hex)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return $color;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Allows multiple validators to attempt to validate attribute.
|
||||
*
|
||||
* Composite is just what it sounds like: a composite of many validators.
|
||||
* This means that multiple HTMLPurifier_AttrDef objects will have a whack
|
||||
* at the string. If one of them passes, that's what is returned. This is
|
||||
* especially useful for CSS values, which often are a choice between
|
||||
* an enumerated set of predefined values or a flexible data type.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_Composite extends HTMLPurifier_AttrDef
|
||||
{
|
||||
|
||||
/**
|
||||
* List of objects that may process strings.
|
||||
* @type HTMLPurifier_AttrDef[]
|
||||
* @todo Make protected
|
||||
*/
|
||||
public $defs;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_AttrDef[] $defs List of HTMLPurifier_AttrDef objects
|
||||
*/
|
||||
public function __construct($defs)
|
||||
{
|
||||
$this->defs = $defs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($string, $config, $context)
|
||||
{
|
||||
foreach ($this->defs as $i => $def) {
|
||||
$result = $this->defs[$i]->validate($string, $config, $context);
|
||||
if ($result !== false) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Decorator which enables CSS properties to be disabled for specific elements.
|
||||
*/
|
||||
class HTMLPurifier_AttrDef_CSS_DenyElementDecorator extends HTMLPurifier_AttrDef
|
||||
{
|
||||
/**
|
||||
* @type HTMLPurifier_AttrDef
|
||||
*/
|
||||
public $def;
|
||||
/**
|
||||
* @type string
|
||||
*/
|
||||
public $element;
|
||||
|
||||
/**
|
||||
* @param HTMLPurifier_AttrDef $def Definition to wrap
|
||||
* @param string $element Element to deny
|
||||
*/
|
||||
public function __construct($def, $element)
|
||||
{
|
||||
$this->def = $def;
|
||||
$this->element = $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if CurrentToken is set and equal to $this->element
|
||||
* @param string $string
|
||||
* @param HTMLPurifier_Config $config
|
||||
* @param HTMLPurifier_Context $context
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate($string, $config, $context)
|
||||
{
|
||||
$token = $context->get('CurrentToken', true);
|
||||
if ($token && $token->name == $this->element) {
|
||||
return false;
|
||||
}
|
||||
return $this->def->validate($string, $config, $context);
|
||||
}
|
||||
}
|
||||
|
||||
// vim: et sw=4 sts=4
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user