summaryrefslogtreecommitdiff
path: root/_test
diff options
context:
space:
mode:
authorTobias Sarnowski <sarnowski@cosmocode.de>2012-04-18 12:08:28 +0200
committerTobias Sarnowski <sarnowski@cosmocode.de>2012-04-18 12:08:28 +0200
commitf8369d7d6e37248d6523fdac6e1d760fca4f1b52 (patch)
tree0848c213ffc191a23b55f07bd2ec55e777ea79ca /_test
parentd59108b91e9bf9fd56dc2e697cf31f9bbc7f9cd4 (diff)
downloadrpg-f8369d7d6e37248d6523fdac6e1d760fca4f1b52.tar.gz
rpg-f8369d7d6e37248d6523fdac6e1d760fca4f1b52.tar.bz2
moved _testing to _test
Diffstat (limited to '_test')
-rw-r--r--_test/README70
-rw-r--r--_test/bootstrap.php102
-rw-r--r--_test/conf/acl.auth.php.dist21
-rw-r--r--_test/conf/acronyms.conf145
-rw-r--r--_test/conf/dokuwiki.php171
-rw-r--r--_test/conf/entities.conf22
-rw-r--r--_test/conf/interwiki.conf131
-rw-r--r--_test/conf/license.php36
-rw-r--r--_test/conf/local.php3
-rw-r--r--_test/conf/local.php.dist16
-rw-r--r--_test/conf/mediameta.php91
-rw-r--r--_test/conf/mime.conf64
-rw-r--r--_test/conf/mysql.conf.php.example253
-rw-r--r--_test/conf/plugins.local.php8
-rw-r--r--_test/conf/plugins.php6
-rw-r--r--_test/conf/plugins.required.php11
-rw-r--r--_test/conf/scheme.conf11
-rw-r--r--_test/conf/smileys.conf28
-rw-r--r--_test/conf/users.auth.php.dist10
-rw-r--r--_test/conf/wordblock.conf32
-rw-r--r--_test/core/DokuWikiTest.php96
-rw-r--r--_test/core/TestRequest.php82
-rw-r--r--_test/core/TestResponse.php55
-rw-r--r--_test/core/TestUtils.php68
-rw-r--r--_test/core/phpQuery-onefile.php5702
-rw-r--r--_test/data/_dummy0
-rw-r--r--_test/data/attic/_dummy0
-rw-r--r--_test/data/cache/_dummy0
-rw-r--r--_test/data/deleted.files257
-rw-r--r--_test/data/index/_dummy0
-rw-r--r--_test/data/locks/_dummy0
-rw-r--r--_test/data/media/wiki/dokuwiki-128.pngbin0 -> 33615 bytes
-rw-r--r--_test/data/media_attic/_dummy0
-rw-r--r--_test/data/media_meta/_dummy0
-rw-r--r--_test/data/meta/_dummy0
-rw-r--r--_test/data/pages/wiki/dokuwiki.txt64
-rw-r--r--_test/data/pages/wiki/syntax.txt486
-rw-r--r--_test/data/security.pngbin0 -> 7917 bytes
-rw-r--r--_test/data/security.xcfbin0 -> 12093 bytes
-rw-r--r--_test/data/tmp/_dummy0
-rw-r--r--_test/phpunit.xml17
-rw-r--r--_test/tests/inc/auth_aclcheck.test.php244
-rw-r--r--_test/tests/inc/auth_admincheck.test.php130
-rw-r--r--_test/tests/inc/auth_nameencode.test.php50
-rw-r--r--_test/tests/inc/auth_password.cputest.php70
-rw-r--r--_test/tests/inc/common_cleanText.test.php28
-rw-r--r--_test/tests/inc/common_clientip.test.php154
-rw-r--r--_test/tests/inc/common_obfuscate.test.php29
-rw-r--r--_test/tests/inc/common_pagetemplate.test.php18
-rw-r--r--_test/tests/inc/form_form.test.php104
-rw-r--r--_test/tests/inc/httpclient_http.test.php141
-rw-r--r--_test/tests/inc/httpclient_https.test.php8
-rw-r--r--_test/tests/inc/init_fullpath.test.php87
-rw-r--r--_test/tests/inc/init_getbaseurl.test.php305
-rw-r--r--_test/tests/inc/ixr_library_date.test.php36
-rw-r--r--_test/tests/inc/ixr_library_ixr_message.test.php140
-rw-r--r--_test/tests/inc/mail_isvalid.test.php82
-rw-r--r--_test/tests/inc/mail_quoted_printable_encode.test.php44
-rw-r--r--_test/tests/inc/pageutils_clean_id.test.php157
-rw-r--r--_test/tests/inc/pageutils_getid.test.php108
-rw-r--r--_test/tests/inc/pageutils_resolve_id.test.php45
-rw-r--r--_test/tests/inc/pageutils_resolve_pageid.test.php83
-rw-r--r--_test/tests/inc/parser/lexer.test.php531
-rw-r--r--_test/tests/inc/parser/parser.inc.php45
-rw-r--r--_test/tests/inc/parser/parser_eol.test.php96
-rw-r--r--_test/tests/inc/parser/parser_footnote.test.php388
-rw-r--r--_test/tests/inc/parser/parser_headers.test.php282
-rw-r--r--_test/tests/inc/parser/parser_i18n.test.php162
-rw-r--r--_test/tests/inc/parser/parser_links.test.php691
-rw-r--r--_test/tests/inc/parser/parser_lists.test.php393
-rw-r--r--_test/tests/inc/parser/parser_preformatted.test.php231
-rw-r--r--_test/tests/inc/parser/parser_quote.test.php94
-rw-r--r--_test/tests/inc/parser/parser_quotes.test.php269
-rw-r--r--_test/tests/inc/parser/parser_replacements.test.php379
-rw-r--r--_test/tests/inc/parser/parser_table.test.php572
-rw-r--r--_test/tests/inc/parser/parser_unformatted.test.php38
-rw-r--r--_test/tests/inc/parserutils_set_metadata_during_rendering.test.php93
-rw-r--r--_test/tests/inc/remote.test.php334
-rw-r--r--_test/tests/inc/safefn.test.php48
-rw-r--r--_test/tests/inc/search/data/ns1/ns3/page3.txt0
-rw-r--r--_test/tests/inc/search/data/ns1/page1.txt0
-rw-r--r--_test/tests/inc/search/data/ns1/page2.txt0
-rw-r--r--_test/tests/inc/search/data/ns2/nopage.ext0
-rw-r--r--_test/tests/inc/search/data/ns2/page1.txt0
-rw-r--r--_test/tests/inc/search/search.test.php102
-rw-r--r--_test/tests/inc/utf8_correctidx.test.php78
-rw-r--r--_test/tests/inc/utf8_html.test.php72
-rw-r--r--_test/tests/inc/utf8_kanaromaji.txt22893
-rw-r--r--_test/tests/inc/utf8_romanize.cputest.php36
-rw-r--r--_test/tests/inc/utf8_stripspecials.test.php28
-rw-r--r--_test/tests/inc/utf8_substr.test.php43
-rw-r--r--_test/tests/inc/utf8_unicode.test.php60
-rw-r--r--_test/tests/inc/utf8_utf16be.test.php28
-rw-r--r--_test/tests/lib/exe/css_css_compress.test.php68
-rw-r--r--_test/tests/lib/exe/css_css_loadfile.test.php55
-rw-r--r--_test/tests/lib/exe/js_js_compress.test.php128
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js5
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js5
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js5
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js5
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js11
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js7
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js7
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js7
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js3
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js3
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js5
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js3
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js2
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js2
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js4
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js3
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js1
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js8
-rw-r--r--_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js1
-rw-r--r--_test/tests/test/basic.test.php22
-rw-r--r--_test/tests/test/globals.test.php49
-rw-r--r--_test/tests/test/hooks.test.php24
-rw-r--r--_test/tests/test/phpquery.test.php18
-rw-r--r--_test/tests/test/plugins.test.php32
-rw-r--r--_test/tests/test/plugins_defaults.test.php24
-rw-r--r--_test/tests/test/reset.test.php39
-rw-r--r--_test/tests/test/scope.test.php49
140 files changed, 38719 insertions, 0 deletions
diff --git a/_test/README b/_test/README
new file mode 100644
index 000000000..aadd819bf
--- /dev/null
+++ b/_test/README
@@ -0,0 +1,70 @@
+DokuWiki Test Suite
+=============================================================================
+
+Content of this document:
+
+ * Requirements
+ * Installation of PHPUnit via Pear
+ * Running all Tests
+ * Create new Tests
+ * Known Bad Tests
+ * TODO for test framework
+
+
+
+Requirements
+-----------------------------------------------------------------------------
+
+ * PHP Unit 3.7
+
+
+Installation of PHPUnit via Pear
+-----------------------------------------------------------------------------
+
+ > pear config-set auto_discover 1
+ > pear upgrade
+ > pear install pear.phpunit.de/PHPUnit
+
+
+Running all Tests
+-----------------------------------------------------------------------------
+
+ > cd _testing/
+ > phpunit
+
+PHPUnit will fail on some systems with the error 'headers already sent'. The
+known workaround for that is to use the '--stderr' flag for PHPUnit:
+
+ > phpunit --stderr
+
+
+Create new Tests
+-----------------------------------------------------------------------------
+
+To create a test for DokuWiki, create a *.test.php file within the tests/
+folder. Please respect the folder structure and naming convention. Inside the
+file, implement a class, extending 'DokuWikiTest'. Every method, starting
+with 'test' will be called as a test (e.g. 'testIfThisIsValid');
+
+
+TODO for the test framework
+-----------------------------------------------------------------------------
+
+ * test cross platform compatibility: especially test windows
+ * update http://www.dokuwiki.org/devel:unittesting
+ * optional: add helper methods to TestRequest for easy form submission
+ * createForm(), ...
+
+
+Migration Protocol
+-----------------------------------------------------------------------------
+
+The following tests were not migrated:
+
+ * inc/html_hilight (runkit)
+ * inc/indexer_idx_indexlengths (fs dependencies)
+ * inc/mail_send (integration test)
+ * inc/parser/parser_formatting
+ * inc/parser/xhtml_htmlphp (runkit)
+ * inc/parser/xhtml_links
+
diff --git a/_test/bootstrap.php b/_test/bootstrap.php
new file mode 100644
index 000000000..f8ca4d483
--- /dev/null
+++ b/_test/bootstrap.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Test Suite bootstrapping for DokuWiki
+ */
+
+if(!defined('DOKU_UNITTEST')) define('DOKU_UNITTEST',dirname(__FILE__).'/');
+require_once DOKU_UNITTEST.'core/phpQuery-onefile.php';
+require_once DOKU_UNITTEST.'core/DokuWikiTest.php';
+require_once DOKU_UNITTEST.'core/TestResponse.php';
+require_once DOKU_UNITTEST.'core/TestRequest.php';
+require_once DOKU_UNITTEST.'core/TestUtils.php';
+
+
+// backward compatibility to old test suite
+define('SIMPLE_TEST', true);
+
+// basic behaviours
+error_reporting(E_ALL);
+set_time_limit(0);
+ini_set('memory_limit','2048M');
+
+// prepare temporary directories
+define('DOKU_INC', dirname(dirname(__FILE__)).'/');
+define('TMP_DIR', sys_get_temp_dir().'/dwtests-'.microtime(true));
+define('DOKU_CONF', TMP_DIR.'/conf/');
+define('DOKU_TMP_DATA', TMP_DIR.'/data/');
+
+// default plugins
+$default_plugins = array(
+ 'acl',
+ 'config',
+ 'info',
+ 'plugin',
+ 'popularity',
+ 'revert',
+ 'safefnrecode',
+ 'usermanager'
+);
+
+// default server variables
+$default_server_vars = array(
+ 'QUERY_STRING' => '?id=',
+ 'REQUEST_METHOD' => 'GET',
+ 'CONTENT_TYPE' => '',
+ 'CONTENT_LENGTH' => '',
+ 'SCRIPT_NAME' => '/doku.php',
+ 'REQUEST_URI' => '/doku.php?id=',
+ 'DOCUMENT_URI' => '/doku.php',
+ 'DOCUMENT_ROOT' => DOKU_INC,
+ 'SERVER_PROTOCOL' => 'HTTP/1.1',
+ 'SERVER_SOFTWARE' => 'nginx/0.7.67',
+ 'REMOTE_ADDR' => '87.142.120.6',
+ 'REMOTE_PORT' => '21418',
+ 'SERVER_ADDR' => '46.38.241.24',
+ 'SERVER_PORT' => '443',
+ 'SERVER_NAME' => 'wiki.example.com',
+ 'REDIRECT_STATUS' => '200',
+ 'SCRIPT_FILENAME' => DOKU_INC.'doku.php',
+ 'HTTP_HOST' => 'wiki.example.com',
+ 'HTTP_USER_AGENT' => 'Mozilla/5.0 (X11; OpenBSD amd64; rv:11.0) Gecko/20100101 Firefox/11.0',
+ 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
+ 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate',
+ 'HTTP_CONNECTION' => 'keep-alive',
+ 'HTTP_CACHE_CONTROL' => 'max-age=0',
+ 'PHP_SELF' => '/doku.php',
+ 'REQUEST_TIME' => time(),
+);
+
+// create temp directories
+mkdir(TMP_DIR);
+
+// cleanup dir after exit
+register_shutdown_function(function() {
+ TestUtils::rdelete(TMP_DIR);
+});
+
+// populate default dirs
+TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/conf');
+TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/data');
+
+// disable all non-default plugins by default
+$dh = dir(DOKU_INC.'lib/plugins/');
+while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+
+ if (!is_dir(DOKU_INC.'lib/plugins/'.$entry)) {
+ continue;
+ }
+
+ if (!in_array($entry, $default_plugins)) {
+ // disable this plugin
+ TestUtils::fappend(DOKU_CONF.'plugins.local.php', "\$plugins['$entry'] = 0;\n");
+ }
+}
+$dh->close();
+
+// load dw
+require_once(DOKU_INC.'inc/init.php');
+
diff --git a/_test/conf/acl.auth.php.dist b/_test/conf/acl.auth.php.dist
new file mode 100644
index 000000000..14344d778
--- /dev/null
+++ b/_test/conf/acl.auth.php.dist
@@ -0,0 +1,21 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Editing this file by hand shouldn't be necessary. Use the ACL
+# Manager interface instead.
+#
+# If your auth backend allows special char like spaces in groups
+# or user names you need to urlencode them (only chars <128, leave
+# UTF-8 multibyte chars as is)
+#
+# none 0
+# read 1
+# edit 2
+# create 4
+# upload 8
+# delete 16
+
+* @ALL 8
diff --git a/_test/conf/acronyms.conf b/_test/conf/acronyms.conf
new file mode 100644
index 000000000..058e85550
--- /dev/null
+++ b/_test/conf/acronyms.conf
@@ -0,0 +1,145 @@
+# Acronyms.
+
+ACL Access Control List
+AFAICS As far as I can see
+AFAIK As far as I know
+AFAIR As far as I remember
+AJAX Asynchronous JavaScript and XML
+AIM AOL (America Online) Instant Messenger
+AOL America Online
+API Application Programming Interface
+ASAP As soon as possible
+ASCII American Standard Code for Information Interchange
+ASP Active Server Pages
+BTW By the way
+CGI Common Gateway Interface
+CMS Content Management System
+CSS Cascading Style Sheets
+CVS Concurrent Versions System
+DBA Database Administrator
+DHCP Dynamic Host Configuration Protocol
+DHTML Dynamic HyperText Markup Language
+DMCA Digital Millenium Copyright Act
+DNS Domain Name System
+DOM Document Object Model
+DTD Document Type Definition
+EOF End of file
+EOL End of line
+EOM End of message
+EOT End of text
+ESMTP Extended Simple Mail Transfer Protocol
+FAQ Frequently Asked Questions
+FDL GNU Free Documentation License
+FTP File Transfer Protocol
+FOSS Free & Open-Source Software
+FLOSS Free/Libre and Open Source Software
+FUD Fear, Uncertainty, and Doubt
+GB Gigabyte
+GHz Gigahertz
+GIF Graphics Interchange Format
+GPL GNU General Public License
+GUI Graphical User Interface
+HTML HyperText Markup Language
+HTTP Hyper Text Transfer Protocol
+IANAL I am not a lawyer (but)
+ICANN Internet Corporation for Assigned Names and Numbers
+ICQ I seek you (Instant Messenger)
+IE5 Internet Explorer 5
+IE6 Internet Explorer 6
+IE Internet Explorer
+IIRC If I remember correctly
+IIS Internet Information Services
+IMAP Internet Message Access Protocol
+IMHO In my humble opinion
+IMO In my opinion
+IOW In other words
+IRC Internet Relay Chat
+IRL In real life
+ISO International Organization for Standardization
+ISP Internet Service Provider
+JDK Java Development Kit
+JPEG Joint Photographics Experts Group
+JPG Joint Photographics Experts Group
+JS JavaScript
+KISS Keep it simple stupid
+LAN Local Area Network
+LDAP Lightweight Directory Access Protocol
+LGPL GNU Lesser General Public License
+LOL Laughing out loud
+MathML Mathematical Markup Language
+MB Megabyte
+MHz Megahertz
+MIME Multipurpose Internet Mail Extension
+MIT Massachusetts Institute of Technology
+MML Mathematical Markup Language
+MP3 Moving Picture Experts Group Layer 3
+MPEG Moving Picture Experts Group
+MSDN Microsoft Developer Network
+MS Microsoft
+MSIE Microsoft Internet Explorer
+NIS Network Information Service
+NS4.7 Netscape 4.7
+NS4 Netscape 4
+NS6 Netscape 6
+NS7 Netscape 7
+OMG Oh my God
+OPML Outline Processor Markup Language
+OS Operating System
+OSS Open Source Software
+OTOH On the other hand
+P2P Peer to Peer
+PDA Personal Digital Assistant
+PDF Portable Document Format
+Perl Practical Extraction and Report Language
+PERL Practical Extraction and Report Language
+PHP Hypertext Preprocessor
+PICS Platform for Internet Content Selection
+PIN Personal Identification Number
+PITA Pain in the Ass
+PNG Portable Network Graphics
+POP3 Post Office Protocol 3
+POP Post Office Protocol
+QoS Quality of Service
+RAID Redundant Array of Inexpensive Disks
+RDF Resource Description Framework
+RFC Request for Comments
+ROTFL Rolling on the floor laughing
+RPC Remote Procedure Call
+RSS Rich Site Summary
+RTFM Read The Fine Manual
+RTF Rich Text File
+SCSI Small Computer System Interface
+SDK Software Development Kit
+SGML Standard General Markup Language
+SMIL Synchronized Multimedia Integration Language
+SMTP Simple Mail Transfer Protocol
+SOAP Simple Object Access Protocol
+spec specification
+SQL Structured Query Language
+SSH Secure Shell
+SSI Server Side Includes
+SSL Secure Sockets Layer
+SVG Scalable Vector Graphics
+TIA Thanks in advance
+TIFF Tagged Image File Format
+TLD Top Level Domain
+TOC Table of Contents
+URI Uniform Resource Identifier
+URL Uniform Resource Locator
+URN Uniform Resource Name
+VBA Visual Basic for Applications
+VB Visual Basic
+W3C World Wide Web Consortium
+WAN Wide Area Network
+WAP Wireless Access Protocol
+WML Wireless Markup Language
+WTF? What the f***
+WWW World Wide Web
+WYSIWYG What You See Is What You Get
+XHTML Extensible HyperText Markup Language
+XML Extensible Markup Language
+XSD XML (Extensible Markup Language) Schema Definition
+XSL Extensible Stylesheet Language
+XSLT Extensible Stylesheet Language Transformations
+XUL XML User Interface Language
+YMMV Your mileage may vary
diff --git a/_test/conf/dokuwiki.php b/_test/conf/dokuwiki.php
new file mode 100644
index 000000000..5c0b28114
--- /dev/null
+++ b/_test/conf/dokuwiki.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * This is DokuWiki's Main Configuration file
+ *
+ * All the default values are kept here, you should not modify it but use
+ * a local.php file instead to override the settings from here.
+ *
+ * This is a piece of PHP code so PHP syntax applies!
+ *
+ * For help with the configuration see http://www.dokuwiki.org/config
+ */
+
+
+/* Datastorage and Permissions */
+
+$conf['fmode'] = 0644; //set file creation mode
+$conf['dmode'] = 0755; //set directory creation mode
+$conf['lang'] = 'en'; //your language
+$conf['basedir'] = ''; //absolute dir from serveroot - blank for autodetection
+$conf['baseurl'] = ''; //URL to server including protocol - blank for autodetect
+$conf['cookiedir'] = ''; //Cookie path. Leave blank for using baseurl.
+$conf['savedir'] = './data'; //where to store all the files
+$conf['allowdebug'] = 0; //allow debug output, enable if needed 0|1
+$conf['mediarevisions'] = 1; //enable/disable media revisions
+
+/* Display Options */
+
+$conf['start'] = 'start'; //name of start page
+$conf['title'] = 'DokuWiki'; //what to show in the title
+$conf['template'] = 'dokuwiki'; //see lib/tpl directory
+$conf['tagline'] = ''; //tagline in header (if template supports it)
+$conf['sidebar'] = 'sidebar'; //name of sidebar in root namespace (if template supports it)
+$conf['license'] = 'cc-by-nc-sa'; //see conf/license.php
+$conf['fullpath'] = 0; //show full path of the document or relative to datadir only? 0|1
+$conf['recent'] = 20; //how many entries to show in recent
+$conf['breadcrumbs'] = 10; //how many recent visited pages to show
+$conf['youarehere'] = 0; //show "You are here" navigation? 0|1
+$conf['typography'] = 1; //smartquote conversion 0=off, 1=doublequotes, 2=all quotes
+$conf['htmlok'] = 0; //may raw HTML be embedded? This may break layout and XHTML validity 0|1
+$conf['phpok'] = 0; //may PHP code be embedded? Never do this on the internet! 0|1
+$conf['dformat'] = '%Y/%m/%d %H:%M'; //dateformat accepted by PHPs strftime() function
+$conf['signature'] = ' --- //[[@MAIL@|@NAME@]] @DATE@//'; //signature see wiki:config for details
+$conf['toptoclevel'] = 1; //Level starting with and below to include in AutoTOC (max. 5)
+$conf['tocminheads'] = 3; //Minimum amount of headlines that determines if a TOC is built
+$conf['maxtoclevel'] = 3; //Up to which level include into AutoTOC (max. 5)
+$conf['maxseclevel'] = 3; //Up to which level create editable sections (max. 5)
+$conf['camelcase'] = 0; //Use CamelCase for linking? (I don't like it) 0|1
+$conf['deaccent'] = 1; //deaccented chars in pagenames (1) or romanize (2) or keep (0)?
+$conf['useheading'] = 0; //use the first heading in a page as its name
+$conf['refcheck'] = 1; //check for references before deleting media files
+$conf['refshow'] = 0; //how many references should be shown, 5 is a good value
+$conf['showuseras'] = 'loginname'; // 'loginname' users login name
+ // 'username' users full name
+ // 'email' e-mail address (will be obfuscated as per mailguard)
+ // 'email_link' e-mail address as a mailto: link (obfuscated)
+
+/* Antispam Features */
+
+$conf['usewordblock']= 1; //block spam based on words? 0|1
+$conf['indexdelay'] = 60*60*24*5; //allow indexing after this time (seconds) default is 5 days
+$conf['relnofollow'] = 1; //use rel="nofollow" for external links?
+$conf['mailguard'] = 'hex'; //obfuscate email addresses against spam harvesters?
+ //valid entries are:
+ // 'visible' - replace @ with [at], . with [dot] and - with [dash]
+ // 'hex' - use hex entities to encode the mail address
+ // 'none' - do not obfuscate addresses
+$conf['iexssprotect']= 1; // check for JavaScript and HTML in uploaded files 0|1
+
+/* Authentication Options - read http://www.splitbrain.org/dokuwiki/wiki:acl */
+
+$conf['useacl'] = 0; //Use Access Control Lists to restrict access?
+$conf['autopasswd'] = 1; //autogenerate passwords and email them to user
+$conf['authtype'] = 'plain'; //which authentication backend should be used
+$conf['passcrypt'] = 'smd5'; //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411)
+$conf['defaultgroup']= 'user'; //Default groups new Users are added to
+$conf['superuser'] = '!!not set!!'; //The admin can be user or @group or comma separated list user1,@group1,user2
+$conf['manager'] = '!!not set!!'; //The manager can be user or @group or comma separated list user1,@group1,user2
+$conf['profileconfirm'] = 1; //Require current password to confirm changes to user profile
+$conf['disableactions'] = ''; //comma separated list of actions to disable
+$conf['sneaky_index'] = 0; //check for namespace read permission in index view (0|1) (1 might cause unexpected behavior)
+$conf['auth_security_timeout'] = 900; //time (seconds) auth data is considered valid, set to 0 to recheck on every page view
+$conf['securecookie'] = 1; //never send HTTPS cookies via HTTP
+
+$conf['remote'] = 0; //Enable/disable remote interfaces
+$conf['remoteuser'] = '!!not set !!'; //user/groups that have access to remote interface (comma separated)
+
+/* Advanced Options */
+
+$conf['updatecheck'] = 1; //automatically check for new releases?
+$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal
+$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on
+$conf['usedraft'] = 1; //automatically save a draft while editing (0|1)
+$conf['sepchar'] = '_'; //word separator character in page names; may be a
+ // letter, a digit, '_', '-', or '.'.
+$conf['canonical'] = 0; //Should all URLs use full canonical http://... style?
+$conf['fnencode'] = 'url'; //encode filenames (url|safe|utf-8)
+$conf['autoplural'] = 0; //try (non)plural form of nonexisting files?
+$conf['compression'] = 'gz'; //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip)
+ // bz2 generates smaller files, but needs more cpu-power
+$conf['cachetime'] = 60*60*24; //maximum age for cachefile in seconds (defaults to a day)
+$conf['locktime'] = 15*60; //maximum age for lockfiles (defaults to 15 minutes)
+$conf['fetchsize'] = 0; //maximum size (bytes) fetch.php may download from extern, disabled by default
+$conf['notify'] = ''; //send change info to this email (leave blank for nobody)
+$conf['registernotify'] = ''; //send info about newly registered users to this email (leave blank for nobody)
+$conf['mailfrom'] = ''; //use this email when sending mails
+$conf['mailprefix'] = ''; //use this as prefix of outgoing mails
+$conf['gzip_output'] = 0; //use gzip content encodeing for the output xhtml (if allowed by browser)
+$conf['gdlib'] = 2; //the GDlib version (0, 1 or 2) 2 tries to autodetect
+$conf['im_convert'] = ''; //path to ImageMagicks convert (will be used instead of GD)
+$conf['jpg_quality'] = '70'; //quality of compression when scaling jpg images (0-100)
+$conf['subscribers'] = 0; //enable change notice subscription support
+$conf['subscribe_time'] = 24*60*60; //Time after which digests / lists are sent (in sec, default 1 day)
+ //Should be smaller than the time specified in recent_days
+$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0
+$conf['cssdatauri'] = 0; //Maximum byte size of small images to embed into CSS, won't work on IE<8
+$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes
+$conf['send404'] = 0; //Send a HTTP 404 status for non existing pages?
+$conf['sitemap'] = 0; //Create a google sitemap? How often? In days.
+$conf['rss_type'] = 'rss1'; //type of RSS feed to provide, by default:
+ // 'rss' - RSS 0.91
+ // 'rss1' - RSS 1.0
+ // 'rss2' - RSS 2.0
+ // 'atom' - Atom 0.3
+ // 'atom1' - Atom 1.0
+$conf['rss_linkto'] = 'diff'; //what page RSS entries link to:
+ // 'diff' - page showing revision differences
+ // 'page' - the revised page itself
+ // 'rev' - page showing all revisions
+ // 'current' - most recent revision of page
+$conf['rss_content'] = 'abstract'; //what to put in the items by default?
+ // 'abstract' - plain text, first paragraph or so
+ // 'diff' - plain text unified diff wrapped in <pre> tags
+ // 'htmldiff' - diff as HTML table
+ // 'html' - the full page rendered in XHTML
+$conf['rss_media'] = 'both'; //what should be listed?
+ // 'both' - page and media changes
+ // 'pages' - page changes only
+ // 'media' - media changes only
+$conf['rss_update'] = 5*60; //Update the RSS feed every n seconds (defaults to 5 minutes)
+$conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1
+$conf['recent_days'] = 7; //How many days of recent changes to keep. (days)
+$conf['broken_iua'] = 0; //Platform with broken ignore_user_abort (IIS+CGI) 0|1
+$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard)
+$conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generation
+$conf['rememberme'] = 1; //Enable/disable remember me on login
+
+//Set target to use when creating links - leave empty for same window
+$conf['target']['wiki'] = '';
+$conf['target']['interwiki'] = '';
+$conf['target']['extern'] = '';
+$conf['target']['media'] = '';
+$conf['target']['windows'] = '';
+
+//Proxy setup - if your Server needs a proxy to access the web set these
+$conf['proxy']['host'] = '';
+$conf['proxy']['port'] = '';
+$conf['proxy']['user'] = '';
+$conf['proxy']['pass'] = '';
+$conf['proxy']['ssl'] = 0;
+$conf['proxy']['except'] = '';
+
+/* Safemode Hack */
+
+$conf['safemodehack'] = 0; //read http://www.dokuwiki.org/config:safemodehack !
+$conf['ftp']['host'] = 'localhost';
+$conf['ftp']['port'] = '21';
+$conf['ftp']['user'] = 'user';
+$conf['ftp']['pass'] = 'password';
+$conf['ftp']['root'] = '/home/user/htdocs';
+
+$conf['readdircache'] = 0; //time cache in second for the readdir opération, 0 to deactivate.
diff --git a/_test/conf/entities.conf b/_test/conf/entities.conf
new file mode 100644
index 000000000..be9ed6d40
--- /dev/null
+++ b/_test/conf/entities.conf
@@ -0,0 +1,22 @@
+# Typography replacements
+#
+# Order does matter!
+#
+# You can use HTML entities here, but it is not recomended because it may break
+# non-HTML renderers. Use UTF-8 chars directly instead.
+
+<-> ↔
+-> →
+<- ←
+<=> ⇔
+=> ⇒
+<= ⇐
+>> »
+<< «
+--- —
+-- –
+(c) ©
+(tm) ™
+(r) ®
+... …
+
diff --git a/_test/conf/interwiki.conf b/_test/conf/interwiki.conf
new file mode 100644
index 000000000..28d603de2
--- /dev/null
+++ b/_test/conf/interwiki.conf
@@ -0,0 +1,131 @@
+# Each URL may contain one of the placeholders {URL} or {NAME}
+# {URL} is replaced by the URL encoded representation of the wikiname
+# this is the right thing to do in most cases
+# {NAME} this is replaced by the wikiname as given in the document
+# no further encoding is done
+# If no placeholder is defined the urlencoded name is appended to the URL
+
+# To prevent losing your added InterWiki shortcuts after an upgrade,
+# you should add new ones to interwiki.local.conf
+
+wp http://en.wikipedia.org/wiki/{NAME}
+wpfr http://fr.wikipedia.org/wiki/{NAME}
+wpde http://de.wikipedia.org/wiki/{NAME}
+wpes http://es.wikipedia.org/wiki/{NAME}
+wppl http://pl.wikipedia.org/wiki/{NAME}
+wpjp http://ja.wikipedia.org/wiki/{NAME}
+wpmeta http://meta.wikipedia.org/wiki/{NAME}
+doku http://www.dokuwiki.org/
+dokubug http://bugs.dokuwiki.org/index.php?do=details&amp;task_id=
+rfc http://www.cs.ccu.edu.tw/~chm91u/rfc2html.php?in=
+man http://man.cx/
+amazon http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
+amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
+amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/
+paypal https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=
+phpfn http://www.php.net/{NAME}
+coral http://{HOST}.{PORT}.nyud.net:8090/{PATH}?{QUERY}
+freecache http://freecache.org/{NAME}
+sb http://www.splitbrain.org/go/
+skype skype:{NAME}
+google.de http://www.google.de/search?q=
+go http://www.google.com/search?q={URL}&amp;btnI=lucky
+
+# To support VoIP/SIP links
+callto callto://{NAME}
+
+# Standards from http://usemod.com/intermap.txt follow
+
+AbbeNormal http://www.ourpla.net/cgi-bin/pikie.cgi?
+AcadWiki http://xarch.tu-graz.ac.at/autocad/wiki/
+Acronym http://www.acronymfinder.com/af-query.asp?String=exact&amp;Acronym=
+Advogato http://www.advogato.org/
+AIWiki http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi?
+ALife http://news.alife.org/wiki/index.php?
+AndStuff http://andstuff.org/wiki.php?
+Annotation http://bayle.stanford.edu/crit/nph-med.cgi/
+AnnotationWiki http://www.seedwiki.com/page.cfm?wikiid=368&amp;doc=
+AwarenessWiki http://taoriver.net/aware/
+BenefitsWiki http://www.benefitslink.com/cgi-bin/wiki.cgi?
+BridgesWiki http://c2.com/w2/bridges/
+C2find http://c2.com/cgi/wiki?FindPage&amp;value=
+Cache http://www.google.com/search?q=cache:
+CLiki http://ww.telent.net/cliki/
+CmWiki http://www.ourpla.net/cgi-bin/wiki.pl?
+CreationMatters http://www.ourpla.net/cgi-bin/wiki.pl?
+DejaNews http://www.deja.com/=dnc/getdoc.xp?AN=
+DeWikiPedia http://www.wikipedia.de/wiki.cgi?
+Dictionary http://www.dict.org/bin/Dict?Database=*&amp;Form=Dict1&amp;Strategy=*&amp;Query=
+DiveIntoOsx http://diveintoosx.org/
+DocBook http://docbook.org/wiki/moin.cgi/
+DolphinWiki http://www.object-arts.com/wiki/html/Dolphin/
+EfnetCeeWiki http://purl.net/wiki/c/
+EfnetCppWiki http://purl.net/wiki/cpp/
+EfnetPythonWiki http://purl.net/wiki/python/
+EfnetXmlWiki http://purl.net/wiki/xml/
+EljWiki http://elj.sourceforge.net/phpwiki/index.php/
+EmacsWiki http://www.emacswiki.org/cgi-bin/wiki.pl?
+FinalEmpire http://final-empire.sourceforge.net/cgi-bin/wiki.pl?
+Foldoc http://www.foldoc.org/foldoc/foldoc.cgi?
+FoxWiki http://fox.wikis.com/wc.dll?Wiki~
+FreeBSDman http://www.FreeBSD.org/cgi/man.cgi?apropos=1&amp;query=
+Google http://www.google.com/search?q=
+GoogleGroups http://groups.google.com/groups?q=
+GreenCheese http://www.greencheese.org/
+HammondWiki http://www.dairiki.org/HammondWiki/index.php3?
+Haribeau http://wiki.haribeau.de/cgi-bin/wiki.pl?
+IAWiki http://www.IAwiki.net/
+IMDB http://us.imdb.com/Title?
+JargonFile http://sunir.org/apps/meta.pl?wiki=JargonFile&amp;redirect=
+JiniWiki http://www.cdegroot.com/cgi-bin/jini?
+JspWiki http://www.ecyrd.com/JSPWiki/Wiki.jsp?page=
+KmWiki http://www.voght.com/cgi-bin/pywiki?
+KnowHow http://www2.iro.umontreal.ca/~paquetse/cgi-bin/wiki.cgi?
+LanifexWiki http://opt.lanifex.com/cgi-bin/wiki.pl?
+LegoWiki http://www.object-arts.com/wiki/html/Lego-Robotics/
+LinuxWiki http://www.linuxwiki.de/
+LugKR http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?
+MathSongsWiki http://SeedWiki.com/page.cfm?wikiid=237&amp;doc=
+MbTest http://www.usemod.com/cgi-bin/mbtest.pl?
+MeatBall http://www.usemod.com/cgi-bin/mb.pl?
+MetaWiki http://sunir.org/apps/meta.pl?
+MetaWikiPedia http://meta.wikipedia.com/wiki/
+MoinMoin http://purl.net/wiki/moin/
+MuWeb http://www.dunstable.com/scripts/MuWebWeb?
+NetVillage http://www.netbros.com/?
+OpenWiki http://openwiki.com/?
+OrgPatterns http://www.bell-labs.com/cgi-user/OrgPatterns/OrgPatterns?
+PangalacticOrg http://www.pangalactic.org/Wiki/
+PersonalTelco http://www.personaltelco.net/index.cgi/
+PhpWiki http://phpwiki.sourceforge.net/phpwiki/index.php?
+Pikie http://pikie.darktech.org/cgi/pikie?
+PPR http://c2.com/cgi/wiki?
+PurlNet http://purl.oclc.org/NET/
+PythonInfo http://www.python.org/cgi-bin/moinmoin/
+PythonWiki http://www.pythonwiki.de/
+PyWiki http://www.voght.com/cgi-bin/pywiki?
+SeaPig http://www.seapig.org/
+SeattleWireless http://seattlewireless.net/?
+SenseisLibrary http://senseis.xmp.net/?
+Shakti http://cgi.algonet.se/htbin/cgiwrap/pgd/ShaktiWiki/
+SourceForge http://sourceforge.net/{NAME}
+Squeak http://minnow.cc.gatech.edu/squeak/
+StrikiWiki http://ch.twi.tudelft.nl/~mostert/striki/teststriki.pl?
+SVGWiki http://www.protocol7.com/svg-wiki/default.asp?
+Tavi http://tavi.sourceforge.net/index.php?
+TmNet http://www.technomanifestos.net/?
+TMwiki http://www.EasyTopicMaps.com/?page=
+TWiki http://twiki.org/cgi-bin/view/{NAME}
+TwistedWiki http://purl.net/wiki/twisted/
+Unreal http://wiki.beyondunreal.com/wiki/
+UseMod http://www.usemod.com/cgi-bin/wiki.pl?
+VisualWorks http://wiki.cs.uiuc.edu/VisualWorks/
+WebDevWikiNL http://www.promo-it.nl/WebDevWiki/index.php?page=
+WebSeitzWiki http://webseitz.fluxent.com/wiki/
+Why http://clublet.com/c/c/why?
+Wiki http://c2.com/cgi/wiki?
+WikiPedia http://www.wikipedia.com/wiki/
+WikiWorld http://WikiWorld.com/wiki/index.php/
+YpsiEyeball http://sknkwrks.dyndns.org:1957/writewiki/wiki.pl?
+ZWiki http://www.zwiki.org/
+
diff --git a/_test/conf/license.php b/_test/conf/license.php
new file mode 100644
index 000000000..89728ab57
--- /dev/null
+++ b/_test/conf/license.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * This file defines multiple available licenses you can license your
+ * wiki contents under. Do not change this file, but create a
+ * license.local.php instead.
+ */
+
+$license['cc-zero'] = array(
+ 'name' => 'CC0 1.0 Universal',
+ 'url' => 'http://creativecommons.org/publicdomain/zero/1.0/',
+);
+$license['publicdomain'] = array(
+ 'name' => 'Public Domain',
+ 'url' => 'http://creativecommons.org/licenses/publicdomain/',
+);
+$license['cc-by'] = array(
+ 'name' => 'CC Attribution 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by/3.0/',
+);
+$license['cc-by-sa'] = array(
+ 'name' => 'CC Attribution-Share Alike 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-sa/3.0/',
+);
+$license['gnufdl'] = array(
+ 'name' => 'GNU Free Documentation License 1.3',
+ 'url' => 'http://www.gnu.org/licenses/fdl-1.3.html',
+);
+$license['cc-by-nc'] = array(
+ 'name' => 'CC Attribution-Noncommercial 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-nc/3.0/',
+);
+$license['cc-by-nc-sa'] = array(
+ 'name' => 'CC Attribution-Noncommercial-Share Alike 3.0 Unported',
+ 'url' => 'http://creativecommons.org/licenses/by-nc-sa/3.0/',
+);
+
diff --git a/_test/conf/local.php b/_test/conf/local.php
new file mode 100644
index 000000000..3de30ee21
--- /dev/null
+++ b/_test/conf/local.php
@@ -0,0 +1,3 @@
+<?php
+
+$conf['savedir'] = DOKU_TMP_DATA; //where to store all the files
diff --git a/_test/conf/local.php.dist b/_test/conf/local.php.dist
new file mode 100644
index 000000000..0397954f4
--- /dev/null
+++ b/_test/conf/local.php.dist
@@ -0,0 +1,16 @@
+<?php
+/**
+ * This is an example of how a local.php could look like.
+ * Simply copy the options you want to change from dokuwiki.php
+ * to this file and change them.
+ *
+ * When using the installer, a correct local.php file be generated for
+ * you automatically.
+ */
+
+
+//$conf['title'] = 'My Wiki'; //what to show in the title
+
+//$conf['useacl'] = 1; //Use Access Control Lists to restrict access?
+//$conf['superuser'] = 'joe';
+
diff --git a/_test/conf/mediameta.php b/_test/conf/mediameta.php
new file mode 100644
index 000000000..0428a4b88
--- /dev/null
+++ b/_test/conf/mediameta.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * This configures which meta data will be editable through
+ * the media manager. Each field of the array is an array with the
+ * following contents:
+ * fieldname - Where data will be saved (EXIF or IPTC field)
+ * label - key to lookup in the $lang var, if not found printed as is
+ * htmltype - 'text' or 'textarea'
+ * lookups - array additional fields to lookup the data (EXIF or IPTC fields)
+ *
+ * The fields are not ordered continously to make inserting additional items
+ * in between simpler.
+ *
+ * This is a PHP snippet, so PHP syntax applies.
+ *
+ * Note: $fields is not a global variable and will not be available to any
+ * other functions or templates later
+ *
+ * You may extend or overwrite this variable in a optional
+ * conf/mediameta.local.php file
+ *
+ * For a list of available EXIF/IPTC fields refer to
+ * http://www.dokuwiki.org/devel:templates:detail.php
+ */
+
+
+$fields = array(
+ 10 => array('Iptc.Headline',
+ 'img_title',
+ 'text'),
+
+ 20 => array('',
+ 'img_date',
+ 'date',
+ array('Date.EarliestTime')),
+
+ 30 => array('',
+ 'img_fname',
+ 'text',
+ array('File.Name')),
+
+ 40 => array('Iptc.Caption',
+ 'img_caption',
+ 'textarea',
+ array('Exif.UserComment',
+ 'Exif.TIFFImageDescription',
+ 'Exif.TIFFUserComment')),
+
+ 50 => array('Iptc.Byline',
+ 'img_artist',
+ 'text',
+ array('Exif.TIFFArtist',
+ 'Exif.Artist',
+ 'Iptc.Credit')),
+
+ 60 => array('Iptc.CopyrightNotice',
+ 'img_copyr',
+ 'text',
+ array('Exif.TIFFCopyright',
+ 'Exif.Copyright')),
+
+ 70 => array('',
+ 'img_format',
+ 'text',
+ array('File.Format')),
+
+ 80 => array('',
+ 'img_fsize',
+ 'text',
+ array('File.NiceSize')),
+
+ 90 => array('',
+ 'img_width',
+ 'text',
+ array('File.Width')),
+
+ 100 => array('',
+ 'img_height',
+ 'text',
+ array('File.Height')),
+
+ 110 => array('',
+ 'img_camera',
+ 'text',
+ array('Simple.Camera')),
+
+ 120 => array('Iptc.Keywords',
+ 'img_keywords',
+ 'text',
+ array('Exif.Category')),
+);
diff --git a/_test/conf/mime.conf b/_test/conf/mime.conf
new file mode 100644
index 000000000..24529b06c
--- /dev/null
+++ b/_test/conf/mime.conf
@@ -0,0 +1,64 @@
+# Allowed uploadable file extensions and mimetypes are defined here.
+# To extend this file it is recommended to create a mime.local.conf
+# file. Mimetypes that should be downloadable and not be opened in the
+# should be prefixed with a !
+
+jpg image/jpeg
+jpeg image/jpeg
+gif image/gif
+png image/png
+
+swf application/x-shockwave-flash
+mp3 audio/mpeg
+ogg audio/ogg
+wav audio/wav
+
+tgz !application/octet-stream
+tar !application/x-gtar
+gz !application/octet-stream
+bz2 !application/octet-stream
+zip !application/zip
+rar !application/rar
+7z !application/x-7z-compressed
+
+pdf application/pdf
+ps !application/postscript
+
+rpm !application/octet-stream
+deb !application/octet-stream
+
+doc !application/msword
+xls !application/msexcel
+ppt !application/mspowerpoint
+rtf !application/msword
+
+docx !application/vnd.openxmlformats-officedocument.wordprocessingml.document
+xlsx !application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+pptx !application/vnd.openxmlformats-officedocument.presentationml.presentation
+
+sxw !application/soffice
+sxc !application/soffice
+sxi !application/soffice
+sxd !application/soffice
+
+odc !application/vnd.oasis.opendocument.chart
+odf !application/vnd.oasis.opendocument.formula
+odg !application/vnd.oasis.opendocument.graphics
+odi !application/vnd.oasis.opendocument.image
+odp !application/vnd.oasis.opendocument.presentation
+ods !application/vnd.oasis.opendocument.spreadsheet
+odt !application/vnd.oasis.opendocument.text
+
+# You should enable HTML and Text uploads only for restricted Wikis.
+# Spammers are known to upload spam pages through unprotected Wikis.
+# Note: Enabling HTML opens Cross Site Scripting vulnerabilities
+# through JavaScript. Only enable this with trusted users. You
+# need to disable the iexssprotect option additionally to
+# adding the mime type here
+#html text/html
+#htm text/html
+#txt text/plain
+#conf text/plain
+#xml text/xml
+#csv text/csv
+
diff --git a/_test/conf/mysql.conf.php.example b/_test/conf/mysql.conf.php.example
new file mode 100644
index 000000000..94bc14e1f
--- /dev/null
+++ b/_test/conf/mysql.conf.php.example
@@ -0,0 +1,253 @@
+<?php
+/*
+ * This is an example configuration for the mysql auth module.
+ *
+ * This SQL statements are optimized for following table structure.
+ * If you use a different one you have to change them accordingly.
+ * See comments of every statement for details.
+ *
+ * TABLE users
+ * uid login pass firstname lastname email
+ *
+ * TABLE groups
+ * gid name
+ *
+ * TABLE usergroup
+ * uid gid
+ *
+ * To use this configuration you have to copy them to local.protected.php
+ * or at least include this file in local.protected.php.
+ */
+
+/* Options to configure database access. You need to set up this
+ * options carefully, otherwise you won't be able to access you
+ * database.
+ */
+$conf['auth']['mysql']['server'] = '';
+$conf['auth']['mysql']['user'] = '';
+$conf['auth']['mysql']['password'] = '';
+$conf['auth']['mysql']['database'] = '';
+
+/* This option enables debug messages in the mysql module. It is
+ * mostly usefull for system admins.
+ */
+$conf['auth']['mysql']['debug'] = 0;
+
+/* Normally password encryption is done by DokuWiki (recommended) but for
+ * some reasons it might be usefull to let the database do the encryption.
+ * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
+ * the database, otherwise the encrypted one.
+ */
+$conf['auth']['mysql']['forwardClearPass'] = 0;
+
+/* Multiple table operations will be protected by locks. This array tolds
+ * the module which tables to lock. If you use any aliases for table names
+ * these array must also contain these aliases. Any unamed alias will cause
+ * a warning during operation. See the example below.
+ */
+$conf['auth']['mysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
+
+/***********************************************************************/
+/* Basic SQL statements for user authentication (required) */
+/***********************************************************************/
+
+/* This statement is used to grant or deny access to the wiki. The result
+ * should be a table with exact one line containing at least the password
+ * of the user. If the result table is empty or contains more than one
+ * row, access will be denied.
+ *
+ * The module access the password as 'pass' so a alias might be necessary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ * %{pass} encrypted or clear text password (depends on 'encryptPass')
+ * %{dgroup} default group name
+ */
+$conf['auth']['mysql']['checkPass'] = "SELECT pass
+ FROM usergroup AS ug
+ JOIN users AS u ON u.uid=ug.uid
+ JOIN groups AS g ON g.gid=ug.gid
+ WHERE login='%{user}'
+ AND name='%{dgroup}'";
+
+/* This statement should return a table with exact one row containing
+ * information about one user. The field needed are:
+ * 'pass' containing the encrypted or clear text password
+ * 'name' the user's full name
+ * 'mail' the user's email address
+ *
+ * Keep in mind that Dokuwiki will access thise information through the
+ * names listed above so aliasses might be neseccary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
+ FROM users
+ WHERE login='%{user}'";
+
+/* This statement is used to get all groups a user is member of. The
+ * result should be a table containing all groups the given user is
+ * member of. The module access the group name as 'group' so a alias
+ * might be nessecary.
+ *
+ * Following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getGroups'] = "SELECT name as `group`
+ FROM groups g, users u, usergroup ug
+ WHERE u.uid = ug.uid
+ AND g.gid = ug.gid
+ AND u.login='%{user}'";
+
+/***********************************************************************/
+/* Additional minimum SQL statements to use the user manager */
+/***********************************************************************/
+
+/* This statement should return a table containing all user login names
+ * that meet certain filter criteria. The filter expressions will be added
+ * case dependend by the module. At the end a sort expression will be added.
+ * Important is that this list contains no double entries fo a user. Each
+ * user name is only allowed once in the table.
+ *
+ * The login name will be accessed as 'user' to a alias might be neseccary.
+ * No patterns will be replaced in this statement but following patters
+ * will be replaced in the filter expressions:
+ * %{user} in FilterLogin user's login name
+ * %{name} in FilterName user's full name
+ * %{email} in FilterEmail user's email address
+ * %{group} in FilterGroup group name
+ */
+$conf['auth']['mysql']['getUsers'] = "SELECT DISTINCT login AS user
+ FROM users AS u
+ LEFT JOIN usergroup AS ug ON u.uid=ug.uid
+ LEFT JOIN groups AS g ON ug.gid=g.gid";
+$conf['auth']['mysql']['FilterLogin'] = "login LIKE '%{user}'";
+$conf['auth']['mysql']['FilterName'] = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
+$conf['auth']['mysql']['FilterEmail'] = "email LIKE '%{email}'";
+$conf['auth']['mysql']['FilterGroup'] = "name LIKE '%{group}'";
+$conf['auth']['mysql']['SortOrder'] = "ORDER BY login";
+
+/***********************************************************************/
+/* Additional SQL statements to add new users with the user manager */
+/***********************************************************************/
+
+/* This statement should add a user to the database. Minimum information
+ * to store are: login name, password, email address and full name.
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{pass} password (encrypted or clear text, depends on 'encryptPass')
+ * %{email} email address
+ * %{name} user's full name
+ */
+$conf['auth']['mysql']['addUser'] = "INSERT INTO users
+ (login, pass, email, firstname, lastname)
+ VALUES ('%{user}', '%{pass}', '%{email}',
+ SUBSTRING_INDEX('%{name}',' ', 1),
+ SUBSTRING_INDEX('%{name}',' ', -1))";
+
+/* This statement should add a group to the database.
+ * Following patterns will be replaced:
+ * %{group} group name
+ */
+$conf['auth']['mysql']['addGroup'] = "INSERT INTO groups (name)
+ VALUES ('%{group}')";
+
+/* This statement should connect a user to a group (a user become member
+ * of that group).
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
+ VALUES ('%{uid}', '%{gid}')";
+
+/* This statement should remove a group fom the database.
+ * Following patterns will be replaced:
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['delGroup'] = "DELETE FROM groups
+ WHERE gid='%{gid}'";
+
+/* This statement should return the database index of a given user name.
+ * The module will access the index with the name 'id' so a alias might be
+ * necessary.
+ * following patters will be replaced:
+ * %{user} user name
+ */
+$conf['auth']['mysql']['getUserID'] = "SELECT uid AS id
+ FROM users
+ WHERE login='%{user}'";
+
+/***********************************************************************/
+/* Additional SQL statements to delete users with the user manager */
+/***********************************************************************/
+
+/* This statement should remove a user fom the database.
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ */
+$conf['auth']['mysql']['delUser'] = "DELETE FROM users
+ WHERE uid='%{uid}'";
+
+/* This statement should remove all connections from a user to any group
+ * (a user quits membership of all groups).
+ * Following patterns will be replaced:
+ * %{uid} id of a user dataset
+ */
+$conf['auth']['mysql']['delUserRefs'] = "DELETE FROM usergroup
+ WHERE uid='%{uid}'";
+
+/***********************************************************************/
+/* Additional SQL statements to modify users with the user manager */
+/***********************************************************************/
+
+/* This statements should modify a user entry in the database. The
+ * statements UpdateLogin, UpdatePass, UpdateEmail and UpdateName will be
+ * added to updateUser on demand. Only changed parameters will be used.
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{pass} password (encrypted or clear text, depends on 'encryptPass')
+ * %{email} email address
+ * %{name} user's full name
+ * %{uid} user id that should be updated
+ */
+$conf['auth']['mysql']['updateUser'] = "UPDATE users SET";
+$conf['auth']['mysql']['UpdateLogin'] = "login='%{user}'";
+$conf['auth']['mysql']['UpdatePass'] = "pass='%{pass}'";
+$conf['auth']['mysql']['UpdateEmail'] = "email='%{email}'";
+$conf['auth']['mysql']['UpdateName'] = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
+ lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
+$conf['auth']['mysql']['UpdateTarget']= "WHERE uid=%{uid}";
+
+/* This statement should remove a single connection from a user to a
+ * group (a user quits membership of that group).
+ *
+ * Following patterns will be replaced:
+ * %{user} user's login name
+ * %{uid} id of a user dataset
+ * %{group} group name
+ * %{gid} id of a group dataset
+ */
+$conf['auth']['mysql']['delUserGroup']= "DELETE FROM usergroup
+ WHERE uid='%{uid}'
+ AND gid='%{gid}'";
+
+/* This statement should return the database index of a given group name.
+ * The module will access the index with the name 'id' so a alias might
+ * be necessary.
+ *
+ * Following patters will be replaced:
+ * %{group} group name
+ */
+$conf['auth']['mysql']['getGroupID'] = "SELECT gid AS id
+ FROM groups
+ WHERE name='%{group}'";
+
+
diff --git a/_test/conf/plugins.local.php b/_test/conf/plugins.local.php
new file mode 100644
index 000000000..00e8c10be
--- /dev/null
+++ b/_test/conf/plugins.local.php
@@ -0,0 +1,8 @@
+<?php
+/*
+ * Local plugin enable/disable settings
+ * Auto-generated through plugin/extension manager
+ *
+ * NOTE: Plugins will not be added to this file unless there is a need to override a default setting. Plugins are
+ * enabled by default, unless having a 'disabled' file in their plugin folder.
+ */
diff --git a/_test/conf/plugins.php b/_test/conf/plugins.php
new file mode 100644
index 000000000..b2c79970d
--- /dev/null
+++ b/_test/conf/plugins.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * This file configures the default states of available plugins. All settings in
+ * the plugins.*.php files will override those here.
+ */
+$plugins['testing'] = 0;
diff --git a/_test/conf/plugins.required.php b/_test/conf/plugins.required.php
new file mode 100644
index 000000000..26eb8888b
--- /dev/null
+++ b/_test/conf/plugins.required.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * This file configures the enabled/disabled status of plugins, which are also protected
+ * from changes by the extention manager. These settings will override any local settings.
+ * It is not recommended to change this file, as it is overwritten on DokuWiki upgrades.
+ */
+$plugins['acl'] = 1;
+$plugins['plugin'] = 1;
+$plugins['config'] = 1;
+$plugins['usermanager'] = 1;
+$plugins['revert'] = 1;
diff --git a/_test/conf/scheme.conf b/_test/conf/scheme.conf
new file mode 100644
index 000000000..88cb3c44d
--- /dev/null
+++ b/_test/conf/scheme.conf
@@ -0,0 +1,11 @@
+#Add URL schemes you want to be recognized as links here
+
+http
+https
+telnet
+gopher
+wais
+ftp
+ed2k
+irc
+ldap \ No newline at end of file
diff --git a/_test/conf/smileys.conf b/_test/conf/smileys.conf
new file mode 100644
index 000000000..80daed57a
--- /dev/null
+++ b/_test/conf/smileys.conf
@@ -0,0 +1,28 @@
+# Smileys configured here will be replaced by the
+# configured images in the smiley directory
+
+8-) icon_cool.gif
+8-O icon_eek.gif
+8-o icon_eek.gif
+:-( icon_sad.gif
+:-) icon_smile.gif
+=) icon_smile2.gif
+:-/ icon_doubt.gif
+:-\ icon_doubt2.gif
+:-? icon_confused.gif
+:-D icon_biggrin.gif
+:-P icon_razz.gif
+:-o icon_surprised.gif
+:-O icon_surprised.gif
+:-x icon_silenced.gif
+:-X icon_silenced.gif
+:-| icon_neutral.gif
+;-) icon_wink.gif
+m( facepalm.gif
+^_^ icon_fun.gif
+:?: icon_question.gif
+:!: icon_exclaim.gif
+LOL icon_lol.gif
+FIXME fixme.gif
+DELETEME delete.gif
+
diff --git a/_test/conf/users.auth.php.dist b/_test/conf/users.auth.php.dist
new file mode 100644
index 000000000..6576eeb5f
--- /dev/null
+++ b/_test/conf/users.auth.php.dist
@@ -0,0 +1,10 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# user:MD5password:Real Name:email:groups,comma,seperated
+
diff --git a/_test/conf/wordblock.conf b/_test/conf/wordblock.conf
new file mode 100644
index 000000000..fe451f278
--- /dev/null
+++ b/_test/conf/wordblock.conf
@@ -0,0 +1,32 @@
+# This blacklist is maintained by the DokuWiki community
+# patches welcome
+#
+https?:\/\/(\S*?)(-side-effects|top|pharm|pill|discount|discount-|deal|price|order|now|best|cheap|cheap-|online|buy|buy-|sale|sell)(\S*?)(cialis|viagra|prazolam|xanax|zanax|soma|vicodin|zenical|xenical|meridia|paxil|prozac|claritin|allegra|lexapro|wellbutrin|zoloft|retin|valium|levitra|phentermine)
+gay\s*sex
+bi\s*sex
+incest
+zoosex
+gang\s*bang
+facials
+ladyboy
+fetish
+\btits\b
+\brape\b
+bolea\.com
+52crystal
+baida\.org
+web-directory\.awardspace\.us
+korsan-team\.com
+BUDA TAMAMDIR
+wow-powerleveling-wow\.com
+wow gold
+wow-gold\.dinmo\.cn
+downgrade-vista\.com
+downgradetowindowsxp\.com
+elegantugg\.com
+classicedhardy\.com
+research-service\.com
+https?:\/\/(\S*?)(2-pay-secure|911essay|academia-research|anypapers|applicationessay|bestbuyessay|bestdissertation|bestessay|bestresume|besttermpaper|businessessay|college-paper|customessay|custom-made-paper|custom-writing|degree-?result|dissertationblog|dissertation-service|dissertations?expert|essaybank|essay-?blog|essaycapital|essaylogic|essaymill|essayontime|essaypaper|essays?land|essaytownsucks|essay-?writ|fastessays|freelancercareers|genuinecontent|genuineessay|genuinepaper|goessay|grandresume|killer-content|ma-dissertation|managementessay|masterpaper|mightystudent|needessay|researchedge|researchpaper-blog|resumecvservice|resumesexperts|resumesplanet|rushessay|samedayessay|superiorcontent|superiorpaper|superiorthesis|term-paper|termpaper-blog|term-paper-research|thesisblog|universalresearch|valwriting|vdwriters|wisetranslation|writersassembly|writers\.com\.ph|writers\.ph)
+flatsinmumbai\.co\.in
+https?:\/\/(\S*?)penny-?stock
+mattressreview\.biz
diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php
new file mode 100644
index 000000000..e47c06329
--- /dev/null
+++ b/_test/core/DokuWikiTest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Helper class to provide basic functionality for tests
+ */
+abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
+
+ /**
+ * tests can override this
+ *
+ * @var array plugins to enable for test class
+ */
+ protected $pluginsEnabled = array();
+
+ /**
+ * tests can override this
+ *
+ * @var array plugins to disable for test class
+ */
+ protected $pluginsDisabled = array();
+
+ /**
+ * Reset the DokuWiki environment before each test run. Makes sure loaded config,
+ * language and plugins are correct.
+ *
+ * @throws Exception if plugin actions fail
+ * @return void
+ */
+ public function setUp() {
+ // reload config
+ global $conf, $config_cascade;
+ $conf = array();
+ foreach (array('default','local','protected') as $config_group) {
+ if (empty($config_cascade['main'][$config_group])) continue;
+ foreach ($config_cascade['main'][$config_group] as $config_file) {
+ if (@file_exists($config_file)) {
+ include($config_file);
+ }
+ }
+ }
+
+ // reload license config
+ global $license;
+ $license = array();
+
+ // load the license file(s)
+ foreach (array('default','local') as $config_group) {
+ if (empty($config_cascade['license'][$config_group])) continue;
+ foreach ($config_cascade['license'][$config_group] as $config_file) {
+ if(@file_exists($config_file)){
+ include($config_file);
+ }
+ }
+ }
+
+ // make real paths and check them
+ init_paths();
+ init_files();
+
+ // reset loaded plugins
+ global $plugin_controller_class, $plugin_controller;
+ $plugin_controller = new $plugin_controller_class();
+
+ // disable all non-default plugins
+ global $default_plugins;
+ foreach ($plugin_controller->getList() as $plugin) {
+ if (!in_array($plugin, $default_plugins)) {
+ if (!$plugin_controller->disable($plugin)) {
+ throw new Exception('Could not disable plugin "'.$plugin.'"!');
+ }
+ }
+ }
+
+ // disable and enable configured plugins
+ foreach ($this->pluginsDisabled as $plugin) {
+ if (!$plugin_controller->disable($plugin)) {
+ throw new Exception('Could not disable plugin "'.$plugin.'"!');
+ }
+ }
+ foreach ($this->pluginsEnabled as $plugin) {
+ /* enable() returns false but works...
+ if (!$plugin_controller->enable($plugin)) {
+ throw new Exception('Could not enable plugin "'.$plugin.'"!');
+ }
+ */
+ $plugin_controller->enable($plugin);
+ }
+
+ // reset event handler
+ global $EVENT_HANDLER;
+ $EVENT_HANDLER = new Doku_Event_Handler();
+
+ // reload language
+ $local = $conf['lang'];
+ trigger_event('INIT_LANG_LOAD', $local, 'init_lang', true);
+ }
+}
diff --git a/_test/core/TestRequest.php b/_test/core/TestRequest.php
new file mode 100644
index 000000000..fa3ddec90
--- /dev/null
+++ b/_test/core/TestRequest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Simulates a full DokuWiki HTTP Request and allows
+ * runtime inspection.
+ */
+
+// output buffering
+$output_buffer = '';
+
+function ob_start_callback($buffer) {
+ global $output_buffer;
+ $output_buffer .= $buffer;
+}
+
+
+/**
+ * Helper class to execute a fake request
+ */
+class TestRequest {
+
+ private $server = array();
+ private $session = array();
+ private $get = array();
+ private $post = array();
+
+ public function getServer($key) { return $this->server[$key]; }
+ public function getSession($key) { return $this->session[$key]; }
+ public function getGet($key) { return $this->get[$key]; }
+ public function getPost($key) { return $this->post[$key]; }
+
+ public function setServer($key, $value) { $this->server[$key] = $value; }
+ public function setSession($key, $value) { $this->session[$key] = $value; }
+ public function setGet($key, $value) { $this->get[$key] = $value; }
+ public function setPost($key, $value) { $this->post[$key] = $value; }
+
+ /**
+ * Executes the request
+ *
+ * @return TestResponse the resulting output of the request
+ */
+ public function execute() {
+ // save old environment
+ $server = $_SERVER;
+ $session = $_SESSION;
+ $get = $_GET;
+ $post = $_POST;
+ $request = $_REQUEST;
+
+ // fake environment
+ global $default_server_vars;
+ $_SERVER = array_merge($default_server_vars, $this->server);
+ $_SESSION = $this->session;
+ $_GET = $this->get;
+ $_POST = $this->post;
+ $_REQUEST = array_merge($_GET, $_POST);
+
+ // reset output buffer
+ global $output_buffer;
+ $output_buffer = '';
+
+ // now execute dokuwiki and grep the output
+ header_remove();
+ ob_start('ob_start_callback');
+ include(DOKU_INC.'doku.php');
+ ob_end_flush();
+
+ // create the response object
+ $response = new TestResponse(
+ $output_buffer,
+ headers_list()
+ );
+
+ // reset environment
+ $_SERVER = $server;
+ $_SESSION = $session;
+ $_GET = $get;
+ $_POST = $post;
+ $_REQUEST = $request;
+
+ return $response;
+ }
+}
diff --git a/_test/core/TestResponse.php b/_test/core/TestResponse.php
new file mode 100644
index 000000000..6d20afb28
--- /dev/null
+++ b/_test/core/TestResponse.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * holds a copy of all produced outputs of a TestRequest
+ */
+class TestResponse {
+ /**
+ * @var string
+ */
+ private $content;
+
+ /**
+ * @var array
+ */
+ private $headers;
+
+ /**
+ * @var phpQueryObject
+ */
+ private $pq = null;
+
+ /**
+ * @param $content string
+ * @param $headers array
+ */
+ function __construct($content, $headers) {
+ $this->content = $content;
+ $this->headers = $headers;
+ }
+
+ /**
+ * @return string
+ */
+ public function getContent() {
+ return $this->content;
+ }
+
+ /**
+ * @return array
+ */
+ public function getHeaders() {
+ return $this->headers;
+ }
+
+ /**
+ * Query the response for a JQuery compatible CSS selector
+ *
+ * @link https://code.google.com/p/phpquery/wiki/Selectors
+ * @param $selector string
+ * @return phpQueryObject
+ */
+ public function queryHTML($selector){
+ if(is_null($this->pq)) $this->pq = phpQuery::newDocument($this->content);
+ return $this->pq->find($selector);
+ }
+}
diff --git a/_test/core/TestUtils.php b/_test/core/TestUtils.php
new file mode 100644
index 000000000..64de62213
--- /dev/null
+++ b/_test/core/TestUtils.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Helper class with some filesystem utilities.
+ */
+class TestUtils {
+
+ /**
+ * helper for recursive copy()
+ *
+ * @static
+ * @param $destdir string
+ * @param $source string
+ */
+ public static function rcopy($destdir, $source) {
+ if (!is_dir($source)) {
+ copy($source, $destdir.'/'.basename($source));
+ } else {
+ $newdestdir = $destdir.'/'.basename($source);
+ mkdir($newdestdir);
+
+ $dh = dir($source);
+ while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ TestUtils::rcopy($newdestdir, $source.'/'.$entry);
+ }
+ $dh->close();
+ }
+ }
+
+ /**
+ * helper for recursive rmdir()/unlink()
+ *
+ * @static
+ * @param $target string
+ */
+ public static function rdelete($target) {
+ if (!is_dir($target)) {
+ unlink($target);
+ } else {
+ $dh = dir($target);
+ while (false !== ($entry = $dh->read())) {
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ TestUtils::rdelete("$target/$entry");
+ }
+ $dh->close();
+ rmdir($target);
+ }
+ }
+
+ /**
+ * helper to append text to a file
+ *
+ * @static
+ * @param $file string
+ * @param $text string
+ */
+ public static function fappend($file, $text) {
+ $fh = fopen($file, 'a');
+ fwrite($fh, $text);
+ fclose($fh);
+ }
+
+}
diff --git a/_test/core/phpQuery-onefile.php b/_test/core/phpQuery-onefile.php
new file mode 100644
index 000000000..4c1dfa3da
--- /dev/null
+++ b/_test/core/phpQuery-onefile.php
@@ -0,0 +1,5702 @@
+<?php
+/**
+ * phpQuery is a server-side, chainable, CSS3 selector driven
+ * Document Object Model (DOM) API based on jQuery JavaScript Library.
+ *
+ * @version 0.9.5
+ * @link http://code.google.com/p/phpquery/
+ * @link http://phpquery-library.blogspot.com/
+ * @link http://jquery.com/
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @license http://www.opensource.org/licenses/mit-license.php MIT License
+ * @package phpQuery
+ */
+
+// class names for instanceof
+// TODO move them as class constants into phpQuery
+define('DOMDOCUMENT', 'DOMDocument');
+define('DOMELEMENT', 'DOMElement');
+define('DOMNODELIST', 'DOMNodeList');
+define('DOMNODE', 'DOMNode');
+
+/**
+ * DOMEvent class.
+ *
+ * Based on
+ * @link http://developer.mozilla.org/En/DOM:event
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @todo implement ArrayAccess ?
+ */
+class DOMEvent {
+ /**
+ * Returns a boolean indicating whether the event bubbles up through the DOM or not.
+ *
+ * @var unknown_type
+ */
+ public $bubbles = true;
+ /**
+ * Returns a boolean indicating whether the event is cancelable.
+ *
+ * @var unknown_type
+ */
+ public $cancelable = true;
+ /**
+ * Returns a reference to the currently registered target for the event.
+ *
+ * @var unknown_type
+ */
+ public $currentTarget;
+ /**
+ * Returns detail about the event, depending on the type of event.
+ *
+ * @var unknown_type
+ * @link http://developer.mozilla.org/en/DOM/event.detail
+ */
+ public $detail; // ???
+ /**
+ * Used to indicate which phase of the event flow is currently being evaluated.
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ * @link http://developer.mozilla.org/en/DOM/event.eventPhase
+ */
+ public $eventPhase; // ???
+ /**
+ * The explicit original target of the event (Mozilla-specific).
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ */
+ public $explicitOriginalTarget; // moz only
+ /**
+ * The original target of the event, before any retargetings (Mozilla-specific).
+ *
+ * NOT IMPLEMENTED
+ *
+ * @var unknown_type
+ */
+ public $originalTarget; // moz only
+ /**
+ * Identifies a secondary target for the event.
+ *
+ * @var unknown_type
+ */
+ public $relatedTarget;
+ /**
+ * Returns a reference to the target to which the event was originally dispatched.
+ *
+ * @var unknown_type
+ */
+ public $target;
+ /**
+ * Returns the time that the event was created.
+ *
+ * @var unknown_type
+ */
+ public $timeStamp;
+ /**
+ * Returns the name of the event (case-insensitive).
+ */
+ public $type;
+ public $runDefault = true;
+ public $data = null;
+ public function __construct($data) {
+ foreach($data as $k => $v) {
+ $this->$k = $v;
+ }
+ if (! $this->timeStamp)
+ $this->timeStamp = time();
+ }
+ /**
+ * Cancels the event (if it is cancelable).
+ *
+ */
+ public function preventDefault() {
+ $this->runDefault = false;
+ }
+ /**
+ * Stops the propagation of events further along in the DOM.
+ *
+ */
+ public function stopPropagation() {
+ $this->bubbles = false;
+ }
+}
+
+
+/**
+ * DOMDocumentWrapper class simplifies work with DOMDocument.
+ *
+ * Know bug:
+ * - in XHTML fragments, <br /> changes to <br clear="none" />
+ *
+ * @todo check XML catalogs compatibility
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+class DOMDocumentWrapper {
+ /**
+ * @var DOMDocument
+ */
+ public $document;
+ public $id;
+ /**
+ * @todo Rewrite as method and quess if null.
+ * @var unknown_type
+ */
+ public $contentType = '';
+ public $xpath;
+ public $uuid = 0;
+ public $data = array();
+ public $dataNodes = array();
+ public $events = array();
+ public $eventsNodes = array();
+ public $eventsGlobal = array();
+ /**
+ * @TODO iframes support http://code.google.com/p/phpquery/issues/detail?id=28
+ * @var unknown_type
+ */
+ public $frames = array();
+ /**
+ * Document root, by default equals to document itself.
+ * Used by documentFragments.
+ *
+ * @var DOMNode
+ */
+ public $root;
+ public $isDocumentFragment;
+ public $isXML = false;
+ public $isXHTML = false;
+ public $isHTML = false;
+ public $charset;
+ public function __construct($markup = null, $contentType = null, $newDocumentID = null) {
+ if (isset($markup))
+ $this->load($markup, $contentType, $newDocumentID);
+ $this->id = $newDocumentID
+ ? $newDocumentID
+ : md5(microtime());
+ }
+ public function load($markup, $contentType = null, $newDocumentID = null) {
+// phpQuery::$documents[$id] = $this;
+ $this->contentType = strtolower($contentType);
+ if ($markup instanceof DOMDOCUMENT) {
+ $this->document = $markup;
+ $this->root = $this->document;
+ $this->charset = $this->document->encoding;
+ // TODO isDocumentFragment
+ } else {
+ $loaded = $this->loadMarkup($markup);
+ }
+ if ($loaded) {
+// $this->document->formatOutput = true;
+ $this->document->preserveWhiteSpace = true;
+ $this->xpath = new DOMXPath($this->document);
+ $this->afterMarkupLoad();
+ return true;
+ // remember last loaded document
+// return phpQuery::selectDocument($id);
+ }
+ return false;
+ }
+ protected function afterMarkupLoad() {
+ if ($this->isXHTML) {
+ $this->xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml");
+ }
+ }
+ protected function loadMarkup($markup) {
+ $loaded = false;
+ if ($this->contentType) {
+ self::debug("Load markup for content type {$this->contentType}");
+ // content determined by contentType
+ list($contentType, $charset) = $this->contentTypeToArray($this->contentType);
+ switch($contentType) {
+ case 'text/html':
+ phpQuery::debug("Loading HTML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupHTML($markup, $charset);
+ break;
+ case 'text/xml':
+ case 'application/xhtml+xml':
+ phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupXML($markup, $charset);
+ break;
+ default:
+ // for feeds or anything that sometimes doesn't use text/xml
+ if (strpos('xml', $this->contentType) !== false) {
+ phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+ $loaded = $this->loadMarkupXML($markup, $charset);
+ } else
+ phpQuery::debug("Could not determine document type from content type '{$this->contentType}'");
+ }
+ } else {
+ // content type autodetection
+ if ($this->isXML($markup)) {
+ phpQuery::debug("Loading XML, isXML() == true");
+ $loaded = $this->loadMarkupXML($markup);
+ if (! $loaded && $this->isXHTML) {
+ phpQuery::debug('Loading as XML failed, trying to load as HTML, isXHTML == true');
+ $loaded = $this->loadMarkupHTML($markup);
+ }
+ } else {
+ phpQuery::debug("Loading HTML, isXML() == false");
+ $loaded = $this->loadMarkupHTML($markup);
+ }
+ }
+ return $loaded;
+ }
+ protected function loadMarkupReset() {
+ $this->isXML = $this->isXHTML = $this->isHTML = false;
+ }
+ protected function documentCreate($charset, $version = '1.0') {
+ if (! $version)
+ $version = '1.0';
+ $this->document = new DOMDocument($version, $charset);
+ $this->charset = $this->document->encoding;
+// $this->document->encoding = $charset;
+ $this->document->formatOutput = true;
+ $this->document->preserveWhiteSpace = true;
+ }
+ protected function loadMarkupHTML($markup, $requestedCharset = null) {
+ if (phpQuery::$debug)
+ phpQuery::debug('Full markup load (HTML): '.substr($markup, 0, 250));
+ $this->loadMarkupReset();
+ $this->isHTML = true;
+ if (!isset($this->isDocumentFragment))
+ $this->isDocumentFragment = self::isDocumentFragmentHTML($markup);
+ $charset = null;
+ $documentCharset = $this->charsetFromHTML($markup);
+ $addDocumentCharset = false;
+ if ($documentCharset) {
+ $charset = $documentCharset;
+ $markup = $this->charsetFixHTML($markup);
+ } else if ($requestedCharset) {
+ $charset = $requestedCharset;
+ }
+ if (! $charset)
+ $charset = phpQuery::$defaultCharset;
+ // HTTP 1.1 says that the default charset is ISO-8859-1
+ // @see http://www.w3.org/International/O-HTTP-charset
+ if (! $documentCharset) {
+ $documentCharset = 'ISO-8859-1';
+ $addDocumentCharset = true;
+ }
+ // Should be careful here, still need 'magic encoding detection' since lots of pages have other 'default encoding'
+ // Worse, some pages can have mixed encodings... we'll try not to worry about that
+ $requestedCharset = strtoupper($requestedCharset);
+ $documentCharset = strtoupper($documentCharset);
+ phpQuery::debug("DOC: $documentCharset REQ: $requestedCharset");
+ if ($requestedCharset && $documentCharset && $requestedCharset !== $documentCharset) {
+ phpQuery::debug("CHARSET CONVERT");
+ // Document Encoding Conversion
+ // http://code.google.com/p/phpquery/issues/detail?id=86
+ if (function_exists('mb_detect_encoding')) {
+ $possibleCharsets = array($documentCharset, $requestedCharset, 'AUTO');
+ $docEncoding = mb_detect_encoding($markup, implode(', ', $possibleCharsets));
+ if (! $docEncoding)
+ $docEncoding = $documentCharset; // ok trust the document
+ phpQuery::debug("DETECTED '$docEncoding'");
+ // Detected does not match what document says...
+ if ($docEncoding !== $documentCharset) {
+ // Tricky..
+ }
+ if ($docEncoding !== $requestedCharset) {
+ phpQuery::debug("CONVERT $docEncoding => $requestedCharset");
+ $markup = mb_convert_encoding($markup, $requestedCharset, $docEncoding);
+ $markup = $this->charsetAppendToHTML($markup, $requestedCharset);
+ $charset = $requestedCharset;
+ }
+ } else {
+ phpQuery::debug("TODO: charset conversion without mbstring...");
+ }
+ }
+ $return = false;
+ if ($this->isDocumentFragment) {
+ phpQuery::debug("Full markup load (HTML), DocumentFragment detected, using charset '$charset'");
+ $return = $this->documentFragmentLoadMarkup($this, $charset, $markup);
+ } else {
+ if ($addDocumentCharset) {
+ phpQuery::debug("Full markup load (HTML), appending charset: '$charset'");
+ $markup = $this->charsetAppendToHTML($markup, $charset);
+ }
+ phpQuery::debug("Full markup load (HTML), documentCreate('$charset')");
+ $this->documentCreate($charset);
+ $return = phpQuery::$debug === 2
+ ? $this->document->loadHTML($markup)
+ : @$this->document->loadHTML($markup);
+ if ($return)
+ $this->root = $this->document;
+ }
+ if ($return && ! $this->contentType)
+ $this->contentType = 'text/html';
+ return $return;
+ }
+ protected function loadMarkupXML($markup, $requestedCharset = null) {
+ if (phpQuery::$debug)
+ phpQuery::debug('Full markup load (XML): '.substr($markup, 0, 250));
+ $this->loadMarkupReset();
+ $this->isXML = true;
+ // check agains XHTML in contentType or markup
+ $isContentTypeXHTML = $this->isXHTML();
+ $isMarkupXHTML = $this->isXHTML($markup);
+ if ($isContentTypeXHTML || $isMarkupXHTML) {
+ self::debug('Full markup load (XML), XHTML detected');
+ $this->isXHTML = true;
+ }
+ // determine document fragment
+ if (! isset($this->isDocumentFragment))
+ $this->isDocumentFragment = $this->isXHTML
+ ? self::isDocumentFragmentXHTML($markup)
+ : self::isDocumentFragmentXML($markup);
+ // this charset will be used
+ $charset = null;
+ // charset from XML declaration @var string
+ $documentCharset = $this->charsetFromXML($markup);
+ if (! $documentCharset) {
+ if ($this->isXHTML) {
+ // this is XHTML, try to get charset from content-type meta header
+ $documentCharset = $this->charsetFromHTML($markup);
+ if ($documentCharset) {
+ phpQuery::debug("Full markup load (XML), appending XHTML charset '$documentCharset'");
+ $this->charsetAppendToXML($markup, $documentCharset);
+ $charset = $documentCharset;
+ }
+ }
+ if (! $documentCharset) {
+ // if still no document charset...
+ $charset = $requestedCharset;
+ }
+ } else if ($requestedCharset) {
+ $charset = $requestedCharset;
+ }
+ if (! $charset) {
+ $charset = phpQuery::$defaultCharset;
+ }
+ if ($requestedCharset && $documentCharset && $requestedCharset != $documentCharset) {
+ // TODO place for charset conversion
+// $charset = $requestedCharset;
+ }
+ $return = false;
+ if ($this->isDocumentFragment) {
+ phpQuery::debug("Full markup load (XML), DocumentFragment detected, using charset '$charset'");
+ $return = $this->documentFragmentLoadMarkup($this, $charset, $markup);
+ } else {
+ // FIXME ???
+ if ($isContentTypeXHTML && ! $isMarkupXHTML)
+ if (! $documentCharset) {
+ phpQuery::debug("Full markup load (XML), appending charset '$charset'");
+ $markup = $this->charsetAppendToXML($markup, $charset);
+ }
+ // see http://pl2.php.net/manual/en/book.dom.php#78929
+ // LIBXML_DTDLOAD (>= PHP 5.1)
+ // does XML ctalogues works with LIBXML_NONET
+ // $this->document->resolveExternals = true;
+ // TODO test LIBXML_COMPACT for performance improvement
+ // create document
+ $this->documentCreate($charset);
+ if (phpversion() < 5.1) {
+ $this->document->resolveExternals = true;
+ $return = phpQuery::$debug === 2
+ ? $this->document->loadXML($markup)
+ : @$this->document->loadXML($markup);
+ } else {
+ /** @link http://pl2.php.net/manual/en/libxml.constants.php */
+ $libxmlStatic = phpQuery::$debug === 2
+ ? LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET
+ : LIBXML_DTDLOAD|LIBXML_DTDATTR|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOERROR;
+ $return = $this->document->loadXML($markup, $libxmlStatic);
+// if (! $return)
+// $return = $this->document->loadHTML($markup);
+ }
+ if ($return)
+ $this->root = $this->document;
+ }
+ if ($return) {
+ if (! $this->contentType) {
+ if ($this->isXHTML)
+ $this->contentType = 'application/xhtml+xml';
+ else
+ $this->contentType = 'text/xml';
+ }
+ return $return;
+ } else {
+ throw new Exception("Error loading XML markup");
+ }
+ }
+ protected function isXHTML($markup = null) {
+ if (! isset($markup)) {
+ return strpos($this->contentType, 'xhtml') !== false;
+ }
+ // XXX ok ?
+ return strpos($markup, "<!DOCTYPE html") !== false;
+// return stripos($doctype, 'xhtml') !== false;
+// $doctype = isset($dom->doctype) && is_object($dom->doctype)
+// ? $dom->doctype->publicId
+// : self::$defaultDoctype;
+ }
+ protected function isXML($markup) {
+// return strpos($markup, '<?xml') !== false && stripos($markup, 'xhtml') === false;
+ return strpos(substr($markup, 0, 100), '<'.'?xml') !== false;
+ }
+ protected function contentTypeToArray($contentType) {
+ $matches = explode(';', trim(strtolower($contentType)));
+ if (isset($matches[1])) {
+ $matches[1] = explode('=', $matches[1]);
+ // strip 'charset='
+ $matches[1] = isset($matches[1][1]) && trim($matches[1][1])
+ ? $matches[1][1]
+ : $matches[1][0];
+ } else
+ $matches[1] = null;
+ return $matches;
+ }
+ /**
+ *
+ * @param $markup
+ * @return array contentType, charset
+ */
+ protected function contentTypeFromHTML($markup) {
+ $matches = array();
+ // find meta tag
+ preg_match('@<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i',
+ $markup, $matches
+ );
+ if (! isset($matches[0]))
+ return array(null, null);
+ // get attr 'content'
+ preg_match('@content\\s*=\\s*(["|\'])(.+?)\\1@', $matches[0], $matches);
+ if (! isset($matches[0]))
+ return array(null, null);
+ return $this->contentTypeToArray($matches[2]);
+ }
+ protected function charsetFromHTML($markup) {
+ $contentType = $this->contentTypeFromHTML($markup);
+ return $contentType[1];
+ }
+ protected function charsetFromXML($markup) {
+ $matches;
+ // find declaration
+ preg_match('@<'.'?xml[^>]+encoding\\s*=\\s*(["|\'])(.*?)\\1@i',
+ $markup, $matches
+ );
+ return isset($matches[2])
+ ? strtolower($matches[2])
+ : null;
+ }
+ /**
+ * Repositions meta[type=charset] at the start of head. Bypasses DOMDocument bug.
+ *
+ * @link http://code.google.com/p/phpquery/issues/detail?id=80
+ * @param $html
+ */
+ protected function charsetFixHTML($markup) {
+ $matches = array();
+ // find meta tag
+ preg_match('@\s*<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i',
+ $markup, $matches, PREG_OFFSET_CAPTURE
+ );
+ if (! isset($matches[0]))
+ return;
+ $metaContentType = $matches[0][0];
+ $markup = substr($markup, 0, $matches[0][1])
+ .substr($markup, $matches[0][1]+strlen($metaContentType));
+ $headStart = stripos($markup, '<head>');
+ $markup = substr($markup, 0, $headStart+6).$metaContentType
+ .substr($markup, $headStart+6);
+ return $markup;
+ }
+ protected function charsetAppendToHTML($html, $charset, $xhtml = false) {
+ // remove existing meta[type=content-type]
+ $html = preg_replace('@\s*<meta[^>]+http-equiv\\s*=\\s*(["|\'])Content-Type\\1([^>]+?)>@i', '', $html);
+ $meta = '<meta http-equiv="Content-Type" content="text/html;charset='
+ .$charset.'" '
+ .($xhtml ? '/' : '')
+ .'>';
+ if (strpos($html, '<head') === false) {
+ if (strpos($hltml, '<html') === false) {
+ return $meta.$html;
+ } else {
+ return preg_replace(
+ '@<html(.*?)(?(?<!\?)>)@s',
+ "<html\\1><head>{$meta}</head>",
+ $html
+ );
+ }
+ } else {
+ return preg_replace(
+ '@<head(.*?)(?(?<!\?)>)@s',
+ '<head\\1>'.$meta,
+ $html
+ );
+ }
+ }
+ protected function charsetAppendToXML($markup, $charset) {
+ $declaration = '<'.'?xml version="1.0" encoding="'.$charset.'"?'.'>';
+ return $declaration.$markup;
+ }
+ public static function isDocumentFragmentHTML($markup) {
+ return stripos($markup, '<html') === false && stripos($markup, '<!doctype') === false;
+ }
+ public static function isDocumentFragmentXML($markup) {
+ return stripos($markup, '<'.'?xml') === false;
+ }
+ public static function isDocumentFragmentXHTML($markup) {
+ return self::isDocumentFragmentHTML($markup);
+ }
+ public function importAttr($value) {
+ // TODO
+ }
+ /**
+ *
+ * @param $source
+ * @param $target
+ * @param $sourceCharset
+ * @return array Array of imported nodes.
+ */
+ public function import($source, $sourceCharset = null) {
+ // TODO charset conversions
+ $return = array();
+ if ($source instanceof DOMNODE && !($source instanceof DOMNODELIST))
+ $source = array($source);
+// if (is_array($source)) {
+// foreach($source as $node) {
+// if (is_string($node)) {
+// // string markup
+// $fake = $this->documentFragmentCreate($node, $sourceCharset);
+// if ($fake === false)
+// throw new Exception("Error loading documentFragment markup");
+// else
+// $return = array_merge($return,
+// $this->import($fake->root->childNodes)
+// );
+// } else {
+// $return[] = $this->document->importNode($node, true);
+// }
+// }
+// return $return;
+// } else {
+// // string markup
+// $fake = $this->documentFragmentCreate($source, $sourceCharset);
+// if ($fake === false)
+// throw new Exception("Error loading documentFragment markup");
+// else
+// return $this->import($fake->root->childNodes);
+// }
+ if (is_array($source) || $source instanceof DOMNODELIST) {
+ // dom nodes
+ self::debug('Importing nodes to document');
+ foreach($source as $node)
+ $return[] = $this->document->importNode($node, true);
+ } else {
+ // string markup
+ $fake = $this->documentFragmentCreate($source, $sourceCharset);
+ if ($fake === false)
+ throw new Exception("Error loading documentFragment markup");
+ else
+ return $this->import($fake->root->childNodes);
+ }
+ return $return;
+ }
+ /**
+ * Creates new document fragment.
+ *
+ * @param $source
+ * @return DOMDocumentWrapper
+ */
+ protected function documentFragmentCreate($source, $charset = null) {
+ $fake = new DOMDocumentWrapper();
+ $fake->contentType = $this->contentType;
+ $fake->isXML = $this->isXML;
+ $fake->isHTML = $this->isHTML;
+ $fake->isXHTML = $this->isXHTML;
+ $fake->root = $fake->document;
+ if (! $charset)
+ $charset = $this->charset;
+// $fake->documentCreate($this->charset);
+ if ($source instanceof DOMNODE && !($source instanceof DOMNODELIST))
+ $source = array($source);
+ if (is_array($source) || $source instanceof DOMNODELIST) {
+ // dom nodes
+ // load fake document
+ if (! $this->documentFragmentLoadMarkup($fake, $charset))
+ return false;
+ $nodes = $fake->import($source);
+ foreach($nodes as $node)
+ $fake->root->appendChild($node);
+ } else {
+ // string markup
+ $this->documentFragmentLoadMarkup($fake, $charset, $source);
+ }
+ return $fake;
+ }
+ /**
+ *
+ * @param $document DOMDocumentWrapper
+ * @param $markup
+ * @return $document
+ */
+ private function documentFragmentLoadMarkup($fragment, $charset, $markup = null) {
+ // TODO error handling
+ // TODO copy doctype
+ // tempolary turn off
+ $fragment->isDocumentFragment = false;
+ if ($fragment->isXML) {
+ if ($fragment->isXHTML) {
+ // add FAKE element to set default namespace
+ $fragment->loadMarkupXML('<?xml version="1.0" encoding="'.$charset.'"?>'
+ .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" '
+ .'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
+ .'<fake xmlns="http://www.w3.org/1999/xhtml">'.$markup.'</fake>');
+ $fragment->root = $fragment->document->firstChild->nextSibling;
+ } else {
+ $fragment->loadMarkupXML('<?xml version="1.0" encoding="'.$charset.'"?><fake>'.$markup.'</fake>');
+ $fragment->root = $fragment->document->firstChild;
+ }
+ } else {
+ $markup2 = phpQuery::$defaultDoctype.'<html><head><meta http-equiv="Content-Type" content="text/html;charset='
+ .$charset.'"></head>';
+ $noBody = strpos($markup, '<body') === false;
+ if ($noBody)
+ $markup2 .= '<body>';
+ $markup2 .= $markup;
+ if ($noBody)
+ $markup2 .= '</body>';
+ $markup2 .= '</html>';
+ $fragment->loadMarkupHTML($markup2);
+ // TODO resolv body tag merging issue
+ $fragment->root = $noBody
+ ? $fragment->document->firstChild->nextSibling->firstChild->nextSibling
+ : $fragment->document->firstChild->nextSibling->firstChild->nextSibling;
+ }
+ if (! $fragment->root)
+ return false;
+ $fragment->isDocumentFragment = true;
+ return true;
+ }
+ protected function documentFragmentToMarkup($fragment) {
+ phpQuery::debug('documentFragmentToMarkup');
+ $tmp = $fragment->isDocumentFragment;
+ $fragment->isDocumentFragment = false;
+ $markup = $fragment->markup();
+ if ($fragment->isXML) {
+ $markup = substr($markup, 0, strrpos($markup, '</fake>'));
+ if ($fragment->isXHTML) {
+ $markup = substr($markup, strpos($markup, '<fake')+43);
+ } else {
+ $markup = substr($markup, strpos($markup, '<fake>')+6);
+ }
+ } else {
+ $markup = substr($markup, strpos($markup, '<body>')+6);
+ $markup = substr($markup, 0, strrpos($markup, '</body>'));
+ }
+ $fragment->isDocumentFragment = $tmp;
+ if (phpQuery::$debug)
+ phpQuery::debug('documentFragmentToMarkup: '.substr($markup, 0, 150));
+ return $markup;
+ }
+ /**
+ * Return document markup, starting with optional $nodes as root.
+ *
+ * @param $nodes DOMNode|DOMNodeList
+ * @return string
+ */
+ public function markup($nodes = null, $innerMarkup = false) {
+ if (isset($nodes) && count($nodes) == 1 && $nodes[0] instanceof DOMDOCUMENT)
+ $nodes = null;
+ if (isset($nodes)) {
+ $markup = '';
+ if (!is_array($nodes) && !($nodes instanceof DOMNODELIST) )
+ $nodes = array($nodes);
+ if ($this->isDocumentFragment && ! $innerMarkup)
+ foreach($nodes as $i => $node)
+ if ($node->isSameNode($this->root)) {
+ // var_dump($node);
+ $nodes = array_slice($nodes, 0, $i)
+ + phpQuery::DOMNodeListToArray($node->childNodes)
+ + array_slice($nodes, $i+1);
+ }
+ if ($this->isXML && ! $innerMarkup) {
+ self::debug("Getting outerXML with charset '{$this->charset}'");
+ // we need outerXML, so we can benefit from
+ // $node param support in saveXML()
+ foreach($nodes as $node)
+ $markup .= $this->document->saveXML($node);
+ } else {
+ $loop = array();
+ if ($innerMarkup)
+ foreach($nodes as $node) {
+ if ($node->childNodes)
+ foreach($node->childNodes as $child)
+ $loop[] = $child;
+ else
+ $loop[] = $node;
+ }
+ else
+ $loop = $nodes;
+ self::debug("Getting markup, moving selected nodes (".count($loop).") to new DocumentFragment");
+ $fake = $this->documentFragmentCreate($loop);
+ $markup = $this->documentFragmentToMarkup($fake);
+ }
+ if ($this->isXHTML) {
+ self::debug("Fixing XHTML");
+ $markup = self::markupFixXHTML($markup);
+ }
+ self::debug("Markup: ".substr($markup, 0, 250));
+ return $markup;
+ } else {
+ if ($this->isDocumentFragment) {
+ // documentFragment, html only...
+ self::debug("Getting markup, DocumentFragment detected");
+// return $this->markup(
+//// $this->document->getElementsByTagName('body')->item(0)
+// $this->document->root, true
+// );
+ $markup = $this->documentFragmentToMarkup($this);
+ // no need for markupFixXHTML, as it's done thought markup($nodes) method
+ return $markup;
+ } else {
+ self::debug("Getting markup (".($this->isXML?'XML':'HTML')."), final with charset '{$this->charset}'");
+ $markup = $this->isXML
+ ? $this->document->saveXML()
+ : $this->document->saveHTML();
+ if ($this->isXHTML) {
+ self::debug("Fixing XHTML");
+ $markup = self::markupFixXHTML($markup);
+ }
+ self::debug("Markup: ".substr($markup, 0, 250));
+ return $markup;
+ }
+ }
+ }
+ protected static function markupFixXHTML($markup) {
+ $markup = self::expandEmptyTag('script', $markup);
+ $markup = self::expandEmptyTag('select', $markup);
+ $markup = self::expandEmptyTag('textarea', $markup);
+ return $markup;
+ }
+ public static function debug($text) {
+ phpQuery::debug($text);
+ }
+ /**
+ * expandEmptyTag
+ *
+ * @param $tag
+ * @param $xml
+ * @return unknown_type
+ * @author mjaque at ilkebenson dot com
+ * @link http://php.net/manual/en/domdocument.savehtml.php#81256
+ */
+ public static function expandEmptyTag($tag, $xml){
+ $indice = 0;
+ while ($indice< strlen($xml)){
+ $pos = strpos($xml, "<$tag ", $indice);
+ if ($pos){
+ $posCierre = strpos($xml, ">", $pos);
+ if ($xml[$posCierre-1] == "/"){
+ $xml = substr_replace($xml, "></$tag>", $posCierre-1, 2);
+ }
+ $indice = $posCierre;
+ }
+ else break;
+ }
+ return $xml;
+ }
+}
+
+/**
+ * Event handling class.
+ *
+ * @author Tobiasz Cudnik
+ * @package phpQuery
+ * @static
+ */
+abstract class phpQueryEvents {
+ /**
+ * Trigger a type of event on every matched element.
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $data
+ *
+ * @TODO exclusive events (with !)
+ * @TODO global events (test)
+ * @TODO support more than event in $type (space-separated)
+ */
+ public static function trigger($document, $type, $data = array(), $node = null) {
+ // trigger: function(type, data, elem, donative, extra) {
+ $documentID = phpQuery::getDocumentID($document);
+ $namespace = null;
+ if (strpos($type, '.') !== false)
+ list($name, $namespace) = explode('.', $type);
+ else
+ $name = $type;
+ if (! $node) {
+ if (self::issetGlobal($documentID, $type)) {
+ $pq = phpQuery::getDocument($documentID);
+ // TODO check add($pq->document)
+ $pq->find('*')->add($pq->document)
+ ->trigger($type, $data);
+ }
+ } else {
+ if (isset($data[0]) && $data[0] instanceof DOMEvent) {
+ $event = $data[0];
+ $event->relatedTarget = $event->target;
+ $event->target = $node;
+ $data = array_slice($data, 1);
+ } else {
+ $event = new DOMEvent(array(
+ 'type' => $type,
+ 'target' => $node,
+ 'timeStamp' => time(),
+ ));
+ }
+ $i = 0;
+ while($node) {
+ // TODO whois
+ phpQuery::debug("Triggering ".($i?"bubbled ":'')."event '{$type}' on "
+ ."node \n");//.phpQueryObject::whois($node)."\n");
+ $event->currentTarget = $node;
+ $eventNode = self::getNode($documentID, $node);
+ if (isset($eventNode->eventHandlers)) {
+ foreach($eventNode->eventHandlers as $eventType => $handlers) {
+ $eventNamespace = null;
+ if (strpos($type, '.') !== false)
+ list($eventName, $eventNamespace) = explode('.', $eventType);
+ else
+ $eventName = $eventType;
+ if ($name != $eventName)
+ continue;
+ if ($namespace && $eventNamespace && $namespace != $eventNamespace)
+ continue;
+ foreach($handlers as $handler) {
+ phpQuery::debug("Calling event handler\n");
+ $event->data = $handler['data']
+ ? $handler['data']
+ : null;
+ $params = array_merge(array($event), $data);
+ $return = phpQuery::callbackRun($handler['callback'], $params);
+ if ($return === false) {
+ $event->bubbles = false;
+ }
+ }
+ }
+ }
+ // to bubble or not to bubble...
+ if (! $event->bubbles)
+ break;
+ $node = $node->parentNode;
+ $i++;
+ }
+ }
+ }
+ /**
+ * Binds a handler to one or more events (like click) for each matched element.
+ * Can also bind custom events.
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $data Optional
+ * @param unknown_type $callback
+ *
+ * @TODO support '!' (exclusive) events
+ * @TODO support more than event in $type (space-separated)
+ * @TODO support binding to global events
+ */
+ public static function add($document, $node, $type, $data, $callback = null) {
+ phpQuery::debug("Binding '$type' event");
+ $documentID = phpQuery::getDocumentID($document);
+// if (is_null($callback) && is_callable($data)) {
+// $callback = $data;
+// $data = null;
+// }
+ $eventNode = self::getNode($documentID, $node);
+ if (! $eventNode)
+ $eventNode = self::setNode($documentID, $node);
+ if (!isset($eventNode->eventHandlers[$type]))
+ $eventNode->eventHandlers[$type] = array();
+ $eventNode->eventHandlers[$type][] = array(
+ 'callback' => $callback,
+ 'data' => $data,
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @param DOMNode|phpQueryObject|string $document
+ * @param unknown_type $type
+ * @param unknown_type $callback
+ *
+ * @TODO namespace events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public static function remove($document, $node, $type = null, $callback = null) {
+ $documentID = phpQuery::getDocumentID($document);
+ $eventNode = self::getNode($documentID, $node);
+ if (is_object($eventNode) && isset($eventNode->eventHandlers[$type])) {
+ if ($callback) {
+ foreach($eventNode->eventHandlers[$type] as $k => $handler)
+ if ($handler['callback'] == $callback)
+ unset($eventNode->eventHandlers[$type][$k]);
+ } else {
+ unset($eventNode->eventHandlers[$type]);
+ }
+ }
+ }
+ protected static function getNode($documentID, $node) {
+ foreach(phpQuery::$documents[$documentID]->eventsNodes as $eventNode) {
+ if ($node->isSameNode($eventNode))
+ return $eventNode;
+ }
+ }
+ protected static function setNode($documentID, $node) {
+ phpQuery::$documents[$documentID]->eventsNodes[] = $node;
+ return phpQuery::$documents[$documentID]->eventsNodes[
+ count(phpQuery::$documents[$documentID]->eventsNodes)-1
+ ];
+ }
+ protected static function issetGlobal($documentID, $type) {
+ return isset(phpQuery::$documents[$documentID])
+ ? in_array($type, phpQuery::$documents[$documentID]->eventsGlobal)
+ : false;
+ }
+}
+
+
+interface ICallbackNamed {
+ function hasName();
+ function getName();
+}
+/**
+ * Callback class introduces currying-like pattern.
+ *
+ * Example:
+ * function foo($param1, $param2, $param3) {
+ * var_dump($param1, $param2, $param3);
+ * }
+ * $fooCurried = new Callback('foo',
+ * 'param1 is now statically set',
+ * new CallbackParam, new CallbackParam
+ * );
+ * phpQuery::callbackRun($fooCurried,
+ * array('param2 value', 'param3 value'
+ * );
+ *
+ * Callback class is supported in all phpQuery methods which accepts callbacks.
+ *
+ * @link http://code.google.com/p/phpquery/wiki/Callbacks#Param_Structures
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ *
+ * @TODO??? return fake forwarding function created via create_function
+ * @TODO honor paramStructure
+ */
+class Callback
+ implements ICallbackNamed {
+ public $callback = null;
+ public $params = null;
+ protected $name;
+ public function __construct($callback, $param1 = null, $param2 = null,
+ $param3 = null) {
+ $params = func_get_args();
+ $params = array_slice($params, 1);
+ if ($callback instanceof Callback) {
+ // TODO implement recurention
+ } else {
+ $this->callback = $callback;
+ $this->params = $params;
+ }
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+ public function setName($name) {
+ $this->name = $name;
+ return $this;
+ }
+ // TODO test me
+// public function addParams() {
+// $params = func_get_args();
+// return new Callback($this->callback, $this->params+$params);
+// }
+}
+/**
+ * Shorthand for new Callback(create_function(...), ...);
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackBody extends Callback {
+ public function __construct($paramList, $code, $param1 = null, $param2 = null,
+ $param3 = null) {
+ $params = func_get_args();
+ $params = array_slice($params, 2);
+ $this->callback = create_function($paramList, $code);
+ $this->params = $params;
+ }
+}
+/**
+ * Callback type which on execution returns reference passed during creation.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackReturnReference extends Callback
+ implements ICallbackNamed {
+ protected $reference;
+ public function __construct(&$reference, $name = null){
+ $this->reference =& $reference;
+ $this->callback = array($this, 'callback');
+ }
+ public function callback() {
+ return $this->reference;
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+}
+/**
+ * Callback type which on execution returns value passed during creation.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackReturnValue extends Callback
+ implements ICallbackNamed {
+ protected $value;
+ protected $name;
+ public function __construct($value, $name = null){
+ $this->value =& $value;
+ $this->name = $name;
+ $this->callback = array($this, 'callback');
+ }
+ public function callback() {
+ return $this->value;
+ }
+ public function __toString() {
+ return $this->getName();
+ }
+ public function getName() {
+ return 'Callback: '.$this->name;
+ }
+ public function hasName() {
+ return isset($this->name) && $this->name;
+ }
+}
+/**
+ * CallbackParameterToReference can be used when we don't really want a callback,
+ * only parameter passed to it. CallbackParameterToReference takes first
+ * parameter's value and passes it to reference.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ */
+class CallbackParameterToReference extends Callback {
+ /**
+ * @param $reference
+ * @TODO implement $paramIndex;
+ * param index choose which callback param will be passed to reference
+ */
+ public function __construct(&$reference){
+ $this->callback =& $reference;
+ }
+}
+//class CallbackReference extends Callback {
+// /**
+// *
+// * @param $reference
+// * @param $paramIndex
+// * @todo implement $paramIndex; param index choose which callback param will be passed to reference
+// */
+// public function __construct(&$reference, $name = null){
+// $this->callback =& $reference;
+// }
+//}
+class CallbackParam {}
+
+/**
+ * Class representing phpQuery objects.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @method phpQueryObject clone() clone()
+ * @method phpQueryObject empty() empty()
+ * @method phpQueryObject next() next($selector = null)
+ * @method phpQueryObject prev() prev($selector = null)
+ * @property Int $length
+ */
+class phpQueryObject
+ implements Iterator, Countable, ArrayAccess {
+ public $documentID = null;
+ /**
+ * DOMDocument class.
+ *
+ * @var DOMDocument
+ */
+ public $document = null;
+ public $charset = null;
+ /**
+ *
+ * @var DOMDocumentWrapper
+ */
+ public $documentWrapper = null;
+ /**
+ * XPath interface.
+ *
+ * @var DOMXPath
+ */
+ public $xpath = null;
+ /**
+ * Stack of selected elements.
+ * @TODO refactor to ->nodes
+ * @var array
+ */
+ public $elements = array();
+ /**
+ * @access private
+ */
+ protected $elementsBackup = array();
+ /**
+ * @access private
+ */
+ protected $previous = null;
+ /**
+ * @access private
+ * @TODO deprecate
+ */
+ protected $root = array();
+ /**
+ * Indicated if doument is just a fragment (no <html> tag).
+ *
+ * Every document is realy a full document, so even documentFragments can
+ * be queried against <html>, but getDocument(id)->htmlOuter() will return
+ * only contents of <body>.
+ *
+ * @var bool
+ */
+ public $documentFragment = true;
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $elementsInterator = array();
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $valid = false;
+ /**
+ * Iterator interface helper
+ * @access private
+ */
+ protected $current = null;
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function __construct($documentID) {
+// if ($documentID instanceof self)
+// var_dump($documentID->getDocumentID());
+ $id = $documentID instanceof self
+ ? $documentID->getDocumentID()
+ : $documentID;
+// var_dump($id);
+ if (! isset(phpQuery::$documents[$id] )) {
+// var_dump(phpQuery::$documents);
+ throw new Exception("Document with ID '{$id}' isn't loaded. Use phpQuery::newDocument(\$html) or phpQuery::newDocumentFile(\$file) first.");
+ }
+ $this->documentID = $id;
+ $this->documentWrapper =& phpQuery::$documents[$id];
+ $this->document =& $this->documentWrapper->document;
+ $this->xpath =& $this->documentWrapper->xpath;
+ $this->charset =& $this->documentWrapper->charset;
+ $this->documentFragment =& $this->documentWrapper->isDocumentFragment;
+ // TODO check $this->DOM->documentElement;
+// $this->root = $this->document->documentElement;
+ $this->root =& $this->documentWrapper->root;
+// $this->toRoot();
+ $this->elements = array($this->root);
+ }
+ /**
+ *
+ * @access private
+ * @param $attr
+ * @return unknown_type
+ */
+ public function __get($attr) {
+ switch($attr) {
+ // FIXME doesnt work at all ?
+ case 'length':
+ return $this->size();
+ break;
+ default:
+ return $this->$attr;
+ }
+ }
+ /**
+ * Saves actual object to $var by reference.
+ * Useful when need to break chain.
+ * @param phpQueryObject $var
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toReference(&$var) {
+ return $var = $this;
+ }
+ public function documentFragment($state = null) {
+ if ($state) {
+ phpQuery::$documents[$this->getDocumentID()]['documentFragment'] = $state;
+ return $this;
+ }
+ return $this->documentFragment;
+ }
+ /**
+ * @access private
+ * @TODO documentWrapper
+ */
+ protected function isRoot( $node) {
+// return $node instanceof DOMDOCUMENT || $node->tagName == 'html';
+ return $node instanceof DOMDOCUMENT
+ || ($node instanceof DOMELEMENT && $node->tagName == 'html')
+ || $this->root->isSameNode($node);
+ }
+ /**
+ * @access private
+ */
+ protected function stackIsRoot() {
+ return $this->size() == 1 && $this->isRoot($this->elements[0]);
+ }
+ /**
+ * Enter description here...
+ * NON JQUERY METHOD
+ *
+ * Watch out, it doesn't creates new instance, can be reverted with end().
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toRoot() {
+ $this->elements = array($this->root);
+ return $this;
+// return $this->newInstance(array($this->root));
+ }
+ /**
+ * Saves object's DocumentID to $var by reference.
+ * <code>
+ * $myDocumentId;
+ * phpQuery::newDocument('<div/>')
+ * ->getDocumentIDRef($myDocumentId)
+ * ->find('div')->...
+ * </code>
+ *
+ * @param unknown_type $domId
+ * @see phpQuery::newDocument
+ * @see phpQuery::newDocumentFile
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentIDRef(&$documentID) {
+ $documentID = $this->getDocumentID();
+ return $this;
+ }
+ /**
+ * Returns object with stack set to document root.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocument() {
+ return phpQuery::getDocument($this->getDocumentID());
+ }
+ /**
+ *
+ * @return DOMDocument
+ */
+ public function getDOMDocument() {
+ return $this->document;
+ }
+ /**
+ * Get object's Document ID.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function getDocumentID() {
+ return $this->documentID;
+ }
+ /**
+ * Unloads whole document from memory.
+ * CAUTION! None further operations will be possible on this document.
+ * All objects refering to it will be useless.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function unloadDocument() {
+ phpQuery::unloadDocuments($this->getDocumentID());
+ }
+ public function isHTML() {
+ return $this->documentWrapper->isHTML;
+ }
+ public function isXHTML() {
+ return $this->documentWrapper->isXHTML;
+ }
+ public function isXML() {
+ return $this->documentWrapper->isXML;
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serialize
+ * @return string
+ */
+ public function serialize() {
+ return phpQuery::param($this->serializeArray());
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/serializeArray
+ * @return array
+ */
+ public function serializeArray($submit = null) {
+ $source = $this->filter('form, input, select, textarea')
+ ->find('input, select, textarea')
+ ->andSelf()
+ ->not('form');
+ $return = array();
+// $source->dumpDie();
+ foreach($source as $input) {
+ $input = phpQuery::pq($input);
+ if ($input->is('[disabled]'))
+ continue;
+ if (!$input->is('[name]'))
+ continue;
+ if ($input->is('[type=checkbox]') && !$input->is('[checked]'))
+ continue;
+ // jquery diff
+ if ($submit && $input->is('[type=submit]')) {
+ if ($submit instanceof DOMELEMENT && ! $input->elements[0]->isSameNode($submit))
+ continue;
+ else if (is_string($submit) && $input->attr('name') != $submit)
+ continue;
+ }
+ $return[] = array(
+ 'name' => $input->attr('name'),
+ 'value' => $input->val(),
+ );
+ }
+ return $return;
+ }
+ /**
+ * @access private
+ */
+ protected function debug($in) {
+ if (! phpQuery::$debug )
+ return;
+ print('<pre>');
+ print_r($in);
+ // file debug
+// file_put_contents(dirname(__FILE__).'/phpQuery.log', print_r($in, true)."\n", FILE_APPEND);
+ // quite handy debug trace
+// if ( is_array($in))
+// print_r(array_slice(debug_backtrace(), 3));
+ print("</pre>\n");
+ }
+ /**
+ * @access private
+ */
+ protected function isRegexp($pattern) {
+ return in_array(
+ $pattern[ mb_strlen($pattern)-1 ],
+ array('^','*','$')
+ );
+ }
+ /**
+ * Determines if $char is really a char.
+ *
+ * @param string $char
+ * @return bool
+ * @todo rewrite me to charcode range ! ;)
+ * @access private
+ */
+ protected function isChar($char) {
+ return extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_eregi('\w', $char)
+ : preg_match('@\w@', $char);
+ }
+ /**
+ * @access private
+ */
+ protected function parseSelector($query) {
+ // clean spaces
+ // TODO include this inside parsing ?
+ $query = trim(
+ preg_replace('@\s+@', ' ',
+ preg_replace('@\s*(>|\\+|~)\s*@', '\\1', $query)
+ )
+ );
+ $queries = array(array());
+ if (! $query)
+ return $queries;
+ $return =& $queries[0];
+ $specialChars = array('>',' ');
+// $specialCharsMapping = array('/' => '>');
+ $specialCharsMapping = array();
+ $strlen = mb_strlen($query);
+ $classChars = array('.', '-');
+ $pseudoChars = array('-');
+ $tagChars = array('*', '|', '-');
+ // split multibyte string
+ // http://code.google.com/p/phpquery/issues/detail?id=76
+ $_query = array();
+ for ($i=0; $i<$strlen; $i++)
+ $_query[] = mb_substr($query, $i, 1);
+ $query = $_query;
+ // it works, but i dont like it...
+ $i = 0;
+ while( $i < $strlen) {
+ $c = $query[$i];
+ $tmp = '';
+ // TAG
+ if ($this->isChar($c) || in_array($c, $tagChars)) {
+ while(isset($query[$i])
+ && ($this->isChar($query[$i]) || in_array($query[$i], $tagChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // IDs
+ } else if ( $c == '#') {
+ $i++;
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || $query[$i] == '-')) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = '#'.$tmp;
+ // SPECIAL CHARS
+ } else if (in_array($c, $specialChars)) {
+ $return[] = $c;
+ $i++;
+ // MAPPED SPECIAL MULTICHARS
+// } else if ( $c.$query[$i+1] == '//') {
+// $return[] = ' ';
+// $i = $i+2;
+ // MAPPED SPECIAL CHARS
+ } else if ( isset($specialCharsMapping[$c])) {
+ $return[] = $specialCharsMapping[$c];
+ $i++;
+ // COMMA
+ } else if ( $c == ',') {
+ $queries[] = array();
+ $return =& $queries[ count($queries)-1 ];
+ $i++;
+ while( isset($query[$i]) && $query[$i] == ' ')
+ $i++;
+ // CLASSES
+ } else if ($c == '.') {
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $classChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // ~ General Sibling Selector
+ } else if ($c == '~') {
+ $spaceAllowed = true;
+ $tmp .= $query[$i++];
+ while( isset($query[$i])
+ && ($this->isChar($query[$i])
+ || in_array($query[$i], $classChars)
+ || $query[$i] == '*'
+ || ($query[$i] == ' ' && $spaceAllowed)
+ )) {
+ if ($query[$i] != ' ')
+ $spaceAllowed = false;
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // + Adjacent sibling selectors
+ } else if ($c == '+') {
+ $spaceAllowed = true;
+ $tmp .= $query[$i++];
+ while( isset($query[$i])
+ && ($this->isChar($query[$i])
+ || in_array($query[$i], $classChars)
+ || $query[$i] == '*'
+ || ($spaceAllowed && $query[$i] == ' ')
+ )) {
+ if ($query[$i] != ' ')
+ $spaceAllowed = false;
+ $tmp .= $query[$i];
+ $i++;
+ }
+ $return[] = $tmp;
+ // ATTRS
+ } else if ($c == '[') {
+ $stack = 1;
+ $tmp .= $c;
+ while( isset($query[++$i])) {
+ $tmp .= $query[$i];
+ if ( $query[$i] == '[') {
+ $stack++;
+ } else if ( $query[$i] == ']') {
+ $stack--;
+ if (! $stack )
+ break;
+ }
+ }
+ $return[] = $tmp;
+ $i++;
+ // PSEUDO CLASSES
+ } else if ($c == ':') {
+ $stack = 1;
+ $tmp .= $query[$i++];
+ while( isset($query[$i]) && ($this->isChar($query[$i]) || in_array($query[$i], $pseudoChars))) {
+ $tmp .= $query[$i];
+ $i++;
+ }
+ // with arguments ?
+ if ( isset($query[$i]) && $query[$i] == '(') {
+ $tmp .= $query[$i];
+ $stack = 1;
+ while( isset($query[++$i])) {
+ $tmp .= $query[$i];
+ if ( $query[$i] == '(') {
+ $stack++;
+ } else if ( $query[$i] == ')') {
+ $stack--;
+ if (! $stack )
+ break;
+ }
+ }
+ $return[] = $tmp;
+ $i++;
+ } else {
+ $return[] = $tmp;
+ }
+ } else {
+ $i++;
+ }
+ }
+ foreach($queries as $k => $q) {
+ if (isset($q[0])) {
+ if (isset($q[0][0]) && $q[0][0] == ':')
+ array_unshift($queries[$k], '*');
+ if ($q[0] != '>')
+ array_unshift($queries[$k], ' ');
+ }
+ }
+ return $queries;
+ }
+ /**
+ * Return matched DOM nodes.
+ *
+ * @param int $index
+ * @return array|DOMElement Single DOMElement or array of DOMElement.
+ */
+ public function get($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $return = isset($index)
+ ? (isset($this->elements[$index]) ? $this->elements[$index] : null)
+ : $this->elements;
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ foreach($args as $callback) {
+ if (is_array($return))
+ foreach($return as $k => $v)
+ $return[$k] = phpQuery::callbackRun($callback, array($v));
+ else
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Return matched DOM nodes.
+ * jQuery difference.
+ *
+ * @param int $index
+ * @return array|string Returns string if $index != null
+ * @todo implement callbacks
+ * @todo return only arrays ?
+ * @todo maybe other name...
+ */
+ public function getString($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if ($index)
+ $return = $this->eq($index)->text();
+ else {
+ $return = array();
+ for($i = 0; $i < $this->size(); $i++) {
+ $return[] = $this->eq($i)->text();
+ }
+ }
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ foreach($args as $callback) {
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Return matched DOM nodes.
+ * jQuery difference.
+ *
+ * @param int $index
+ * @return array|string Returns string if $index != null
+ * @todo implement callbacks
+ * @todo return only arrays ?
+ * @todo maybe other name...
+ */
+ public function getStrings($index = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if ($index)
+ $return = $this->eq($index)->text();
+ else {
+ $return = array();
+ for($i = 0; $i < $this->size(); $i++) {
+ $return[] = $this->eq($i)->text();
+ }
+ // pass thou callbacks
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ }
+ foreach($args as $callback) {
+ if (is_array($return))
+ foreach($return as $k => $v)
+ $return[$k] = phpQuery::callbackRun($callback, array($v));
+ else
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ /**
+ * Returns new instance of actual class.
+ *
+ * @param array $newStack Optional. Will replace old stack with new and move old one to history.c
+ */
+ public function newInstance($newStack = null) {
+ $class = get_class($this);
+ // support inheritance by passing old object to overloaded constructor
+ $new = $class != 'phpQuery'
+ ? new $class($this, $this->getDocumentID())
+ : new phpQueryObject($this->getDocumentID());
+ $new->previous = $this;
+ if (is_null($newStack)) {
+ $new->elements = $this->elements;
+ if ($this->elementsBackup)
+ $this->elements = $this->elementsBackup;
+ } else if (is_string($newStack)) {
+ $new->elements = phpQuery::pq($newStack, $this->getDocumentID())->stack();
+ } else {
+ $new->elements = $newStack;
+ }
+ return $new;
+ }
+ /**
+ * Enter description here...
+ *
+ * In the future, when PHP will support XLS 2.0, then we would do that this way:
+ * contains(tokenize(@class, '\s'), "something")
+ * @param unknown_type $class
+ * @param unknown_type $node
+ * @return boolean
+ * @access private
+ */
+ protected function matchClasses($class, $node) {
+ // multi-class
+ if ( mb_strpos($class, '.', 1)) {
+ $classes = explode('.', substr($class, 1));
+ $classesCount = count( $classes );
+ $nodeClasses = explode(' ', $node->getAttribute('class') );
+ $nodeClassesCount = count( $nodeClasses );
+ if ( $classesCount > $nodeClassesCount )
+ return false;
+ $diff = count(
+ array_diff(
+ $classes,
+ $nodeClasses
+ )
+ );
+ if (! $diff )
+ return true;
+ // single-class
+ } else {
+ return in_array(
+ // strip leading dot from class name
+ substr($class, 1),
+ // get classes for element as array
+ explode(' ', $node->getAttribute('class') )
+ );
+ }
+ }
+ /**
+ * @access private
+ */
+ protected function runQuery($XQuery, $selector = null, $compare = null) {
+ if ($compare && ! method_exists($this, $compare))
+ return false;
+ $stack = array();
+ if (! $this->elements)
+ $this->debug('Stack empty, skipping...');
+// var_dump($this->elements[0]->nodeType);
+ // element, document
+ foreach($this->stack(array(1, 9, 13)) as $k => $stackNode) {
+ $detachAfter = false;
+ // to work on detached nodes we need temporary place them somewhere
+ // thats because context xpath queries sucks ;]
+ $testNode = $stackNode;
+ while ($testNode) {
+ if (! $testNode->parentNode && ! $this->isRoot($testNode)) {
+ $this->root->appendChild($testNode);
+ $detachAfter = $testNode;
+ break;
+ }
+ $testNode = isset($testNode->parentNode)
+ ? $testNode->parentNode
+ : null;
+ }
+ // XXX tmp ?
+ $xpath = $this->documentWrapper->isXHTML
+ ? $this->getNodeXpath($stackNode, 'html')
+ : $this->getNodeXpath($stackNode);
+ // FIXME pseudoclasses-only query, support XML
+ $query = $XQuery == '//' && $xpath == '/html[1]'
+ ? '//*'
+ : $xpath.$XQuery;
+ $this->debug("XPATH: {$query}");
+ // run query, get elements
+ $nodes = $this->xpath->query($query);
+ $this->debug("QUERY FETCHED");
+ if (! $nodes->length )
+ $this->debug('Nothing found');
+ $debug = array();
+ foreach($nodes as $node) {
+ $matched = false;
+ if ( $compare) {
+ phpQuery::$debug ?
+ $this->debug("Found: ".$this->whois( $node ).", comparing with {$compare}()")
+ : null;
+ $phpQueryDebug = phpQuery::$debug;
+ phpQuery::$debug = false;
+ // TODO ??? use phpQuery::callbackRun()
+ if (call_user_func_array(array($this, $compare), array($selector, $node)))
+ $matched = true;
+ phpQuery::$debug = $phpQueryDebug;
+ } else {
+ $matched = true;
+ }
+ if ( $matched) {
+ if (phpQuery::$debug)
+ $debug[] = $this->whois( $node );
+ $stack[] = $node;
+ }
+ }
+ if (phpQuery::$debug) {
+ $this->debug("Matched ".count($debug).": ".implode(', ', $debug));
+ }
+ if ($detachAfter)
+ $this->root->removeChild($detachAfter);
+ }
+ $this->elements = $stack;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function find($selectors, $context = null, $noHistory = false) {
+ if (!$noHistory)
+ // backup last stack /for end()/
+ $this->elementsBackup = $this->elements;
+ // allow to define context
+ // TODO combine code below with phpQuery::pq() context guessing code
+ // as generic function
+ if ($context) {
+ if (! is_array($context) && $context instanceof DOMELEMENT)
+ $this->elements = array($context);
+ else if (is_array($context)) {
+ $this->elements = array();
+ foreach ($context as $c)
+ if ($c instanceof DOMELEMENT)
+ $this->elements[] = $c;
+ } else if ( $context instanceof self )
+ $this->elements = $context->elements;
+ }
+ $queries = $this->parseSelector($selectors);
+ $this->debug(array('FIND', $selectors, $queries));
+ $XQuery = '';
+ // remember stack state because of multi-queries
+ $oldStack = $this->elements;
+ // here we will be keeping found elements
+ $stack = array();
+ foreach($queries as $selector) {
+ $this->elements = $oldStack;
+ $delimiterBefore = false;
+ foreach($selector as $s) {
+ // TAG
+ $isTag = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_ereg_match('^[\w|\||-]+$', $s) || $s == '*'
+ : preg_match('@^[\w|\||-]+$@', $s) || $s == '*';
+ if ($isTag) {
+ if ($this->isXML()) {
+ // namespace support
+ if (mb_strpos($s, '|') !== false) {
+ $ns = $tag = null;
+ list($ns, $tag) = explode('|', $s);
+ $XQuery .= "$ns:$tag";
+ } else if ($s == '*') {
+ $XQuery .= "*";
+ } else {
+ $XQuery .= "*[local-name()='$s']";
+ }
+ } else {
+ $XQuery .= $s;
+ }
+ // ID
+ } else if ($s[0] == '#') {
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ $XQuery .= "[@id='".substr($s, 1)."']";
+ // ATTRIBUTES
+ } else if ($s[0] == '[') {
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ // strip side brackets
+ $attr = trim($s, '][');
+ $execute = false;
+ // attr with specifed value
+ if (mb_strpos($s, '=')) {
+ $value = null;
+ list($attr, $value) = explode('=', $attr);
+ $value = trim($value, "'\"");
+ if ($this->isRegexp($attr)) {
+ // cut regexp character
+ $attr = substr($attr, 0, -1);
+ $execute = true;
+ $XQuery .= "[@{$attr}]";
+ } else {
+ $XQuery .= "[@{$attr}='{$value}']";
+ }
+ // attr without specified value
+ } else {
+ $XQuery .= "[@{$attr}]";
+ }
+ if ($execute) {
+ $this->runQuery($XQuery, $s, 'is');
+ $XQuery = '';
+ if (! $this->length())
+ break;
+ }
+ // CLASSES
+ } else if ($s[0] == '.') {
+ // TODO use return $this->find("./self::*[contains(concat(\" \",@class,\" \"), \" $class \")]");
+ // thx wizDom ;)
+ if ($delimiterBefore)
+ $XQuery .= '*';
+ $XQuery .= '[@class]';
+ $this->runQuery($XQuery, $s, 'matchClasses');
+ $XQuery = '';
+ if (! $this->length() )
+ break;
+ // ~ General Sibling Selector
+ } else if ($s[0] == '~') {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ $this->elements = $this
+ ->siblings(
+ substr($s, 1)
+ )->elements;
+ if (! $this->length() )
+ break;
+ // + Adjacent sibling selectors
+ } else if ($s[0] == '+') {
+ // TODO /following-sibling::
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ $subSelector = substr($s, 1);
+ $subElements = $this->elements;
+ $this->elements = array();
+ foreach($subElements as $node) {
+ // search first DOMElement sibling
+ $test = $node->nextSibling;
+ while($test && ! ($test instanceof DOMELEMENT))
+ $test = $test->nextSibling;
+ if ($test && $this->is($subSelector, $test))
+ $this->elements[] = $test;
+ }
+ if (! $this->length() )
+ break;
+ // PSEUDO CLASSES
+ } else if ($s[0] == ':') {
+ // TODO optimization for :first :last
+ if ($XQuery) {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ }
+ if (! $this->length())
+ break;
+ $this->pseudoClasses($s);
+ if (! $this->length())
+ break;
+ // DIRECT DESCENDANDS
+ } else if ($s == '>') {
+ $XQuery .= '/';
+ $delimiterBefore = 2;
+ // ALL DESCENDANDS
+ } else if ($s == ' ') {
+ $XQuery .= '//';
+ $delimiterBefore = 2;
+ // ERRORS
+ } else {
+ phpQuery::debug("Unrecognized token '$s'");
+ }
+ $delimiterBefore = $delimiterBefore === 2;
+ }
+ // run query if any
+ if ($XQuery && $XQuery != '//') {
+ $this->runQuery($XQuery);
+ $XQuery = '';
+ }
+ foreach($this->elements as $node)
+ if (! $this->elementsContainsNode($node, $stack))
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ return $this->newInstance();
+ }
+ /**
+ * @todo create API for classes with pseudoselectors
+ * @access private
+ */
+ protected function pseudoClasses($class) {
+ // TODO clean args parsing ?
+ $class = ltrim($class, ':');
+ $haveArgs = mb_strpos($class, '(');
+ if ($haveArgs !== false) {
+ $args = substr($class, $haveArgs+1, -1);
+ $class = substr($class, 0, $haveArgs);
+ }
+ switch($class) {
+ case 'even':
+ case 'odd':
+ $stack = array();
+ foreach($this->elements as $i => $node) {
+ if ($class == 'even' && ($i%2) == 0)
+ $stack[] = $node;
+ else if ( $class == 'odd' && $i % 2 )
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;
+ case 'eq':
+ $k = intval($args);
+ $this->elements = isset( $this->elements[$k] )
+ ? array( $this->elements[$k] )
+ : array();
+ break;
+ case 'gt':
+ $this->elements = array_slice($this->elements, $args+1);
+ break;
+ case 'lt':
+ $this->elements = array_slice($this->elements, 0, $args+1);
+ break;
+ case 'first':
+ if (isset($this->elements[0]))
+ $this->elements = array($this->elements[0]);
+ break;
+ case 'last':
+ if ($this->elements)
+ $this->elements = array($this->elements[count($this->elements)-1]);
+ break;
+ /*case 'parent':
+ $stack = array();
+ foreach($this->elements as $node) {
+ if ( $node->childNodes->length )
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;*/
+ case 'contains':
+ $text = trim($args, "\"'");
+ $stack = array();
+ foreach($this->elements as $node) {
+ if (mb_stripos($node->textContent, $text) === false)
+ continue;
+ $stack[] = $node;
+ }
+ $this->elements = $stack;
+ break;
+ case 'not':
+ $selector = self::unQuote($args);
+ $this->elements = $this->not($selector)->stack();
+ break;
+ case 'slice':
+ // TODO jQuery difference ?
+ $args = explode(',',
+ str_replace(', ', ',', trim($args, "\"'"))
+ );
+ $start = $args[0];
+ $end = isset($args[1])
+ ? $args[1]
+ : null;
+ if ($end > 0)
+ $end = $end-$start;
+ $this->elements = array_slice($this->elements, $start, $end);
+ break;
+ case 'has':
+ $selector = trim($args, "\"'");
+ $stack = array();
+ foreach($this->stack(1) as $el) {
+ if ($this->find($selector, $el, true)->length)
+ $stack[] = $el;
+ }
+ $this->elements = $stack;
+ break;
+ case 'submit':
+ case 'reset':
+ $this->elements = phpQuery::merge(
+ $this->map(array($this, 'is'),
+ "input[type=$class]", new CallbackParam()
+ ),
+ $this->map(array($this, 'is'),
+ "button[type=$class]", new CallbackParam()
+ )
+ );
+ break;
+// $stack = array();
+// foreach($this->elements as $node)
+// if ($node->is('input[type=submit]') || $node->is('button[type=submit]'))
+// $stack[] = $el;
+// $this->elements = $stack;
+ case 'input':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ 'input', new CallbackParam()
+ )->elements;
+ break;
+ case 'password':
+ case 'checkbox':
+ case 'radio':
+ case 'hidden':
+ case 'image':
+ case 'file':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ "input[type=$class]", new CallbackParam()
+ )->elements;
+ break;
+ case 'parent':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return $node instanceof DOMELEMENT && $node->childNodes->length
+ ? $node : null;')
+ )->elements;
+ break;
+ case 'empty':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return $node instanceof DOMELEMENT && $node->childNodes->length
+ ? null : $node;')
+ )->elements;
+ break;
+ case 'disabled':
+ case 'selected':
+ case 'checked':
+ $this->elements = $this->map(
+ array($this, 'is'),
+ "[$class]", new CallbackParam()
+ )->elements;
+ break;
+ case 'enabled':
+ $this->elements = $this->map(
+ create_function('$node', '
+ return pq($node)->not(":disabled") ? $node : null;')
+ )->elements;
+ break;
+ case 'header':
+ $this->elements = $this->map(
+ create_function('$node',
+ '$isHeader = isset($node->tagName) && in_array($node->tagName, array(
+ "h1", "h2", "h3", "h4", "h5", "h6", "h7"
+ ));
+ return $isHeader
+ ? $node
+ : null;')
+ )->elements;
+// $this->elements = $this->map(
+// create_function('$node', '$node = pq($node);
+// return $node->is("h1")
+// || $node->is("h2")
+// || $node->is("h3")
+// || $node->is("h4")
+// || $node->is("h5")
+// || $node->is("h6")
+// || $node->is("h7")
+// ? $node
+// : null;')
+// )->elements;
+ break;
+ case 'only-child':
+ $this->elements = $this->map(
+ create_function('$node',
+ 'return pq($node)->siblings()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'first-child':
+ $this->elements = $this->map(
+ create_function('$node', 'return pq($node)->prevAll()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'last-child':
+ $this->elements = $this->map(
+ create_function('$node', 'return pq($node)->nextAll()->size() == 0 ? $node : null;')
+ )->elements;
+ break;
+ case 'nth-child':
+ $param = trim($args, "\"'");
+ if (! $param)
+ break;
+ // nth-child(n+b) to nth-child(1n+b)
+ if ($param{0} == 'n')
+ $param = '1'.$param;
+ // :nth-child(index/even/odd/equation)
+ if ($param == 'even' || $param == 'odd')
+ $mapped = $this->map(
+ create_function('$node, $param',
+ '$index = pq($node)->prevAll()->size()+1;
+ if ($param == "even" && ($index%2) == 0)
+ return $node;
+ else if ($param == "odd" && $index%2 == 1)
+ return $node;
+ else
+ return null;'),
+ new CallbackParam(), $param
+ );
+ else if (mb_strlen($param) > 1 && $param{1} == 'n')
+ // an+b
+ $mapped = $this->map(
+ create_function('$node, $param',
+ '$prevs = pq($node)->prevAll()->size();
+ $index = 1+$prevs;
+ $b = mb_strlen($param) > 3
+ ? $param{3}
+ : 0;
+ $a = $param{0};
+ if ($b && $param{2} == "-")
+ $b = -$b;
+ if ($a > 0) {
+ return ($index-$b)%$a == 0
+ ? $node
+ : null;
+ phpQuery::debug($a."*".floor($index/$a)."+$b-1 == ".($a*floor($index/$a)+$b-1)." ?= $prevs");
+ return $a*floor($index/$a)+$b-1 == $prevs
+ ? $node
+ : null;
+ } else if ($a == 0)
+ return $index == $b
+ ? $node
+ : null;
+ else
+ // negative value
+ return $index <= $b
+ ? $node
+ : null;
+// if (! $b)
+// return $index%$a == 0
+// ? $node
+// : null;
+// else
+// return ($index-$b)%$a == 0
+// ? $node
+// : null;
+ '),
+ new CallbackParam(), $param
+ );
+ else
+ // index
+ $mapped = $this->map(
+ create_function('$node, $index',
+ '$prevs = pq($node)->prevAll()->size();
+ if ($prevs && $prevs == $index-1)
+ return $node;
+ else if (! $prevs && $index == 1)
+ return $node;
+ else
+ return null;'),
+ new CallbackParam(), $param
+ );
+ $this->elements = $mapped->elements;
+ break;
+ default:
+ $this->debug("Unknown pseudoclass '{$class}', skipping...");
+ }
+ }
+ /**
+ * @access private
+ */
+ protected function __pseudoClassParam($paramsString) {
+ // TODO;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function is($selector, $nodes = null) {
+ phpQuery::debug(array("Is:", $selector));
+ if (! $selector)
+ return false;
+ $oldStack = $this->elements;
+ $returnArray = false;
+ if ($nodes && is_array($nodes)) {
+ $this->elements = $nodes;
+ } else if ($nodes)
+ $this->elements = array($nodes);
+ $this->filter($selector, true);
+ $stack = $this->elements;
+ $this->elements = $oldStack;
+ if ($nodes)
+ return $stack ? $stack : null;
+ return (bool)count($stack);
+ }
+ /**
+ * Enter description here...
+ * jQuery difference.
+ *
+ * Callback:
+ * - $index int
+ * - $node DOMNode
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @link http://docs.jquery.com/Traversing/filter
+ */
+ public function filterCallback($callback, $_skipHistory = false) {
+ if (! $_skipHistory) {
+ $this->elementsBackup = $this->elements;
+ $this->debug("Filtering by callback");
+ }
+ $newStack = array();
+ foreach($this->elements as $index => $node) {
+ $result = phpQuery::callbackRun($callback, array($index, $node));
+ if (is_null($result) || (! is_null($result) && $result))
+ $newStack[] = $node;
+ }
+ $this->elements = $newStack;
+ return $_skipHistory
+ ? $this
+ : $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @link http://docs.jquery.com/Traversing/filter
+ */
+ public function filter($selectors, $_skipHistory = false) {
+ if ($selectors instanceof Callback OR $selectors instanceof Closure)
+ return $this->filterCallback($selectors, $_skipHistory);
+ if (! $_skipHistory)
+ $this->elementsBackup = $this->elements;
+ $notSimpleSelector = array(' ', '>', '~', '+', '/');
+ if (! is_array($selectors))
+ $selectors = $this->parseSelector($selectors);
+ if (! $_skipHistory)
+ $this->debug(array("Filtering:", $selectors));
+ $finalStack = array();
+ foreach($selectors as $selector) {
+ $stack = array();
+ if (! $selector)
+ break;
+ // avoid first space or /
+ if (in_array($selector[0], $notSimpleSelector))
+ $selector = array_slice($selector, 1);
+ // PER NODE selector chunks
+ foreach($this->stack() as $node) {
+ $break = false;
+ foreach($selector as $s) {
+ if (!($node instanceof DOMELEMENT)) {
+ // all besides DOMElement
+ if ( $s[0] == '[') {
+ $attr = trim($s, '[]');
+ if ( mb_strpos($attr, '=')) {
+ list( $attr, $val ) = explode('=', $attr);
+ if ($attr == 'nodeType' && $node->nodeType != $val)
+ $break = true;
+ }
+ } else
+ $break = true;
+ } else {
+ // DOMElement only
+ // ID
+ if ( $s[0] == '#') {
+ if ( $node->getAttribute('id') != substr($s, 1) )
+ $break = true;
+ // CLASSES
+ } else if ( $s[0] == '.') {
+ if (! $this->matchClasses( $s, $node ) )
+ $break = true;
+ // ATTRS
+ } else if ( $s[0] == '[') {
+ // strip side brackets
+ $attr = trim($s, '[]');
+ if (mb_strpos($attr, '=')) {
+ list($attr, $val) = explode('=', $attr);
+ $val = self::unQuote($val);
+ if ($attr == 'nodeType') {
+ if ($val != $node->nodeType)
+ $break = true;
+ } else if ($this->isRegexp($attr)) {
+ $val = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? quotemeta(trim($val, '"\''))
+ : preg_quote(trim($val, '"\''), '@');
+ // switch last character
+ switch( substr($attr, -1)) {
+ // quotemeta used insted of preg_quote
+ // http://code.google.com/p/phpquery/issues/detail?id=76
+ case '^':
+ $pattern = '^'.$val;
+ break;
+ case '*':
+ $pattern = '.*'.$val.'.*';
+ break;
+ case '$':
+ $pattern = '.*'.$val.'$';
+ break;
+ }
+ // cut last character
+ $attr = substr($attr, 0, -1);
+ $isMatch = extension_loaded('mbstring') && phpQuery::$mbstringSupport
+ ? mb_ereg_match($pattern, $node->getAttribute($attr))
+ : preg_match("@{$pattern}@", $node->getAttribute($attr));
+ if (! $isMatch)
+ $break = true;
+ } else if ($node->getAttribute($attr) != $val)
+ $break = true;
+ } else if (! $node->hasAttribute($attr))
+ $break = true;
+ // PSEUDO CLASSES
+ } else if ( $s[0] == ':') {
+ // skip
+ // TAG
+ } else if (trim($s)) {
+ if ($s != '*') {
+ // TODO namespaces
+ if (isset($node->tagName)) {
+ if ($node->tagName != $s)
+ $break = true;
+ } else if ($s == 'html' && ! $this->isRoot($node))
+ $break = true;
+ }
+ // AVOID NON-SIMPLE SELECTORS
+ } else if (in_array($s, $notSimpleSelector)) {
+ $break = true;
+ $this->debug(array('Skipping non simple selector', $selector));
+ }
+ }
+ if ($break)
+ break;
+ }
+ // if element passed all chunks of selector - add it to new stack
+ if (! $break )
+ $stack[] = $node;
+ }
+ $tmpStack = $this->elements;
+ $this->elements = $stack;
+ // PER ALL NODES selector chunks
+ foreach($selector as $s)
+ // PSEUDO CLASSES
+ if ($s[0] == ':')
+ $this->pseudoClasses($s);
+ foreach($this->elements as $node)
+ // XXX it should be merged without duplicates
+ // but jQuery doesnt do that
+ $finalStack[] = $node;
+ $this->elements = $tmpStack;
+ }
+ $this->elements = $finalStack;
+ if ($_skipHistory) {
+ return $this;
+ } else {
+ $this->debug("Stack length after filter(): ".count($finalStack));
+ return $this->newInstance();
+ }
+ }
+ /**
+ *
+ * @param $value
+ * @return unknown_type
+ * @TODO implement in all methods using passed parameters
+ */
+ protected static function unQuote($value) {
+ return $value[0] == '\'' || $value[0] == '"'
+ ? substr($value, 1, -1)
+ : $value;
+ }
+ /**
+ * Enter description here...
+ *
+ * @link http://docs.jquery.com/Ajax/load
+ * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo Support $selector
+ */
+ public function load($url, $data = null, $callback = null) {
+ if ($data && ! is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ if (mb_strpos($url, ' ') !== false) {
+ $matches = null;
+ if (extension_loaded('mbstring') && phpQuery::$mbstringSupport)
+ mb_ereg('^([^ ]+) (.*)$', $url, $matches);
+ else
+ preg_match('^([^ ]+) (.*)$', $url, $matches);
+ $url = $matches[1];
+ $selector = $matches[2];
+ // FIXME this sucks, pass as callback param
+ $this->_loadSelector = $selector;
+ }
+ $ajax = array(
+ 'url' => $url,
+ 'type' => $data ? 'POST' : 'GET',
+ 'data' => $data,
+ 'complete' => $callback,
+ 'success' => array($this, '__loadSuccess')
+ );
+ phpQuery::ajax($ajax);
+ return $this;
+ }
+ /**
+ * @access private
+ * @param $html
+ * @return unknown_type
+ */
+ public function __loadSuccess($html) {
+ if ($this->_loadSelector) {
+ $html = phpQuery::newDocument($html)->find($this->_loadSelector);
+ unset($this->_loadSelector);
+ }
+ foreach($this->stack(1) as $node) {
+ phpQuery::pq($node, $this->getDocumentID())
+ ->markup($html);
+ }
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo
+ */
+ public function css() {
+ // TODO
+ return $this;
+ }
+ /**
+ * @todo
+ *
+ */
+ public function show(){
+ // TODO
+ return $this;
+ }
+ /**
+ * @todo
+ *
+ */
+ public function hide(){
+ // TODO
+ return $this;
+ }
+ /**
+ * Trigger a type of event on every matched element.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function trigger($type, $data = array()) {
+ foreach($this->elements as $node)
+ phpQueryEvents::trigger($this->getDocumentID(), $type, $data, $node);
+ return $this;
+ }
+ /**
+ * This particular method triggers all bound event handlers on an element (for a specific event type) WITHOUT executing the browsers default actions.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO
+ */
+ public function triggerHandler($type, $data = array()) {
+ // TODO;
+ }
+ /**
+ * Binds a handler to one or more events (like click) for each matched element.
+ * Can also bind custom events.
+ *
+ * @param unknown_type $type
+ * @param unknown_type $data Optional
+ * @param unknown_type $callback
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support '!' (exclusive) events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function bind($type, $data, $callback = null) {
+ // TODO check if $data is callable, not using is_callable
+ if (! isset($callback)) {
+ $callback = $data;
+ $data = null;
+ }
+ foreach($this->elements as $node)
+ phpQueryEvents::add($this->getDocumentID(), $node, $type, $data, $callback);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $type
+ * @param unknown_type $callback
+ * @return unknown
+ * @TODO namespace events
+ * @TODO support more than event in $type (space-separated)
+ */
+ public function unbind($type = null, $callback = null) {
+ foreach($this->elements as $node)
+ phpQueryEvents::remove($this->getDocumentID(), $node, $type, $callback);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function change($callback = null) {
+ if ($callback)
+ return $this->bind('change', $callback);
+ return $this->trigger('change');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function submit($callback = null) {
+ if ($callback)
+ return $this->bind('submit', $callback);
+ return $this->trigger('submit');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function click($callback = null) {
+ if ($callback)
+ return $this->bind('click', $callback);
+ return $this->trigger('click');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAllOld($wrapper) {
+ $wrapper = pq($wrapper)->_clone();
+ if (! $wrapper->length() || ! $this->length() )
+ return $this;
+ $wrapper->insertBefore($this->elements[0]);
+ $deepest = $wrapper->elements[0];
+ while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT)
+ $deepest = $deepest->firstChild;
+ pq($deepest)->append($this);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * TODO testme...
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAll($wrapper) {
+ if (! $this->length())
+ return $this;
+ return phpQuery::pq($wrapper, $this->getDocumentID())
+ ->clone()
+ ->insertBefore($this->get(0))
+ ->map(array($this, '___wrapAllCallback'))
+ ->append($this);
+ }
+ /**
+ *
+ * @param $node
+ * @return unknown_type
+ * @access private
+ */
+ public function ___wrapAllCallback($node) {
+ $deepest = $node;
+ while($deepest->firstChild && $deepest->firstChild instanceof DOMELEMENT)
+ $deepest = $deepest->firstChild;
+ return $deepest;
+ }
+ /**
+ * Enter description here...
+ * NON JQUERY METHOD
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapAllPHP($codeBefore, $codeAfter) {
+ return $this
+ ->slice(0, 1)
+ ->beforePHP($codeBefore)
+ ->end()
+ ->slice(-1)
+ ->afterPHP($codeAfter)
+ ->end();
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrap($wrapper) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->wrapAll($wrapper);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapPHP($codeBefore, $codeAfter) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->wrapAllPHP($codeBefore, $codeAfter);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapInner($wrapper) {
+ foreach($this->stack() as $node)
+ phpQuery::pq($node, $this->getDocumentID())->contents()->wrapAll($wrapper);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function wrapInnerPHP($codeBefore, $codeAfter) {
+ foreach($this->stack(1) as $node)
+ phpQuery::pq($node, $this->getDocumentID())->contents()
+ ->wrapAllPHP($codeBefore, $codeAfter);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @testme Support for text nodes
+ */
+ public function contents() {
+ $stack = array();
+ foreach($this->stack(1) as $el) {
+ // FIXME (fixed) http://code.google.com/p/phpquery/issues/detail?id=56
+// if (! isset($el->childNodes))
+// continue;
+ foreach($el->childNodes as $node) {
+ $stack[] = $node;
+ }
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * jQuery difference.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function contentsUnwrap() {
+ foreach($this->stack(1) as $node) {
+ if (! $node->parentNode )
+ continue;
+ $childNodes = array();
+ // any modification in DOM tree breaks childNodes iteration, so cache them first
+ foreach($node->childNodes as $chNode )
+ $childNodes[] = $chNode;
+ foreach($childNodes as $chNode )
+// $node->parentNode->appendChild($chNode);
+ $node->parentNode->insertBefore($chNode, $node);
+ $node->parentNode->removeChild($node);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * jQuery difference.
+ */
+ public function switchWith($markup) {
+ $markup = pq($markup, $this->getDocumentID());
+ $content = null;
+ foreach($this->stack(1) as $node) {
+ pq($node)
+ ->contents()->toReference($content)->end()
+ ->replaceWith($markup->clone()->append($content));
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function eq($num) {
+ $oldStack = $this->elements;
+ $this->elementsBackup = $this->elements;
+ $this->elements = array();
+ if ( isset($oldStack[$num]) )
+ $this->elements[] = $oldStack[$num];
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function size() {
+ return count($this->elements);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @deprecated Use length as attribute
+ */
+ public function length() {
+ return $this->size();
+ }
+ public function count() {
+ return $this->size();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo $level
+ */
+ public function end($level = 1) {
+// $this->elements = array_pop( $this->history );
+// return $this;
+// $this->previous->DOM = $this->DOM;
+// $this->previous->XPath = $this->XPath;
+ return $this->previous
+ ? $this->previous
+ : $this;
+ }
+ /**
+ * Enter description here...
+ * Normal use ->clone() .
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _clone() {
+ $newStack = array();
+ //pr(array('copy... ', $this->whois()));
+ //$this->dumpHistory('copy');
+ $this->elementsBackup = $this->elements;
+ foreach($this->elements as $node) {
+ $newStack[] = $node->cloneNode(true);
+ }
+ $this->elements = $newStack;
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function replaceWithPHP($code) {
+ return $this->replaceWith(phpQuery::php($code));
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery $content
+ * @link http://docs.jquery.com/Manipulation/replaceWith#content
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function replaceWith($content) {
+ return $this->after($content)->remove();
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String $selector
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo this works ?
+ */
+ public function replaceAll($selector) {
+ foreach(phpQuery::pq($selector, $this->getDocumentID()) as $node)
+ phpQuery::pq($node, $this->getDocumentID())
+ ->after($this->_clone())
+ ->remove();
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function remove($selector = null) {
+ $loop = $selector
+ ? $this->filter($selector)->elements
+ : $this->elements;
+ foreach($loop as $node) {
+ if (! $node->parentNode )
+ continue;
+ if (isset($node->tagName))
+ $this->debug("Removing '{$node->tagName}'");
+ $node->parentNode->removeChild($node);
+ // Mutation event
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'DOMNodeRemoved'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ return $this;
+ }
+ protected function markupEvents($newMarkup, $oldMarkup, $node) {
+ if ($node->tagName == 'textarea' && $newMarkup != $oldMarkup) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ }
+ /**
+ * jQuey difference
+ *
+ * @param $markup
+ * @return unknown_type
+ * @TODO trigger change event for textarea
+ */
+ public function markup($markup = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ if ($this->documentWrapper->isXML)
+ return call_user_func_array(array($this, 'xml'), $args);
+ else
+ return call_user_func_array(array($this, 'html'), $args);
+ }
+ /**
+ * jQuey difference
+ *
+ * @param $markup
+ * @return unknown_type
+ */
+ public function markupOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ if ($this->documentWrapper->isXML)
+ return call_user_func_array(array($this, 'xmlOuter'), $args);
+ else
+ return call_user_func_array(array($this, 'htmlOuter'), $args);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $html
+ * @return string|phpQuery|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO force html result
+ */
+ public function html($html = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if (isset($html)) {
+ // INSERT
+ $nodes = $this->documentWrapper->import($html);
+ $this->empty();
+ foreach($this->stack(1) as $alreadyAdded => $node) {
+ // for now, limit events for textarea
+ if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea')
+ $oldHtml = pq($node, $this->getDocumentID())->markup();
+ foreach($nodes as $newNode) {
+ $node->appendChild($alreadyAdded
+ ? $newNode->cloneNode(true)
+ : $newNode
+ );
+ }
+ // for now, limit events for textarea
+ if (($this->isXHTML() || $this->isHTML()) && $node->tagName == 'textarea')
+ $this->markupEvents($html, $oldHtml, $node);
+ }
+ return $this;
+ } else {
+ // FETCH
+ $return = $this->documentWrapper->markup($this->elements, true);
+ $args = func_get_args();
+ foreach(array_slice($args, 1) as $callback) {
+ $return = phpQuery::callbackRun($callback, array($return));
+ }
+ return $return;
+ }
+ }
+ /**
+ * @TODO force xml result
+ */
+ public function xml($xml = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ return call_user_func_array(array($this, 'html'), $args);
+ }
+ /**
+ * Enter description here...
+ * @TODO force html result
+ *
+ * @return String
+ */
+ public function htmlOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $markup = $this->documentWrapper->markup($this->elements);
+ // pass thou callbacks
+ $args = func_get_args();
+ foreach($args as $callback) {
+ $markup = phpQuery::callbackRun($callback, array($markup));
+ }
+ return $markup;
+ }
+ /**
+ * @TODO force xml result
+ */
+ public function xmlOuter($callback1 = null, $callback2 = null, $callback3 = null) {
+ $args = func_get_args();
+ return call_user_func_array(array($this, 'htmlOuter'), $args);
+ }
+ public function __toString() {
+ return $this->markupOuter();
+ }
+ /**
+ * Just like html(), but returns markup with VALID (dangerous) PHP tags.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo support returning markup with PHP tags when called without param
+ */
+ public function php($code = null) {
+ return $this->markupPHP($code);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param $code
+ * @return unknown_type
+ */
+ public function markupPHP($code = null) {
+ return isset($code)
+ ? $this->markup(phpQuery::php($code))
+ : phpQuery::markupToPHP($this->markup());
+ }
+ /**
+ * Enter description here...
+ *
+ * @param $code
+ * @return unknown_type
+ */
+ public function markupOuterPHP() {
+ return phpQuery::markupToPHP($this->markupOuter());
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function children($selector = null) {
+ $stack = array();
+ foreach($this->stack(1) as $node) {
+// foreach($node->getElementsByTagName('*') as $newNode) {
+ foreach($node->childNodes as $newNode) {
+ if ($newNode->nodeType != 1)
+ continue;
+ if ($selector && ! $this->is($selector, $newNode))
+ continue;
+ if ($this->elementsContainsNode($newNode, $stack))
+ continue;
+ $stack[] = $newNode;
+ }
+ }
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function ancestors($selector = null) {
+ return $this->children( $selector );
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function append( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function appendPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'append');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function appendTo( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prepend( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @todo accept many arguments, which are joined, arrays maybe also
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prependPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'prepend');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prependTo( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function before($content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function beforePHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'before');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param String|phpQuery
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function insertBefore( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function after( $content) {
+ return $this->insert($content, __FUNCTION__);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function afterPHP( $content) {
+ return $this->insert("<php><!-- {$content} --></php>", 'after');
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function insertAfter( $seletor) {
+ return $this->insert($seletor, __FUNCTION__);
+ }
+ /**
+ * Internal insert method. Don't use it.
+ *
+ * @param unknown_type $target
+ * @param unknown_type $type
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function insert($target, $type) {
+ $this->debug("Inserting data with '{$type}'");
+ $to = false;
+ switch( $type) {
+ case 'appendTo':
+ case 'prependTo':
+ case 'insertBefore':
+ case 'insertAfter':
+ $to = true;
+ }
+ switch(gettype($target)) {
+ case 'string':
+ $insertFrom = $insertTo = array();
+ if ($to) {
+ // INSERT TO
+ $insertFrom = $this->elements;
+ if (phpQuery::isMarkup($target)) {
+ // $target is new markup, import it
+ $insertTo = $this->documentWrapper->import($target);
+ // insert into selected element
+ } else {
+ // $tagret is a selector
+ $thisStack = $this->elements;
+ $this->toRoot();
+ $insertTo = $this->find($target)->elements;
+ $this->elements = $thisStack;
+ }
+ } else {
+ // INSERT FROM
+ $insertTo = $this->elements;
+ $insertFrom = $this->documentWrapper->import($target);
+ }
+ break;
+ case 'object':
+ $insertFrom = $insertTo = array();
+ // phpQuery
+ if ($target instanceof self) {
+ if ($to) {
+ $insertTo = $target->elements;
+ if ($this->documentFragment && $this->stackIsRoot())
+ // get all body children
+// $loop = $this->find('body > *')->elements;
+ // TODO test it, test it hard...
+// $loop = $this->newInstance($this->root)->find('> *')->elements;
+ $loop = $this->root->childNodes;
+ else
+ $loop = $this->elements;
+ // import nodes if needed
+ $insertFrom = $this->getDocumentID() == $target->getDocumentID()
+ ? $loop
+ : $target->documentWrapper->import($loop);
+ } else {
+ $insertTo = $this->elements;
+ if ( $target->documentFragment && $target->stackIsRoot() )
+ // get all body children
+// $loop = $target->find('body > *')->elements;
+ $loop = $target->root->childNodes;
+ else
+ $loop = $target->elements;
+ // import nodes if needed
+ $insertFrom = $this->getDocumentID() == $target->getDocumentID()
+ ? $loop
+ : $this->documentWrapper->import($loop);
+ }
+ // DOMNODE
+ } elseif ($target instanceof DOMNODE) {
+ // import node if needed
+// if ( $target->ownerDocument != $this->DOM )
+// $target = $this->DOM->importNode($target, true);
+ if ( $to) {
+ $insertTo = array($target);
+ if ($this->documentFragment && $this->stackIsRoot())
+ // get all body children
+ $loop = $this->root->childNodes;
+// $loop = $this->find('body > *')->elements;
+ else
+ $loop = $this->elements;
+ foreach($loop as $fromNode)
+ // import nodes if needed
+ $insertFrom[] = ! $fromNode->ownerDocument->isSameNode($target->ownerDocument)
+ ? $target->ownerDocument->importNode($fromNode, true)
+ : $fromNode;
+ } else {
+ // import node if needed
+ if (! $target->ownerDocument->isSameNode($this->document))
+ $target = $this->document->importNode($target, true);
+ $insertTo = $this->elements;
+ $insertFrom[] = $target;
+ }
+ }
+ break;
+ }
+ phpQuery::debug("From ".count($insertFrom)."; To ".count($insertTo)." nodes");
+ foreach($insertTo as $insertNumber => $toNode) {
+ // we need static relative elements in some cases
+ switch( $type) {
+ case 'prependTo':
+ case 'prepend':
+ $firstChild = $toNode->firstChild;
+ break;
+ case 'insertAfter':
+ case 'after':
+ $nextSibling = $toNode->nextSibling;
+ break;
+ }
+ foreach($insertFrom as $fromNode) {
+ // clone if inserted already before
+ $insert = $insertNumber
+ ? $fromNode->cloneNode(true)
+ : $fromNode;
+ switch($type) {
+ case 'appendTo':
+ case 'append':
+// $toNode->insertBefore(
+// $fromNode,
+// $toNode->lastChild->nextSibling
+// );
+ $toNode->appendChild($insert);
+ $eventTarget = $insert;
+ break;
+ case 'prependTo':
+ case 'prepend':
+ $toNode->insertBefore(
+ $insert,
+ $firstChild
+ );
+ break;
+ case 'insertBefore':
+ case 'before':
+ if (! $toNode->parentNode)
+ throw new Exception("No parentNode, can't do {$type}()");
+ else
+ $toNode->parentNode->insertBefore(
+ $insert,
+ $toNode
+ );
+ break;
+ case 'insertAfter':
+ case 'after':
+ if (! $toNode->parentNode)
+ throw new Exception("No parentNode, can't do {$type}()");
+ else
+ $toNode->parentNode->insertBefore(
+ $insert,
+ $nextSibling
+ );
+ break;
+ }
+ // Mutation event
+ $event = new DOMEvent(array(
+ 'target' => $insert,
+ 'type' => 'DOMNodeInserted'
+ ));
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $insert
+ );
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return Int
+ */
+ public function index($subject) {
+ $index = -1;
+ $subject = $subject instanceof phpQueryObject
+ ? $subject->elements[0]
+ : $subject;
+ foreach($this->newInstance() as $k => $node) {
+ if ($node->isSameNode($subject))
+ $index = $k;
+ }
+ return $index;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $start
+ * @param unknown_type $end
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @testme
+ */
+ public function slice($start, $end = null) {
+// $last = count($this->elements)-1;
+// $end = $end
+// ? min($end, $last)
+// : $last;
+// if ($start < 0)
+// $start = $last+$start;
+// if ($start > $last)
+// return array();
+ if ($end > 0)
+ $end = $end-$start;
+ return $this->newInstance(
+ array_slice($this->elements, $start, $end)
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function reverse() {
+ $this->elementsBackup = $this->elements;
+ $this->elements = array_reverse($this->elements);
+ return $this->newInstance();
+ }
+ /**
+ * Return joined text content.
+ * @return String
+ */
+ public function text($text = null, $callback1 = null, $callback2 = null, $callback3 = null) {
+ if (isset($text))
+ return $this->html(htmlspecialchars($text));
+ $args = func_get_args();
+ $args = array_slice($args, 1);
+ $return = '';
+ foreach($this->elements as $node) {
+ $text = $node->textContent;
+ if (count($this->elements) > 1 && $text)
+ $text .= "\n";
+ foreach($args as $callback) {
+ $text = phpQuery::callbackRun($callback, array($text));
+ }
+ $return .= $text;
+ }
+ return $return;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function plugin($class, $file = null) {
+ phpQuery::plugin($class, $file);
+ return $this;
+ }
+ /**
+ * Deprecated, use $pq->plugin() instead.
+ *
+ * @deprecated
+ * @param $class
+ * @param $file
+ * @return unknown_type
+ */
+ public static function extend($class, $file = null) {
+ return $this->plugin($class, $file);
+ }
+ /**
+ *
+ * @access private
+ * @param $method
+ * @param $args
+ * @return unknown_type
+ */
+ public function __call($method, $args) {
+ $aliasMethods = array('clone', 'empty');
+ if (isset(phpQuery::$extendMethods[$method])) {
+ array_unshift($args, $this);
+ return phpQuery::callbackRun(
+ phpQuery::$extendMethods[$method], $args
+ );
+ } else if (isset(phpQuery::$pluginsMethods[$method])) {
+ array_unshift($args, $this);
+ $class = phpQuery::$pluginsMethods[$method];
+ $realClass = "phpQueryObjectPlugin_$class";
+ $return = call_user_func_array(
+ array($realClass, $method),
+ $args
+ );
+ // XXX deprecate ?
+ return is_null($return)
+ ? $this
+ : $return;
+ } else if (in_array($method, $aliasMethods)) {
+ return call_user_func_array(array($this, '_'.$method), $args);
+ } else
+ throw new Exception("Method '{$method}' doesnt exist");
+ }
+ /**
+ * Safe rename of next().
+ *
+ * Use it ONLY when need to call next() on an iterated object (in same time).
+ * Normaly there is no need to do such thing ;)
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _next($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('nextSibling', $selector, true)
+ );
+ }
+ /**
+ * Use prev() and next().
+ *
+ * @deprecated
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _prev($selector = null) {
+ return $this->prev($selector);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function prev($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('previousSibling', $selector, true)
+ );
+ }
+ /**
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo
+ */
+ public function prevAll($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('previousSibling', $selector)
+ );
+ }
+ /**
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo FIXME: returns source elements insted of next siblings
+ */
+ public function nextAll($selector = null) {
+ return $this->newInstance(
+ $this->getElementSiblings('nextSibling', $selector)
+ );
+ }
+ /**
+ * @access private
+ */
+ protected function getElementSiblings($direction, $selector = null, $limitToOne = false) {
+ $stack = array();
+ $count = 0;
+ foreach($this->stack() as $node) {
+ $test = $node;
+ while( isset($test->{$direction}) && $test->{$direction}) {
+ $test = $test->{$direction};
+ if (! $test instanceof DOMELEMENT)
+ continue;
+ $stack[] = $test;
+ if ($limitToOne)
+ break;
+ }
+ }
+ if ($selector) {
+ $stackOld = $this->elements;
+ $this->elements = $stack;
+ $stack = $this->filter($selector, true)->stack();
+ $this->elements = $stackOld;
+ }
+ return $stack;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function siblings($selector = null) {
+ $stack = array();
+ $siblings = array_merge(
+ $this->getElementSiblings('previousSibling', $selector),
+ $this->getElementSiblings('nextSibling', $selector)
+ );
+ foreach($siblings as $node) {
+ if (! $this->elementsContainsNode($node, $stack))
+ $stack[] = $node;
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function not($selector = null) {
+ if (is_string($selector))
+ phpQuery::debug(array('not', $selector));
+ else
+ phpQuery::debug('not');
+ $stack = array();
+ if ($selector instanceof self || $selector instanceof DOMNODE) {
+ foreach($this->stack() as $node) {
+ if ($selector instanceof self) {
+ $matchFound = false;
+ foreach($selector->stack() as $notNode) {
+ if ($notNode->isSameNode($node))
+ $matchFound = true;
+ }
+ if (! $matchFound)
+ $stack[] = $node;
+ } else if ($selector instanceof DOMNODE) {
+ if (! $selector->isSameNode($node))
+ $stack[] = $node;
+ } else {
+ if (! $this->is($selector))
+ $stack[] = $node;
+ }
+ }
+ } else {
+ $orgStack = $this->stack();
+ $matched = $this->filter($selector, true)->stack();
+// $matched = array();
+// // simulate OR in filter() instead of AND 5y
+// foreach($this->parseSelector($selector) as $s) {
+// $matched = array_merge($matched,
+// $this->filter(array($s))->stack()
+// );
+// }
+ foreach($orgStack as $node)
+ if (! $this->elementsContainsNode($node, $matched))
+ $stack[] = $node;
+ }
+ return $this->newInstance($stack);
+ }
+ /**
+ * Enter description here...
+ *
+ * @param string|phpQueryObject
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function add($selector = null) {
+ if (! $selector)
+ return $this;
+ $stack = array();
+ $this->elementsBackup = $this->elements;
+ $found = phpQuery::pq($selector, $this->getDocumentID());
+ $this->merge($found->elements);
+ return $this->newInstance();
+ }
+ /**
+ * @access private
+ */
+ protected function merge() {
+ foreach(func_get_args() as $nodes)
+ foreach($nodes as $newNode )
+ if (! $this->elementsContainsNode($newNode) )
+ $this->elements[] = $newNode;
+ }
+ /**
+ * @access private
+ * TODO refactor to stackContainsNode
+ */
+ protected function elementsContainsNode($nodeToCheck, $elementsStack = null) {
+ $loop = ! is_null($elementsStack)
+ ? $elementsStack
+ : $this->elements;
+ foreach($loop as $node) {
+ if ( $node->isSameNode( $nodeToCheck ) )
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function parent($selector = null) {
+ $stack = array();
+ foreach($this->elements as $node )
+ if ( $node->parentNode && ! $this->elementsContainsNode($node->parentNode, $stack) )
+ $stack[] = $node->parentNode;
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ if ( $selector )
+ $this->filter($selector, true);
+ return $this->newInstance();
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function parents($selector = null) {
+ $stack = array();
+ if (! $this->elements )
+ $this->debug('parents() - stack empty');
+ foreach($this->elements as $node) {
+ $test = $node;
+ while( $test->parentNode) {
+ $test = $test->parentNode;
+ if ($this->isRoot($test))
+ break;
+ if (! $this->elementsContainsNode($test, $stack)) {
+ $stack[] = $test;
+ continue;
+ }
+ }
+ }
+ $this->elementsBackup = $this->elements;
+ $this->elements = $stack;
+ if ( $selector )
+ $this->filter($selector, true);
+ return $this->newInstance();
+ }
+ /**
+ * Internal stack iterator.
+ *
+ * @access private
+ */
+ public function stack($nodeTypes = null) {
+ if (!isset($nodeTypes))
+ return $this->elements;
+ if (!is_array($nodeTypes))
+ $nodeTypes = array($nodeTypes);
+ $return = array();
+ foreach($this->elements as $node) {
+ if (in_array($node->nodeType, $nodeTypes))
+ $return[] = $node;
+ }
+ return $return;
+ }
+ // TODO phpdoc; $oldAttr is result of hasAttribute, before any changes
+ protected function attrEvents($attr, $oldAttr, $oldValue, $node) {
+ // skip events for XML documents
+ if (! $this->isXHTML() && ! $this->isHTML())
+ return;
+ $event = null;
+ // identify
+ $isInputValue = $node->tagName == 'input'
+ && (
+ in_array($node->getAttribute('type'),
+ array('text', 'password', 'hidden'))
+ || !$node->getAttribute('type')
+ );
+ $isRadio = $node->tagName == 'input'
+ && $node->getAttribute('type') == 'radio';
+ $isCheckbox = $node->tagName == 'input'
+ && $node->getAttribute('type') == 'checkbox';
+ $isOption = $node->tagName == 'option';
+ if ($isInputValue && $attr == 'value' && $oldValue != $node->getAttribute($attr)) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ } else if (($isRadio || $isCheckbox) && $attr == 'checked' && (
+ // check
+ (! $oldAttr && $node->hasAttribute($attr))
+ // un-check
+ || (! $node->hasAttribute($attr) && $oldAttr)
+ )) {
+ $event = new DOMEvent(array(
+ 'target' => $node,
+ 'type' => 'change'
+ ));
+ } else if ($isOption && $node->parentNode && $attr == 'selected' && (
+ // select
+ (! $oldAttr && $node->hasAttribute($attr))
+ // un-select
+ || (! $node->hasAttribute($attr) && $oldAttr)
+ )) {
+ $event = new DOMEvent(array(
+ 'target' => $node->parentNode,
+ 'type' => 'change'
+ ));
+ }
+ if ($event) {
+ phpQueryEvents::trigger($this->getDocumentID(),
+ $event->type, array($event), $node
+ );
+ }
+ }
+ public function attr($attr = null, $value = null) {
+ foreach($this->stack(1) as $node) {
+ if (! is_null($value)) {
+ $loop = $attr == '*'
+ ? $this->getNodeAttrs($node)
+ : array($attr);
+ foreach($loop as $a) {
+ $oldValue = $node->getAttribute($a);
+ $oldAttr = $node->hasAttribute($a);
+ // TODO raises an error when charset other than UTF-8
+ // while document's charset is also not UTF-8
+ @$node->setAttribute($a, $value);
+ $this->attrEvents($a, $oldAttr, $oldValue, $node);
+ }
+ } else if ($attr == '*') {
+ // jQuery difference
+ $return = array();
+ foreach($node->attributes as $n => $v)
+ $return[$n] = $v->value;
+ return $return;
+ } else
+ return $node->hasAttribute($attr)
+ ? $node->getAttribute($attr)
+ : null;
+ }
+ return is_null($value)
+ ? '' : $this;
+ }
+ /**
+ * @access private
+ */
+ protected function getNodeAttrs($node) {
+ $return = array();
+ foreach($node->attributes as $n => $o)
+ $return[] = $n;
+ return $return;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo check CDATA ???
+ */
+ public function attrPHP($attr, $code) {
+ if (! is_null($code)) {
+ $value = '<'.'?php '.$code.' ?'.'>';
+ // TODO tempolary solution
+ // http://code.google.com/p/phpquery/issues/detail?id=17
+// if (function_exists('mb_detect_encoding') && mb_detect_encoding($value) == 'ASCII')
+// $value = mb_convert_encoding($value, 'UTF-8', 'HTML-ENTITIES');
+ }
+ foreach($this->stack(1) as $node) {
+ if (! is_null($code)) {
+// $attrNode = $this->DOM->createAttribute($attr);
+ $node->setAttribute($attr, $value);
+// $attrNode->value = $value;
+// $node->appendChild($attrNode);
+ } else if ( $attr == '*') {
+ // jQuery diff
+ $return = array();
+ foreach($node->attributes as $n => $v)
+ $return[$n] = $v->value;
+ return $return;
+ } else
+ return $node->getAttribute($attr);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function removeAttr($attr) {
+ foreach($this->stack(1) as $node) {
+ $loop = $attr == '*'
+ ? $this->getNodeAttrs($node)
+ : array($attr);
+ foreach($loop as $a) {
+ $oldValue = $node->getAttribute($a);
+ $node->removeAttribute($a);
+ $this->attrEvents($a, $oldValue, null, $node);
+ }
+ }
+ return $this;
+ }
+ /**
+ * Return form element value.
+ *
+ * @return String Fields value.
+ */
+ public function val($val = null) {
+ if (! isset($val)) {
+ if ($this->eq(0)->is('select')) {
+ $selected = $this->eq(0)->find('option[selected=selected]');
+ if ($selected->is('[value]'))
+ return $selected->attr('value');
+ else
+ return $selected->text();
+ } else if ($this->eq(0)->is('textarea'))
+ return $this->eq(0)->markup();
+ else
+ return $this->eq(0)->attr('value');
+ } else {
+ $_val = null;
+ foreach($this->stack(1) as $node) {
+ $node = pq($node, $this->getDocumentID());
+ if (is_array($val) && in_array($node->attr('type'), array('checkbox', 'radio'))) {
+ $isChecked = in_array($node->attr('value'), $val)
+ || in_array($node->attr('name'), $val);
+ if ($isChecked)
+ $node->attr('checked', 'checked');
+ else
+ $node->removeAttr('checked');
+ } else if ($node->get(0)->tagName == 'select') {
+ if (! isset($_val)) {
+ $_val = array();
+ if (! is_array($val))
+ $_val = array((string)$val);
+ else
+ foreach($val as $v)
+ $_val[] = $v;
+ }
+ foreach($node['option']->stack(1) as $option) {
+ $option = pq($option, $this->getDocumentID());
+ $selected = false;
+ // XXX: workaround for string comparsion, see issue #96
+ // http://code.google.com/p/phpquery/issues/detail?id=96
+ $selected = is_null($option->attr('value'))
+ ? in_array($option->markup(), $_val)
+ : in_array($option->attr('value'), $_val);
+// $optionValue = $option->attr('value');
+// $optionText = $option->text();
+// $optionTextLenght = mb_strlen($optionText);
+// foreach($_val as $v)
+// if ($optionValue == $v)
+// $selected = true;
+// else if ($optionText == $v && $optionTextLenght == mb_strlen($v))
+// $selected = true;
+ if ($selected)
+ $option->attr('selected', 'selected');
+ else
+ $option->removeAttr('selected');
+ }
+ } else if ($node->get(0)->tagName == 'textarea')
+ $node->markup($val);
+ else
+ $node->attr('value', $val);
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function andSelf() {
+ if ( $this->previous )
+ $this->elements = array_merge($this->elements, $this->previous->elements);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function addClass( $className) {
+ if (! $className)
+ return $this;
+ foreach($this->stack(1) as $node) {
+ if (! $this->is(".$className", $node))
+ $node->setAttribute(
+ 'class',
+ trim($node->getAttribute('class').' '.$className)
+ );
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function addClassPHP( $className) {
+ foreach($this->stack(1) as $node) {
+ $classes = $node->getAttribute('class');
+ $newValue = $classes
+ ? $classes.' <'.'?php '.$className.' ?'.'>'
+ : '<'.'?php '.$className.' ?'.'>';
+ $node->setAttribute('class', $newValue);
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param string $className
+ * @return bool
+ */
+ public function hasClass($className) {
+ foreach($this->stack(1) as $node) {
+ if ( $this->is(".$className", $node))
+ return true;
+ }
+ return false;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function removeClass($className) {
+ foreach($this->stack(1) as $node) {
+ $classes = explode( ' ', $node->getAttribute('class'));
+ if ( in_array($className, $classes)) {
+ $classes = array_diff($classes, array($className));
+ if ( $classes )
+ $node->setAttribute('class', implode(' ', $classes));
+ else
+ $node->removeAttribute('class');
+ }
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function toggleClass($className) {
+ foreach($this->stack(1) as $node) {
+ if ( $this->is( $node, '.'.$className ))
+ $this->removeClass($className);
+ else
+ $this->addClass($className);
+ }
+ return $this;
+ }
+ /**
+ * Proper name without underscore (just ->empty()) also works.
+ *
+ * Removes all child nodes from the set of matched elements.
+ *
+ * Example:
+ * pq("p")._empty()
+ *
+ * HTML:
+ * <p>Hello, <span>Person</span> <a href="#">and person</a></p>
+ *
+ * Result:
+ * [ <p></p> ]
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @access private
+ */
+ public function _empty() {
+ foreach($this->stack(1) as $node) {
+ // thx to 'dave at dgx dot cz'
+ $node->nodeValue = '';
+ }
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param array|string $callback Expects $node as first param, $index as second
+ * @param array $scope External variables passed to callback. Use compact('varName1', 'varName2'...) and extract($scope)
+ * @param array $arg1 Will ba passed as third and futher args to callback.
+ * @param array $arg2 Will ba passed as fourth and futher args to callback, and so on...
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function each($callback, $param1 = null, $param2 = null, $param3 = null) {
+ $paramStructure = null;
+ if (func_num_args() > 1) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 1);
+ }
+ foreach($this->elements as $v)
+ phpQuery::callbackRun($callback, array($v), $paramStructure);
+ return $this;
+ }
+ /**
+ * Run callback on actual object.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function callback($callback, $param1 = null, $param2 = null, $param3 = null) {
+ $params = func_get_args();
+ $params[0] = $this;
+ phpQuery::callbackRun($callback, $params);
+ return $this;
+ }
+ /**
+ * Enter description here...
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @todo add $scope and $args as in each() ???
+ */
+ public function map($callback, $param1 = null, $param2 = null, $param3 = null) {
+// $stack = array();
+//// foreach($this->newInstance() as $node) {
+// foreach($this->newInstance() as $node) {
+// $result = call_user_func($callback, $node);
+// if ($result)
+// $stack[] = $result;
+// }
+ $params = func_get_args();
+ array_unshift($params, $this->elements);
+ return $this->newInstance(
+ call_user_func_array(array('phpQuery', 'map'), $params)
+// phpQuery::map($this->elements, $callback)
+ );
+ }
+ /**
+ * Enter description here...
+ *
+ * @param <type> $key
+ * @param <type> $value
+ */
+ public function data($key, $value = null) {
+ if (! isset($value)) {
+ // TODO? implement specific jQuery behavior od returning parent values
+ // is child which we look up doesn't exist
+ return phpQuery::data($this->get(0), $key, $value, $this->getDocumentID());
+ } else {
+ foreach($this as $node)
+ phpQuery::data($node, $key, $value, $this->getDocumentID());
+ return $this;
+ }
+ }
+ /**
+ * Enter description here...
+ *
+ * @param <type> $key
+ */
+ public function removeData($key) {
+ foreach($this as $node)
+ phpQuery::removeData($node, $key, $this->getDocumentID());
+ return $this;
+ }
+ // INTERFACE IMPLEMENTATIONS
+
+ // ITERATOR INTERFACE
+ /**
+ * @access private
+ */
+ public function rewind(){
+ $this->debug('iterating foreach');
+// phpQuery::selectDocument($this->getDocumentID());
+ $this->elementsBackup = $this->elements;
+ $this->elementsInterator = $this->elements;
+ $this->valid = isset( $this->elements[0] )
+ ? 1 : 0;
+// $this->elements = $this->valid
+// ? array($this->elements[0])
+// : array();
+ $this->current = 0;
+ }
+ /**
+ * @access private
+ */
+ public function current(){
+ return $this->elementsInterator[ $this->current ];
+ }
+ /**
+ * @access private
+ */
+ public function key(){
+ return $this->current;
+ }
+ /**
+ * Double-function method.
+ *
+ * First: main iterator interface method.
+ * Second: Returning next sibling, alias for _next().
+ *
+ * Proper functionality is choosed automagicaly.
+ *
+ * @see phpQueryObject::_next()
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public function next($cssSelector = null){
+// if ($cssSelector || $this->valid)
+// return $this->_next($cssSelector);
+ $this->valid = isset( $this->elementsInterator[ $this->current+1 ] )
+ ? true
+ : false;
+ if (! $this->valid && $this->elementsInterator) {
+ $this->elementsInterator = null;
+ } else if ($this->valid) {
+ $this->current++;
+ } else {
+ return $this->_next($cssSelector);
+ }
+ }
+ /**
+ * @access private
+ */
+ public function valid(){
+ return $this->valid;
+ }
+ // ITERATOR INTERFACE END
+ // ARRAYACCESS INTERFACE
+ /**
+ * @access private
+ */
+ public function offsetExists($offset) {
+ return $this->find($offset)->size() > 0;
+ }
+ /**
+ * @access private
+ */
+ public function offsetGet($offset) {
+ return $this->find($offset);
+ }
+ /**
+ * @access private
+ */
+ public function offsetSet($offset, $value) {
+// $this->find($offset)->replaceWith($value);
+ $this->find($offset)->html($value);
+ }
+ /**
+ * @access private
+ */
+ public function offsetUnset($offset) {
+ // empty
+ throw new Exception("Can't do unset, use array interface only for calling queries and replacing HTML.");
+ }
+ // ARRAYACCESS INTERFACE END
+ /**
+ * Returns node's XPath.
+ *
+ * @param unknown_type $oneNode
+ * @return string
+ * @TODO use native getNodePath is avaible
+ * @access private
+ */
+ protected function getNodeXpath($oneNode = null, $namespace = null) {
+ $return = array();
+ $loop = $oneNode
+ ? array($oneNode)
+ : $this->elements;
+// if ($namespace)
+// $namespace .= ':';
+ foreach($loop as $node) {
+ if ($node instanceof DOMDOCUMENT) {
+ $return[] = '';
+ continue;
+ }
+ $xpath = array();
+ while(! ($node instanceof DOMDOCUMENT)) {
+ $i = 1;
+ $sibling = $node;
+ while($sibling->previousSibling) {
+ $sibling = $sibling->previousSibling;
+ $isElement = $sibling instanceof DOMELEMENT;
+ if ($isElement && $sibling->tagName == $node->tagName)
+ $i++;
+ }
+ $xpath[] = $this->isXML()
+ ? "*[local-name()='{$node->tagName}'][{$i}]"
+ : "{$node->tagName}[{$i}]";
+ $node = $node->parentNode;
+ }
+ $xpath = join('/', array_reverse($xpath));
+ $return[] = '/'.$xpath;
+ }
+ return $oneNode
+ ? $return[0]
+ : $return;
+ }
+ // HELPERS
+ public function whois($oneNode = null) {
+ $return = array();
+ $loop = $oneNode
+ ? array( $oneNode )
+ : $this->elements;
+ foreach($loop as $node) {
+ if (isset($node->tagName)) {
+ $tag = in_array($node->tagName, array('php', 'js'))
+ ? strtoupper($node->tagName)
+ : $node->tagName;
+ $return[] = $tag
+ .($node->getAttribute('id')
+ ? '#'.$node->getAttribute('id'):'')
+ .($node->getAttribute('class')
+ ? '.'.join('.', split(' ', $node->getAttribute('class'))):'')
+ .($node->getAttribute('name')
+ ? '[name="'.$node->getAttribute('name').'"]':'')
+ .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') === false
+ ? '[value="'.substr(str_replace("\n", '', $node->getAttribute('value')), 0, 15).'"]':'')
+ .($node->getAttribute('value') && strpos($node->getAttribute('value'), '<'.'?php') !== false
+ ? '[value=PHP]':'')
+ .($node->getAttribute('selected')
+ ? '[selected]':'')
+ .($node->getAttribute('checked')
+ ? '[checked]':'')
+ ;
+ } else if ($node instanceof DOMTEXT) {
+ if (trim($node->textContent))
+ $return[] = 'Text:'.substr(str_replace("\n", ' ', $node->textContent), 0, 15);
+ } else {
+
+ }
+ }
+ return $oneNode && isset($return[0])
+ ? $return[0]
+ : $return;
+ }
+ /**
+ * Dump htmlOuter and preserve chain. Usefull for debugging.
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ *
+ */
+ public function dump() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump($this->htmlOuter());
+ return $this;
+ }
+ public function dumpWhois() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump('whois', $this->whois());
+ phpQuery::$debug = $debug;
+ return $this;
+ }
+ public function dumpLength() {
+ print 'DUMP #'.(phpQuery::$dumpCount++).' ';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+// print __FILE__.':'.__LINE__."\n";
+ var_dump('length', $this->length());
+ phpQuery::$debug = $debug;
+ return $this;
+ }
+ public function dumpTree($html = true, $title = true) {
+ $output = $title
+ ? 'DUMP #'.(phpQuery::$dumpCount++)." \n" : '';
+ $debug = phpQuery::$debug;
+ phpQuery::$debug = false;
+ foreach($this->stack() as $node)
+ $output .= $this->__dumpTree($node);
+ phpQuery::$debug = $debug;
+ print $html
+ ? nl2br(str_replace(' ', '&nbsp;', $output))
+ : $output;
+ return $this;
+ }
+ private function __dumpTree($node, $intend = 0) {
+ $whois = $this->whois($node);
+ $return = '';
+ if ($whois)
+ $return .= str_repeat(' - ', $intend).$whois."\n";
+ if (isset($node->childNodes))
+ foreach($node->childNodes as $chNode)
+ $return .= $this->__dumpTree($chNode, $intend+1);
+ return $return;
+ }
+ /**
+ * Dump htmlOuter and stop script execution. Usefull for debugging.
+ *
+ */
+ public function dumpDie() {
+ print __FILE__.':'.__LINE__;
+ var_dump($this->htmlOuter());
+ die();
+ }
+}
+
+
+// -- Multibyte Compatibility functions ---------------------------------------
+// http://svn.iphonewebdev.com/lace/lib/mb_compat.php
+
+/**
+ * mb_internal_encoding()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_internal_encoding'))
+{
+ function mb_internal_encoding($enc) {return true; }
+}
+
+/**
+ * mb_regex_encoding()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_regex_encoding'))
+{
+ function mb_regex_encoding($enc) {return true; }
+}
+
+/**
+ * mb_strlen()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_strlen'))
+{
+ function mb_strlen($str)
+ {
+ return strlen($str);
+ }
+}
+
+/**
+ * mb_strpos()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_strpos'))
+{
+ function mb_strpos($haystack, $needle, $offset=0)
+ {
+ return strpos($haystack, $needle, $offset);
+ }
+}
+/**
+ * mb_stripos()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_stripos'))
+{
+ function mb_stripos($haystack, $needle, $offset=0)
+ {
+ return stripos($haystack, $needle, $offset);
+ }
+}
+
+/**
+ * mb_substr()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_substr'))
+{
+ function mb_substr($str, $start, $length=0)
+ {
+ return substr($str, $start, $length);
+ }
+}
+
+/**
+ * mb_substr_count()
+ *
+ * Included for mbstring pseudo-compatability.
+ */
+if (!function_exists('mb_substr_count'))
+{
+ function mb_substr_count($haystack, $needle)
+ {
+ return substr_count($haystack, $needle);
+ }
+}
+
+
+/**
+ * Static namespace for phpQuery functions.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+abstract class phpQuery {
+ /**
+ * XXX: Workaround for mbstring problems
+ *
+ * @var bool
+ */
+ public static $mbstringSupport = true;
+ public static $debug = false;
+ public static $documents = array();
+ public static $defaultDocumentID = null;
+// public static $defaultDoctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"';
+ /**
+ * Applies only to HTML.
+ *
+ * @var unknown_type
+ */
+ public static $defaultDoctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">';
+ public static $defaultCharset = 'UTF-8';
+ /**
+ * Static namespace for plugins.
+ *
+ * @var object
+ */
+ public static $plugins = array();
+ /**
+ * List of loaded plugins.
+ *
+ * @var unknown_type
+ */
+ public static $pluginsLoaded = array();
+ public static $pluginsMethods = array();
+ public static $pluginsStaticMethods = array();
+ public static $extendMethods = array();
+ /**
+ * @TODO implement
+ */
+ public static $extendStaticMethods = array();
+ /**
+ * Hosts allowed for AJAX connections.
+ * Dot '.' means $_SERVER['HTTP_HOST'] (if any).
+ *
+ * @var array
+ */
+ public static $ajaxAllowedHosts = array(
+ '.'
+ );
+ /**
+ * AJAX settings.
+ *
+ * @var array
+ * XXX should it be static or not ?
+ */
+ public static $ajaxSettings = array(
+ 'url' => '',//TODO
+ 'global' => true,
+ 'type' => "GET",
+ 'timeout' => null,
+ 'contentType' => "application/x-www-form-urlencoded",
+ 'processData' => true,
+// 'async' => true,
+ 'data' => null,
+ 'username' => null,
+ 'password' => null,
+ 'accepts' => array(
+ 'xml' => "application/xml, text/xml",
+ 'html' => "text/html",
+ 'script' => "text/javascript, application/javascript",
+ 'json' => "application/json, text/javascript",
+ 'text' => "text/plain",
+ '_default' => "*/*"
+ )
+ );
+ public static $lastModified = null;
+ public static $active = 0;
+ public static $dumpCount = 0;
+ /**
+ * Multi-purpose function.
+ * Use pq() as shortcut.
+ *
+ * In below examples, $pq is any result of pq(); function.
+ *
+ * 1. Import markup into existing document (without any attaching):
+ * - Import into selected document:
+ * pq('<div/>') // DOESNT accept text nodes at beginning of input string !
+ * - Import into document with ID from $pq->getDocumentID():
+ * pq('<div/>', $pq->getDocumentID())
+ * - Import into same document as DOMNode belongs to:
+ * pq('<div/>', DOMNode)
+ * - Import into document from phpQuery object:
+ * pq('<div/>', $pq)
+ *
+ * 2. Run query:
+ * - Run query on last selected document:
+ * pq('div.myClass')
+ * - Run query on document with ID from $pq->getDocumentID():
+ * pq('div.myClass', $pq->getDocumentID())
+ * - Run query on same document as DOMNode belongs to and use node(s)as root for query:
+ * pq('div.myClass', DOMNode)
+ * - Run query on document from phpQuery object
+ * and use object's stack as root node(s) for query:
+ * pq('div.myClass', $pq)
+ *
+ * @param string|DOMNode|DOMNodeList|array $arg1 HTML markup, CSS Selector, DOMNode or array of DOMNodes
+ * @param string|phpQueryObject|DOMNode $context DOM ID from $pq->getDocumentID(), phpQuery object (determines also query root) or DOMNode (determines also query root)
+ *
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery|QueryTemplatesPhpQuery|false
+ * phpQuery object or false in case of error.
+ */
+ public static function pq($arg1, $context = null) {
+ if ($arg1 instanceof DOMNODE && ! isset($context)) {
+ foreach(phpQuery::$documents as $documentWrapper) {
+ $compare = $arg1 instanceof DOMDocument
+ ? $arg1 : $arg1->ownerDocument;
+ if ($documentWrapper->document->isSameNode($compare))
+ $context = $documentWrapper->id;
+ }
+ }
+ if (! $context) {
+ $domId = self::$defaultDocumentID;
+ if (! $domId)
+ throw new Exception("Can't use last created DOM, because there isn't any. Use phpQuery::newDocument() first.");
+// } else if (is_object($context) && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject')))
+ } else if (is_object($context) && $context instanceof phpQueryObject)
+ $domId = $context->getDocumentID();
+ else if ($context instanceof DOMDOCUMENT) {
+ $domId = self::getDocumentID($context);
+ if (! $domId) {
+ //throw new Exception('Orphaned DOMDocument');
+ $domId = self::newDocument($context)->getDocumentID();
+ }
+ } else if ($context instanceof DOMNODE) {
+ $domId = self::getDocumentID($context);
+ if (! $domId) {
+ throw new Exception('Orphaned DOMNode');
+// $domId = self::newDocument($context->ownerDocument);
+ }
+ } else
+ $domId = $context;
+ if ($arg1 instanceof phpQueryObject) {
+// if (is_object($arg1) && (get_class($arg1) == 'phpQueryObject' || $arg1 instanceof PHPQUERY || is_subclass_of($arg1, 'phpQueryObject'))) {
+ /**
+ * Return $arg1 or import $arg1 stack if document differs:
+ * pq(pq('<div/>'))
+ */
+ if ($arg1->getDocumentID() == $domId)
+ return $arg1;
+ $class = get_class($arg1);
+ // support inheritance by passing old object to overloaded constructor
+ $phpQuery = $class != 'phpQuery'
+ ? new $class($arg1, $domId)
+ : new phpQueryObject($domId);
+ $phpQuery->elements = array();
+ foreach($arg1->elements as $node)
+ $phpQuery->elements[] = $phpQuery->document->importNode($node, true);
+ return $phpQuery;
+ } else if ($arg1 instanceof DOMNODE || (is_array($arg1) && isset($arg1[0]) && $arg1[0] instanceof DOMNODE)) {
+ /*
+ * Wrap DOM nodes with phpQuery object, import into document when needed:
+ * pq(array($domNode1, $domNode2))
+ */
+ $phpQuery = new phpQueryObject($domId);
+ if (!($arg1 instanceof DOMNODELIST) && ! is_array($arg1))
+ $arg1 = array($arg1);
+ $phpQuery->elements = array();
+ foreach($arg1 as $node) {
+ $sameDocument = $node->ownerDocument instanceof DOMDOCUMENT
+ && ! $node->ownerDocument->isSameNode($phpQuery->document);
+ $phpQuery->elements[] = $sameDocument
+ ? $phpQuery->document->importNode($node, true)
+ : $node;
+ }
+ return $phpQuery;
+ } else if (self::isMarkup($arg1)) {
+ /**
+ * Import HTML:
+ * pq('<div/>')
+ */
+ $phpQuery = new phpQueryObject($domId);
+ return $phpQuery->newInstance(
+ $phpQuery->documentWrapper->import($arg1)
+ );
+ } else {
+ /**
+ * Run CSS query:
+ * pq('div.myClass')
+ */
+ $phpQuery = new phpQueryObject($domId);
+// if ($context && ($context instanceof PHPQUERY || is_subclass_of($context, 'phpQueryObject')))
+ if ($context && $context instanceof phpQueryObject)
+ $phpQuery->elements = $context->elements;
+ else if ($context && $context instanceof DOMNODELIST) {
+ $phpQuery->elements = array();
+ foreach($context as $node)
+ $phpQuery->elements[] = $node;
+ } else if ($context && $context instanceof DOMNODE)
+ $phpQuery->elements = array($context);
+ return $phpQuery->find($arg1);
+ }
+ }
+ /**
+ * Sets default document to $id. Document has to be loaded prior
+ * to using this method.
+ * $id can be retrived via getDocumentID() or getDocumentIDRef().
+ *
+ * @param unknown_type $id
+ */
+ public static function selectDocument($id) {
+ $id = self::getDocumentID($id);
+ self::debug("Selecting document '$id' as default one");
+ self::$defaultDocumentID = self::getDocumentID($id);
+ }
+ /**
+ * Returns document with id $id or last used as phpQueryObject.
+ * $id can be retrived via getDocumentID() or getDocumentIDRef().
+ * Chainable.
+ *
+ * @see phpQuery::selectDocument()
+ * @param unknown_type $id
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function getDocument($id = null) {
+ if ($id)
+ phpQuery::selectDocument($id);
+ else
+ $id = phpQuery::$defaultDocumentID;
+ return new phpQueryObject($id);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocument($markup = null, $contentType = null) {
+ if (! $markup)
+ $markup = '';
+ $documentID = phpQuery::createDocumentWrapper($markup, $contentType);
+ return new phpQueryObject($documentID);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentHTML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "text/html{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentXML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "text/xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentXHTML($markup = null, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocument($markup, "application/xhtml+xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentPHP($markup = null, $contentType = "text/html") {
+ // TODO pass charset to phpToMarkup if possible (use DOMDocumentWrapper function)
+ $markup = phpQuery::phpToMarkup($markup, self::$defaultCharset);
+ return self::newDocument($markup, $contentType);
+ }
+ public static function phpToMarkup($php, $charset = 'utf-8') {
+ $regexes = array(
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)<'.'?php?(.*?)(?:\\?>)([^\']*)\'@s',
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)<'.'?php?(.*?)(?:\\?>)([^"]*)"@s',
+ );
+ foreach($regexes as $regex)
+ while (preg_match($regex, $php, $matches)) {
+ $php = preg_replace_callback(
+ $regex,
+// create_function('$m, $charset = "'.$charset.'"',
+// 'return $m[1].$m[2]
+// .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset)
+// .$m[5].$m[2];'
+// ),
+ array('phpQuery', '_phpToMarkupCallback'),
+ $php
+ );
+ }
+ $regex = '@(^|>[^<]*)+?(<\?php(.*?)(\?>))@s';
+//preg_match_all($regex, $php, $matches);
+//var_dump($matches);
+ $php = preg_replace($regex, '\\1<php><!-- \\3 --></php>', $php);
+ return $php;
+ }
+ public static function _phpToMarkupCallback($php, $charset = 'utf-8') {
+ return $m[1].$m[2]
+ .htmlspecialchars("<"."?php".$m[4]."?".">", ENT_QUOTES|ENT_NOQUOTES, $charset)
+ .$m[5].$m[2];
+ }
+ public static function _markupToPHPCallback($m) {
+ return "<"."?php ".htmlspecialchars_decode($m[1])." ?".">";
+ }
+ /**
+ * Converts document markup containing PHP code generated by phpQuery::php()
+ * into valid (executable) PHP code syntax.
+ *
+ * @param string|phpQueryObject $content
+ * @return string PHP code.
+ */
+ public static function markupToPHP($content) {
+ if ($content instanceof phpQueryObject)
+ $content = $content->markupOuter();
+ /* <php>...</php> to <?php...? > */
+ $content = preg_replace_callback(
+ '@<php>\s*<!--(.*?)-->\s*</php>@s',
+// create_function('$m',
+// 'return "<'.'?php ".htmlspecialchars_decode($m[1])." ?'.'>";'
+// ),
+ array('phpQuery', '_markupToPHPCallback'),
+ $content
+ );
+ /* <node attr='< ?php ? >'> extra space added to save highlighters */
+ $regexes = array(
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(\')([^\']*)(?:&lt;|%3C)\\?(?:php)?(.*?)(?:\\?(?:&gt;|%3E))([^\']*)\'@s',
+ '@(<(?!\\?)(?:[^>]|\\?>)+\\w+\\s*=\\s*)(")([^"]*)(?:&lt;|%3C)\\?(?:php)?(.*?)(?:\\?(?:&gt;|%3E))([^"]*)"@s',
+ );
+ foreach($regexes as $regex)
+ while (preg_match($regex, $content))
+ $content = preg_replace_callback(
+ $regex,
+ create_function('$m',
+ 'return $m[1].$m[2].$m[3]."<?php "
+ .str_replace(
+ array("%20", "%3E", "%09", "&#10;", "&#9;", "%7B", "%24", "%7D", "%22", "%5B", "%5D"),
+ array(" ", ">", " ", "\n", " ", "{", "$", "}", \'"\', "[", "]"),
+ htmlspecialchars_decode($m[4])
+ )
+ ." ?>".$m[5].$m[2];'
+ ),
+ $content
+ );
+ return $content;
+ }
+ /**
+ * Creates new document from file $file.
+ * Chainable.
+ *
+ * @param string $file URLs allowed. See File wrapper page at php.net for more supported sources.
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFile($file, $contentType = null) {
+ $documentID = self::createDocumentWrapper(
+ file_get_contents($file), $contentType
+ );
+ return new phpQueryObject($documentID);
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileHTML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "text/html{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileXML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "text/xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFileXHTML($file, $charset = null) {
+ $contentType = $charset
+ ? ";charset=$charset"
+ : '';
+ return self::newDocumentFile($file, "application/xhtml+xml{$contentType}");
+ }
+ /**
+ * Creates new document from markup.
+ * Chainable.
+ *
+ * @param unknown_type $markup
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ */
+ public static function newDocumentFilePHP($file, $contentType = null) {
+ return self::newDocumentPHP(file_get_contents($file), $contentType);
+ }
+ /**
+ * Reuses existing DOMDocument object.
+ * Chainable.
+ *
+ * @param $document DOMDocument
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @TODO support DOMDocument
+ */
+ public static function loadDocument($document) {
+ // TODO
+ die('TODO loadDocument');
+ }
+ /**
+ * Enter description here...
+ *
+ * @param unknown_type $html
+ * @param unknown_type $domId
+ * @return unknown New DOM ID
+ * @todo support PHP tags in input
+ * @todo support passing DOMDocument object from self::loadDocument
+ */
+ protected static function createDocumentWrapper($html, $contentType = null, $documentID = null) {
+ if (function_exists('domxml_open_mem'))
+ throw new Exception("Old PHP4 DOM XML extension detected. phpQuery won't work until this extension is enabled.");
+// $id = $documentID
+// ? $documentID
+// : md5(microtime());
+ $document = null;
+ if ($html instanceof DOMDOCUMENT) {
+ if (self::getDocumentID($html)) {
+ // document already exists in phpQuery::$documents, make a copy
+ $document = clone $html;
+ } else {
+ // new document, add it to phpQuery::$documents
+ $wrapper = new DOMDocumentWrapper($html, $contentType, $documentID);
+ }
+ } else {
+ $wrapper = new DOMDocumentWrapper($html, $contentType, $documentID);
+ }
+// $wrapper->id = $id;
+ // bind document
+ phpQuery::$documents[$wrapper->id] = $wrapper;
+ // remember last loaded document
+ phpQuery::selectDocument($wrapper->id);
+ return $wrapper->id;
+ }
+ /**
+ * Extend class namespace.
+ *
+ * @param string|array $target
+ * @param array $source
+ * @TODO support string $source
+ * @return unknown_type
+ */
+ public static function extend($target, $source) {
+ switch($target) {
+ case 'phpQueryObject':
+ $targetRef = &self::$extendMethods;
+ $targetRef2 = &self::$pluginsMethods;
+ break;
+ case 'phpQuery':
+ $targetRef = &self::$extendStaticMethods;
+ $targetRef2 = &self::$pluginsStaticMethods;
+ break;
+ default:
+ throw new Exception("Unsupported \$target type");
+ }
+ if (is_string($source))
+ $source = array($source => $source);
+ foreach($source as $method => $callback) {
+ if (isset($targetRef[$method])) {
+// throw new Exception
+ self::debug("Duplicate method '{$method}', can\'t extend '{$target}'");
+ continue;
+ }
+ if (isset($targetRef2[$method])) {
+// throw new Exception
+ self::debug("Duplicate method '{$method}' from plugin '{$targetRef2[$method]}',"
+ ." can\'t extend '{$target}'");
+ continue;
+ }
+ $targetRef[$method] = $callback;
+ }
+ return true;
+ }
+ /**
+ * Extend phpQuery with $class from $file.
+ *
+ * @param string $class Extending class name. Real class name can be prepended phpQuery_.
+ * @param string $file Filename to include. Defaults to "{$class}.php".
+ */
+ public static function plugin($class, $file = null) {
+ // TODO $class checked agains phpQuery_$class
+// if (strpos($class, 'phpQuery') === 0)
+// $class = substr($class, 8);
+ if (in_array($class, self::$pluginsLoaded))
+ return true;
+ if (! $file)
+ $file = $class.'.php';
+ $objectClassExists = class_exists('phpQueryObjectPlugin_'.$class);
+ $staticClassExists = class_exists('phpQueryPlugin_'.$class);
+ if (! $objectClassExists && ! $staticClassExists)
+ require_once($file);
+ self::$pluginsLoaded[] = $class;
+ // static methods
+ if (class_exists('phpQueryPlugin_'.$class)) {
+ $realClass = 'phpQueryPlugin_'.$class;
+ $vars = get_class_vars($realClass);
+ $loop = isset($vars['phpQueryMethods'])
+ && ! is_null($vars['phpQueryMethods'])
+ ? $vars['phpQueryMethods']
+ : get_class_methods($realClass);
+ foreach($loop as $method) {
+ if ($method == '__initialize')
+ continue;
+ if (! is_callable(array($realClass, $method)))
+ continue;
+ if (isset(self::$pluginsStaticMethods[$method])) {
+ throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsStaticMethods[$method]."'");
+ return;
+ }
+ self::$pluginsStaticMethods[$method] = $class;
+ }
+ if (method_exists($realClass, '__initialize'))
+ call_user_func_array(array($realClass, '__initialize'), array());
+ }
+ // object methods
+ if (class_exists('phpQueryObjectPlugin_'.$class)) {
+ $realClass = 'phpQueryObjectPlugin_'.$class;
+ $vars = get_class_vars($realClass);
+ $loop = isset($vars['phpQueryMethods'])
+ && ! is_null($vars['phpQueryMethods'])
+ ? $vars['phpQueryMethods']
+ : get_class_methods($realClass);
+ foreach($loop as $method) {
+ if (! is_callable(array($realClass, $method)))
+ continue;
+ if (isset(self::$pluginsMethods[$method])) {
+ throw new Exception("Duplicate method '{$method}' from plugin '{$c}' conflicts with same method from plugin '".self::$pluginsMethods[$method]."'");
+ continue;
+ }
+ self::$pluginsMethods[$method] = $class;
+ }
+ }
+ return true;
+ }
+ /**
+ * Unloades all or specified document from memory.
+ *
+ * @param mixed $documentID @see phpQuery::getDocumentID() for supported types.
+ */
+ public static function unloadDocuments($id = null) {
+ if (isset($id)) {
+ if ($id = self::getDocumentID($id))
+ unset(phpQuery::$documents[$id]);
+ } else {
+ foreach(phpQuery::$documents as $k => $v) {
+ unset(phpQuery::$documents[$k]);
+ }
+ }
+ }
+ /**
+ * Parses phpQuery object or HTML result against PHP tags and makes them active.
+ *
+ * @param phpQuery|string $content
+ * @deprecated
+ * @return string
+ */
+ public static function unsafePHPTags($content) {
+ return self::markupToPHP($content);
+ }
+ public static function DOMNodeListToArray($DOMNodeList) {
+ $array = array();
+ if (! $DOMNodeList)
+ return $array;
+ foreach($DOMNodeList as $node)
+ $array[] = $node;
+ return $array;
+ }
+ /**
+ * Checks if $input is HTML string, which has to start with '<'.
+ *
+ * @deprecated
+ * @param String $input
+ * @return Bool
+ * @todo still used ?
+ */
+ public static function isMarkup($input) {
+ return ! is_array($input) && substr(trim($input), 0, 1) == '<';
+ }
+ public static function debug($text) {
+ if (self::$debug)
+ print var_dump($text);
+ }
+ /**
+ * Make an AJAX request.
+ *
+ * @param array See $options http://docs.jquery.com/Ajax/jQuery.ajax#toptions
+ * Additional options are:
+ * 'document' - document for global events, @see phpQuery::getDocumentID()
+ * 'referer' - implemented
+ * 'requested_with' - TODO; not implemented (X-Requested-With)
+ * @return Zend_Http_Client
+ * @link http://docs.jquery.com/Ajax/jQuery.ajax
+ *
+ * @TODO $options['cache']
+ * @TODO $options['processData']
+ * @TODO $options['xhr']
+ * @TODO $options['data'] as string
+ * @TODO XHR interface
+ */
+ public static function ajax($options = array(), $xhr = null) {
+ $options = array_merge(
+ self::$ajaxSettings, $options
+ );
+ $documentID = isset($options['document'])
+ ? self::getDocumentID($options['document'])
+ : null;
+ if ($xhr) {
+ // reuse existing XHR object, but clean it up
+ $client = $xhr;
+// $client->setParameterPost(null);
+// $client->setParameterGet(null);
+ $client->setAuth(false);
+ $client->setHeaders("If-Modified-Since", null);
+ $client->setHeaders("Referer", null);
+ $client->resetParameters();
+ } else {
+ // create new XHR object
+ require_once('Zend/Http/Client.php');
+ $client = new Zend_Http_Client();
+ $client->setCookieJar();
+ }
+ if (isset($options['timeout']))
+ $client->setConfig(array(
+ 'timeout' => $options['timeout'],
+ ));
+// 'maxredirects' => 0,
+ foreach(self::$ajaxAllowedHosts as $k => $host)
+ if ($host == '.' && isset($_SERVER['HTTP_HOST']))
+ self::$ajaxAllowedHosts[$k] = $_SERVER['HTTP_HOST'];
+ $host = parse_url($options['url'], PHP_URL_HOST);
+ if (! in_array($host, self::$ajaxAllowedHosts)) {
+ throw new Exception("Request not permitted, host '$host' not present in "
+ ."phpQuery::\$ajaxAllowedHosts");
+ }
+ // JSONP
+ $jsre = "/=\\?(&|$)/";
+ if (isset($options['dataType']) && $options['dataType'] == 'jsonp') {
+ $jsonpCallbackParam = $options['jsonp']
+ ? $options['jsonp'] : 'callback';
+ if (strtolower($options['type']) == 'get') {
+ if (! preg_match($jsre, $options['url'])) {
+ $sep = strpos($options['url'], '?')
+ ? '&' : '?';
+ $options['url'] .= "$sep$jsonpCallbackParam=?";
+ }
+ } else if ($options['data']) {
+ $jsonp = false;
+ foreach($options['data'] as $n => $v) {
+ if ($v == '?')
+ $jsonp = true;
+ }
+ if (! $jsonp) {
+ $options['data'][$jsonpCallbackParam] = '?';
+ }
+ }
+ $options['dataType'] = 'json';
+ }
+ if (isset($options['dataType']) && $options['dataType'] == 'json') {
+ $jsonpCallback = 'json_'.md5(microtime());
+ $jsonpData = $jsonpUrl = false;
+ if ($options['data']) {
+ foreach($options['data'] as $n => $v) {
+ if ($v == '?')
+ $jsonpData = $n;
+ }
+ }
+ if (preg_match($jsre, $options['url']))
+ $jsonpUrl = true;
+ if ($jsonpData !== false || $jsonpUrl) {
+ // remember callback name for httpData()
+ $options['_jsonp'] = $jsonpCallback;
+ if ($jsonpData !== false)
+ $options['data'][$jsonpData] = $jsonpCallback;
+ if ($jsonpUrl)
+ $options['url'] = preg_replace($jsre, "=$jsonpCallback\\1", $options['url']);
+ }
+ }
+ $client->setUri($options['url']);
+ $client->setMethod(strtoupper($options['type']));
+ if (isset($options['referer']) && $options['referer'])
+ $client->setHeaders('Referer', $options['referer']);
+ $client->setHeaders(array(
+// 'content-type' => $options['contentType'],
+ 'User-Agent' => 'Mozilla/5.0 (X11; U; Linux x86; en-US; rv:1.9.0.5) Gecko'
+ .'/2008122010 Firefox/3.0.5',
+ // TODO custom charset
+ 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
+// 'Connection' => 'keep-alive',
+// 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Language' => 'en-us,en;q=0.5',
+ ));
+ if ($options['username'])
+ $client->setAuth($options['username'], $options['password']);
+ if (isset($options['ifModified']) && $options['ifModified'])
+ $client->setHeaders("If-Modified-Since",
+ self::$lastModified
+ ? self::$lastModified
+ : "Thu, 01 Jan 1970 00:00:00 GMT"
+ );
+ $client->setHeaders("Accept",
+ isset($options['dataType'])
+ && isset(self::$ajaxSettings['accepts'][ $options['dataType'] ])
+ ? self::$ajaxSettings['accepts'][ $options['dataType'] ].", */*"
+ : self::$ajaxSettings['accepts']['_default']
+ );
+ // TODO $options['processData']
+ if ($options['data'] instanceof phpQueryObject) {
+ $serialized = $options['data']->serializeArray($options['data']);
+ $options['data'] = array();
+ foreach($serialized as $r)
+ $options['data'][ $r['name'] ] = $r['value'];
+ }
+ if (strtolower($options['type']) == 'get') {
+ $client->setParameterGet($options['data']);
+ } else if (strtolower($options['type']) == 'post') {
+ $client->setEncType($options['contentType']);
+ $client->setParameterPost($options['data']);
+ }
+ if (self::$active == 0 && $options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxStart');
+ self::$active++;
+ // beforeSend callback
+ if (isset($options['beforeSend']) && $options['beforeSend'])
+ phpQuery::callbackRun($options['beforeSend'], array($client));
+ // ajaxSend event
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxSend', array($client, $options));
+ if (phpQuery::$debug) {
+ self::debug("{$options['type']}: {$options['url']}\n");
+ self::debug("Options: <pre>".var_export($options, true)."</pre>\n");
+// if ($client->getCookieJar())
+// self::debug("Cookies: <pre>".var_export($client->getCookieJar()->getMatchingCookies($options['url']), true)."</pre>\n");
+ }
+ // request
+ $response = $client->request();
+ if (phpQuery::$debug) {
+ self::debug('Status: '.$response->getStatus().' / '.$response->getMessage());
+ self::debug($client->getLastRequest());
+ self::debug($response->getHeaders());
+ }
+ if ($response->isSuccessful()) {
+ // XXX tempolary
+ self::$lastModified = $response->getHeader('Last-Modified');
+ $data = self::httpData($response->getBody(), $options['dataType'], $options);
+ if (isset($options['success']) && $options['success'])
+ phpQuery::callbackRun($options['success'], array($data, $response->getStatus(), $options));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxSuccess', array($client, $options));
+ } else {
+ if (isset($options['error']) && $options['error'])
+ phpQuery::callbackRun($options['error'], array($client, $response->getStatus(), $response->getMessage()));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxError', array($client, /*$response->getStatus(),*/$response->getMessage(), $options));
+ }
+ if (isset($options['complete']) && $options['complete'])
+ phpQuery::callbackRun($options['complete'], array($client, $response->getStatus()));
+ if ($options['global'])
+ phpQueryEvents::trigger($documentID, 'ajaxComplete', array($client, $options));
+ if ($options['global'] && ! --self::$active)
+ phpQueryEvents::trigger($documentID, 'ajaxStop');
+ return $client;
+// if (is_null($domId))
+// $domId = self::$defaultDocumentID ? self::$defaultDocumentID : false;
+// return new phpQueryAjaxResponse($response, $domId);
+ }
+ protected static function httpData($data, $type, $options) {
+ if (isset($options['dataFilter']) && $options['dataFilter'])
+ $data = self::callbackRun($options['dataFilter'], array($data, $type));
+ if (is_string($data)) {
+ if ($type == "json") {
+ if (isset($options['_jsonp']) && $options['_jsonp']) {
+ $data = preg_replace('/^\s*\w+\((.*)\)\s*$/s', '$1', $data);
+ }
+ $data = self::parseJSON($data);
+ }
+ }
+ return $data;
+ }
+ /**
+ * Enter description here...
+ *
+ * @param array|phpQuery $data
+ *
+ */
+ public static function param($data) {
+ return http_build_query($data, null, '&');
+ }
+ public static function get($url, $data = null, $callback = null, $type = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ // TODO some array_values on this shit
+ return phpQuery::ajax(array(
+ 'type' => 'GET',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => $type,
+ ));
+ }
+ public static function post($url, $data = null, $callback = null, $type = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ return phpQuery::ajax(array(
+ 'type' => 'POST',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => $type,
+ ));
+ }
+ public static function getJSON($url, $data = null, $callback = null) {
+ if (!is_array($data)) {
+ $callback = $data;
+ $data = null;
+ }
+ // TODO some array_values on this shit
+ return phpQuery::ajax(array(
+ 'type' => 'GET',
+ 'url' => $url,
+ 'data' => $data,
+ 'success' => $callback,
+ 'dataType' => 'json',
+ ));
+ }
+ public static function ajaxSetup($options) {
+ self::$ajaxSettings = array_merge(
+ self::$ajaxSettings,
+ $options
+ );
+ }
+ public static function ajaxAllowHost($host1, $host2 = null, $host3 = null) {
+ $loop = is_array($host1)
+ ? $host1
+ : func_get_args();
+ foreach($loop as $host) {
+ if ($host && ! in_array($host, phpQuery::$ajaxAllowedHosts)) {
+ phpQuery::$ajaxAllowedHosts[] = $host;
+ }
+ }
+ }
+ public static function ajaxAllowURL($url1, $url2 = null, $url3 = null) {
+ $loop = is_array($url1)
+ ? $url1
+ : func_get_args();
+ foreach($loop as $url)
+ phpQuery::ajaxAllowHost(parse_url($url, PHP_URL_HOST));
+ }
+ /**
+ * Returns JSON representation of $data.
+ *
+ * @static
+ * @param mixed $data
+ * @return string
+ */
+ public static function toJSON($data) {
+ if (function_exists('json_encode'))
+ return json_encode($data);
+ require_once('Zend/Json/Encoder.php');
+ return Zend_Json_Encoder::encode($data);
+ }
+ /**
+ * Parses JSON into proper PHP type.
+ *
+ * @static
+ * @param string $json
+ * @return mixed
+ */
+ public static function parseJSON($json) {
+ if (function_exists('json_decode')) {
+ $return = json_decode(trim($json), true);
+ // json_decode and UTF8 issues
+ if (isset($return))
+ return $return;
+ }
+ require_once('Zend/Json/Decoder.php');
+ return Zend_Json_Decoder::decode($json);
+ }
+ /**
+ * Returns source's document ID.
+ *
+ * @param $source DOMNode|phpQueryObject
+ * @return string
+ */
+ public static function getDocumentID($source) {
+ if ($source instanceof DOMDOCUMENT) {
+ foreach(phpQuery::$documents as $id => $document) {
+ if ($source->isSameNode($document->document))
+ return $id;
+ }
+ } else if ($source instanceof DOMNODE) {
+ foreach(phpQuery::$documents as $id => $document) {
+ if ($source->ownerDocument->isSameNode($document->document))
+ return $id;
+ }
+ } else if ($source instanceof phpQueryObject)
+ return $source->getDocumentID();
+ else if (is_string($source) && isset(phpQuery::$documents[$source]))
+ return $source;
+ }
+ /**
+ * Get DOMDocument object related to $source.
+ * Returns null if such document doesn't exist.
+ *
+ * @param $source DOMNode|phpQueryObject|string
+ * @return string
+ */
+ public static function getDOMDocument($source) {
+ if ($source instanceof DOMDOCUMENT)
+ return $source;
+ $source = self::getDocumentID($source);
+ return $source
+ ? self::$documents[$id]['document']
+ : null;
+ }
+
+ // UTILITIES
+ // http://docs.jquery.com/Utilities
+
+ /**
+ *
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.makeArray
+ */
+ public static function makeArray($obj) {
+ $array = array();
+ if (is_object($object) && $object instanceof DOMNODELIST) {
+ foreach($object as $value)
+ $array[] = $value;
+ } else if (is_object($object) && ! ($object instanceof Iterator)) {
+ foreach(get_object_vars($object) as $name => $value)
+ $array[0][$name] = $value;
+ } else {
+ foreach($object as $name => $value)
+ $array[0][$name] = $value;
+ }
+ return $array;
+ }
+ public static function inArray($value, $array) {
+ return in_array($value, $array);
+ }
+ /**
+ *
+ * @param $object
+ * @param $callback
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.each
+ */
+ public static function each($object, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ $paramStructure = null;
+ if (func_num_args() > 2) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 2);
+ }
+ if (is_object($object) && ! ($object instanceof Iterator)) {
+ foreach(get_object_vars($object) as $name => $value)
+ phpQuery::callbackRun($callback, array($name, $value), $paramStructure);
+ } else {
+ foreach($object as $name => $value)
+ phpQuery::callbackRun($callback, array($name, $value), $paramStructure);
+ }
+ }
+ /**
+ *
+ * @link http://docs.jquery.com/Utilities/jQuery.map
+ */
+ public static function map($array, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ $result = array();
+ $paramStructure = null;
+ if (func_num_args() > 2) {
+ $paramStructure = func_get_args();
+ $paramStructure = array_slice($paramStructure, 2);
+ }
+ foreach($array as $v) {
+ $vv = phpQuery::callbackRun($callback, array($v), $paramStructure);
+// $callbackArgs = $args;
+// foreach($args as $i => $arg) {
+// $callbackArgs[$i] = $arg instanceof CallbackParam
+// ? $v
+// : $arg;
+// }
+// $vv = call_user_func_array($callback, $callbackArgs);
+ if (is_array($vv)) {
+ foreach($vv as $vvv)
+ $result[] = $vvv;
+ } else if ($vv !== null) {
+ $result[] = $vv;
+ }
+ }
+ return $result;
+ }
+ /**
+ *
+ * @param $callback Callback
+ * @param $params
+ * @param $paramStructure
+ * @return unknown_type
+ */
+ public static function callbackRun($callback, $params = array(), $paramStructure = null) {
+ if (! $callback)
+ return;
+ if ($callback instanceof CallbackParameterToReference) {
+ // TODO support ParamStructure to select which $param push to reference
+ if (isset($params[0]))
+ $callback->callback = $params[0];
+ return true;
+ }
+ if ($callback instanceof Callback) {
+ $paramStructure = $callback->params;
+ $callback = $callback->callback;
+ }
+ if (! $paramStructure)
+ return call_user_func_array($callback, $params);
+ $p = 0;
+ foreach($paramStructure as $i => $v) {
+ $paramStructure[$i] = $v instanceof CallbackParam
+ ? $params[$p++]
+ : $v;
+ }
+ return call_user_func_array($callback, $paramStructure);
+ }
+ /**
+ * Merge 2 phpQuery objects.
+ * @param array $one
+ * @param array $two
+ * @protected
+ * @todo node lists, phpQueryObject
+ */
+ public static function merge($one, $two) {
+ $elements = $one->elements;
+ foreach($two->elements as $node) {
+ $exists = false;
+ foreach($elements as $node2) {
+ if ($node2->isSameNode($node))
+ $exists = true;
+ }
+ if (! $exists)
+ $elements[] = $node;
+ }
+ return $elements;
+// $one = $one->newInstance();
+// $one->elements = $elements;
+// return $one;
+ }
+ /**
+ *
+ * @param $array
+ * @param $callback
+ * @param $invert
+ * @return unknown_type
+ * @link http://docs.jquery.com/Utilities/jQuery.grep
+ */
+ public static function grep($array, $callback, $invert = false) {
+ $result = array();
+ foreach($array as $k => $v) {
+ $r = call_user_func_array($callback, array($v, $k));
+ if ($r === !(bool)$invert)
+ $result[] = $v;
+ }
+ return $result;
+ }
+ public static function unique($array) {
+ return array_unique($array);
+ }
+ /**
+ *
+ * @param $function
+ * @return unknown_type
+ * @TODO there are problems with non-static methods, second parameter pass it
+ * but doesnt verify is method is really callable
+ */
+ public static function isFunction($function) {
+ return is_callable($function);
+ }
+ public static function trim($str) {
+ return trim($str);
+ }
+ /* PLUGINS NAMESPACE */
+ /**
+ *
+ * @param $url
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browserGet($url, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browserGet'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $url
+ * @param $data
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browserPost($url, $data, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browserPost'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $ajaxSettings
+ * @param $callback
+ * @param $param1
+ * @param $param2
+ * @param $param3
+ * @return phpQueryObject
+ */
+ public static function browser($ajaxSettings, $callback, $param1 = null, $param2 = null, $param3 = null) {
+ if (self::plugin('WebBrowser')) {
+ $params = func_get_args();
+ return self::callbackRun(array(self::$plugins, 'browser'), $params);
+ } else {
+ self::debug('WebBrowser plugin not available...');
+ }
+ }
+ /**
+ *
+ * @param $code
+ * @return string
+ */
+ public static function php($code) {
+ return self::code('php', $code);
+ }
+ /**
+ *
+ * @param $type
+ * @param $code
+ * @return string
+ */
+ public static function code($type, $code) {
+ return "<$type><!-- ".trim($code)." --></$type>";
+ }
+
+ public static function __callStatic($method, $params) {
+ return call_user_func_array(
+ array(phpQuery::$plugins, $method),
+ $params
+ );
+ }
+ protected static function dataSetupNode($node, $documentID) {
+ // search are return if alredy exists
+ foreach(phpQuery::$documents[$documentID]->dataNodes as $dataNode) {
+ if ($node->isSameNode($dataNode))
+ return $dataNode;
+ }
+ // if doesn't, add it
+ phpQuery::$documents[$documentID]->dataNodes[] = $node;
+ return $node;
+ }
+ protected static function dataRemoveNode($node, $documentID) {
+ // search are return if alredy exists
+ foreach(phpQuery::$documents[$documentID]->dataNodes as $k => $dataNode) {
+ if ($node->isSameNode($dataNode)) {
+ unset(self::$documents[$documentID]->dataNodes[$k]);
+ unset(self::$documents[$documentID]->data[ $dataNode->dataID ]);
+ }
+ }
+ }
+ public static function data($node, $name, $data, $documentID = null) {
+ if (! $documentID)
+ // TODO check if this works
+ $documentID = self::getDocumentID($node);
+ $document = phpQuery::$documents[$documentID];
+ $node = self::dataSetupNode($node, $documentID);
+ if (! isset($node->dataID))
+ $node->dataID = ++phpQuery::$documents[$documentID]->uuid;
+ $id = $node->dataID;
+ if (! isset($document->data[$id]))
+ $document->data[$id] = array();
+ if (! is_null($data))
+ $document->data[$id][$name] = $data;
+ if ($name) {
+ if (isset($document->data[$id][$name]))
+ return $document->data[$id][$name];
+ } else
+ return $id;
+ }
+ public static function removeData($node, $name, $documentID) {
+ if (! $documentID)
+ // TODO check if this works
+ $documentID = self::getDocumentID($node);
+ $document = phpQuery::$documents[$documentID];
+ $node = self::dataSetupNode($node, $documentID);
+ $id = $node->dataID;
+ if ($name) {
+ if (isset($document->data[$id][$name]))
+ unset($document->data[$id][$name]);
+ $name = null;
+ foreach($document->data[$id] as $name)
+ break;
+ if (! $name)
+ self::removeData($node, $name, $documentID);
+ } else {
+ self::dataRemoveNode($node, $documentID);
+ }
+ }
+}
+/**
+ * Plugins static namespace class.
+ *
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @todo move plugin methods here (as statics)
+ */
+class phpQueryPlugins {
+ public function __call($method, $args) {
+ if (isset(phpQuery::$extendStaticMethods[$method])) {
+ $return = call_user_func_array(
+ phpQuery::$extendStaticMethods[$method],
+ $args
+ );
+ } else if (isset(phpQuery::$pluginsStaticMethods[$method])) {
+ $class = phpQuery::$pluginsStaticMethods[$method];
+ $realClass = "phpQueryPlugin_$class";
+ $return = call_user_func_array(
+ array($realClass, $method),
+ $args
+ );
+ return isset($return)
+ ? $return
+ : $this;
+ } else
+ throw new Exception("Method '{$method}' doesnt exist");
+ }
+}
+/**
+ * Shortcut to phpQuery::pq($arg1, $context)
+ * Chainable.
+ *
+ * @see phpQuery::pq()
+ * @return phpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+function pq($arg1, $context = null) {
+ $args = func_get_args();
+ return call_user_func_array(
+ array('phpQuery', 'pq'),
+ $args
+ );
+}
+// add plugins dir and Zend framework to include path
+set_include_path(
+ get_include_path()
+ .PATH_SEPARATOR.dirname(__FILE__).'/phpQuery/'
+ .PATH_SEPARATOR.dirname(__FILE__).'/phpQuery/plugins/'
+);
+// why ? no __call nor __get for statics in php...
+// XXX __callStatic will be available in PHP 5.3
+phpQuery::$plugins = new phpQueryPlugins();
+// include bootstrap file (personal library config)
+if (file_exists(dirname(__FILE__).'/phpQuery/bootstrap.php'))
+ require_once dirname(__FILE__).'/phpQuery/bootstrap.php';
diff --git a/_test/data/_dummy b/_test/data/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/_dummy
diff --git a/_test/data/attic/_dummy b/_test/data/attic/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/attic/_dummy
diff --git a/_test/data/cache/_dummy b/_test/data/cache/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/cache/_dummy
diff --git a/_test/data/deleted.files b/_test/data/deleted.files
new file mode 100644
index 000000000..d034e1d5b
--- /dev/null
+++ b/_test/data/deleted.files
@@ -0,0 +1,257 @@
+# This is a list of files that were present in previous DokuWiki releases
+# but were removed later. An up to date DokuWiki should not have any of
+# the files installed
+# A copy of this list is maintained at
+# http://www.dokuwiki.org/install:upgrade#files_to_remove
+
+# removed in 2011-11-10
+lib/_fla/.htaccess
+lib/_fla/MultipleUpload.as
+lib/_fla/README
+lib/_fla/index.html
+lib/_fla/multipleUpload.fla
+lib/exe/multipleUpload.swf
+lib/images/multiupload.png
+lib/scripts/ajax.js
+lib/scripts/events.js
+lib/scripts/subscriptions.js
+
+# removed in 2011-05-25
+conf/words.aspell.dist
+lib/styles/style.css
+
+# removed in 2010-11-07
+inc/lang/ar/subscribermail.txt
+inc/lang/az/subscribermail.txt
+inc/lang/bg/subscribermail.txt
+inc/lang/ca/subscribermail.txt
+inc/lang/ca-valencia/subscribermail.txt
+inc/lang/cs/subscribermail.txt
+inc/lang/da/subscribermail.txt
+inc/lang/de-informal/subscribermail.txt
+inc/lang/el/subscribermail.txt
+inc/lang/eo/subscribermail.txt
+inc/lang/es/subscribermail.txt
+inc/lang/et/subscribermail.txt
+inc/lang/eu/subscribermail.txt
+inc/lang/fa/subscribermail.txt
+inc/lang/fi/subscribermail.txt
+inc/lang/fo/subscribermail.txt
+inc/lang/fr/subscribermail.txt
+inc/lang/gl/subscribermail.txt
+inc/lang/he/subscribermail.txt
+inc/lang/hr/subscribermail.txt
+inc/lang/hu/subscribermail.txt
+inc/lang/id/subscribermail.txt
+inc/lang/is/subscribermail.txt
+inc/lang/it/subscribermail.txt
+inc/lang/ja/subscribermail.txt
+inc/lang/ko/subscribermail.txt
+inc/lang/ku/subscribermail.txt
+inc/lang/lt/subscribermail.txt
+inc/lang/lv/subscribermail.txt
+inc/lang/mr/subscribermail.txt
+inc/lang/ne/subscribermail.txt
+inc/lang/nl/subscribermail.txt
+inc/lang/no/subscribermail.txt
+inc/lang/pl/subscribermail.txt
+inc/lang/pt-br/subscribermail.txt
+inc/lang/pt/subscribermail.txt
+inc/lang/ro/subscribermail.txt
+inc/lang/ru/subscribermail.txt
+inc/lang/sk/subscribermail.txt
+inc/lang/sr/subscribermail.txt
+inc/lang/sv/subscribermail.txt
+inc/lang/th/subscribermail.txt
+inc/lang/tr/subscribermail.txt
+inc/lang/uk/subscribermail.txt
+inc/lang/zh/subscribermail.txt
+inc/lang/zh-tw/subscribermail.txt
+
+# removed in rc2010-10-07
+conf/msg
+inc/lang/bg/wordblock.txt
+inc/lang/ca-valencia/wordblock.txt
+inc/lang/ca/wordblock.txt
+inc/lang/cs/wordblock.txt
+inc/lang/da/wordblock.txt
+inc/lang/de-informal/wordblock.txt
+inc/lang/de/subscribermail.txt
+inc/lang/de/wordblock.txt
+inc/lang/el/wordblock.txt
+inc/lang/en/subscribermail.txt
+inc/lang/en/wordblock.txt
+inc/lang/eo/wordblock.txt
+inc/lang/es/wordblock.txt
+inc/lang/et/wordblock.txt
+inc/lang/eu/wordblock.txt
+inc/lang/fa/wordblock.txt
+inc/lang/fi/wordblock.txt
+inc/lang/fo/wordblock.txt
+inc/lang/fr/wordblock.txt
+inc/lang/he/wordblock.txt
+inc/lang/hr/wordblock.txt
+inc/lang/hu/wordblock.txt
+inc/lang/id/wordblock.txt
+inc/lang/it/wordblock.txt
+inc/lang/ja/wordblock.txt
+inc/lang/ko/wordblock.txt
+inc/lang/ku/wordblock.txt
+inc/lang/lt/wordblock.txt
+inc/lang/lv/wordblock.txt
+inc/lang/mg/wordblock.txt
+inc/lang/mr/wordblock.txt
+inc/lang/nl/wordblock.txt
+inc/lang/no/wordblock.txt
+inc/lang/pl/wordblock.txt
+inc/lang/pt-br/wordblock.txt
+inc/lang/pt/wordblock.txt
+inc/lang/ro/wordblock.txt
+inc/lang/sk/wordblock.txt
+inc/lang/sl/wordblock.txt
+inc/lang/sr/wordblock.txt
+inc/lang/sv/wordblock.txt
+inc/lang/th/wordblock.txt
+inc/lang/tr/wordblock.txt
+inc/lang/uk/wordblock.txt
+inc/lang/vi/wordblock.txt
+inc/lang/zh-tw/wordblock.txt
+inc/lang/zh/wordblock.txt
+lib/scripts/pngbehavior.htc
+
+# removed in rc2009-12-02
+inc/lang/ar/wordblock.txt
+inc/lang/ca-va/
+lib/plugins/acl/lang/ca-va/
+lib/plugins/config/lang/ca-va/
+lib/plugins/plugin/lang/ca-va/
+lib/plugins/popularity/lang/ca-va/
+lib/plugins/revert/lang/ca-va/
+lib/plugins/usermanager/lang/ca-va/
+
+# removed in rc2009-01-30
+lib/plugins/upgradeplugindirectory
+lib/plugins/upgradeplugindirectory/action.php
+
+# removed in rc2009-01-26
+inc/auth/punbb.class.php
+inc/lang/ko/edit.txt_bak
+inc/lang/ko/lang.php_bak
+inc/lang/ku/admin_acl.txt
+inc/lang/mg/admin_acl.txt
+lib/plugins/importoldchangelog
+lib/plugins/importoldchangelog/action.php
+lib/plugins/importoldindex
+lib/plugins/importoldindex/action.php
+lib/plugins/usermanager/images/no_user_edit.png
+lib/plugins/usermanager/images/user_edit.png
+lib/tpl/default/UWEB.css
+
+# removed in rc2008-03-31
+inc/aspell.php
+inc/geshi/css-gen.cfg
+inc/lang/fr/admin_acl.txt
+lib/exe/spellcheck.php
+lib/images/toolbar/spellcheck.png
+lib/images/toolbar/spellnoerr.png
+lib/images/toolbar/spellstop.png
+lib/images/toolbar/spellwait.gif
+lib/plugins/acl/lang/ar/intro.txt
+lib/plugins/acl/lang/bg/intro.txt
+lib/plugins/acl/lang/ca/intro.txt
+lib/plugins/acl/lang/cs/intro.txt
+lib/plugins/acl/lang/da/intro.txt
+lib/plugins/acl/lang/de/intro.txt
+lib/plugins/acl/lang/el/intro.txt
+lib/plugins/acl/lang/en/intro.txt
+lib/plugins/acl/lang/es/intro.txt
+lib/plugins/acl/lang/et/intro.txt
+lib/plugins/acl/lang/eu/intro.txt
+lib/plugins/acl/lang/fi/intro.txt
+lib/plugins/acl/lang/fr/intro.txt
+lib/plugins/acl/lang/gl/intro.txt
+lib/plugins/acl/lang/he/intro.txt
+lib/plugins/acl/lang/id/intro.txt
+lib/plugins/acl/lang/it/intro.txt
+lib/plugins/acl/lang/ja/intro.txt
+lib/plugins/acl/lang/ko/intro.txt
+lib/plugins/acl/lang/lt/intro.txt
+lib/plugins/acl/lang/lv/intro.txt
+lib/plugins/acl/lang/nl/intro.txt
+lib/plugins/acl/lang/no/intro.txt
+lib/plugins/acl/lang/pl/intro.txt
+lib/plugins/acl/lang/pt/intro.txt
+lib/plugins/acl/lang/ru/intro.txt
+lib/plugins/acl/lang/sk/intro.txt
+lib/plugins/acl/lang/sr/intro.txt
+lib/plugins/acl/lang/sv/intro.txt
+lib/plugins/acl/lang/tr/intro.txt
+lib/plugins/acl/lang/uk/intro.txt
+lib/plugins/acl/lang/vi/intro.txt
+lib/plugins/acl/lang/zh/intro.txt
+lib/plugins/acl/lang/zh-tw/intro.txt
+lib/scripts/spellcheck.js
+lib/styles/spellcheck.css
+
+# removed in 2007-06-26
+inc/parser/wiki.php
+lib/images/interwiki/bug.gif
+lib/plugins/base.php
+lib/plugins/plugin/inc
+lib/plugins/plugin/inc/tarlib.class.php
+lib/plugins/plugin/inc/zip.lib.php
+lib/scripts/domLib.js
+lib/scripts/domTT.js
+
+# removed in 2006-11-06
+inc/admin_acl.php
+inc/lang/lt/stopwords.txt
+inc/magpie
+inc/magpie/rss_cache.inc
+inc/magpie/rss_fetch.inc
+inc/magpie/rss_parse.inc
+inc/magpie/rss_utils.inc
+lib/exe/media.php
+lib/tpl/default/mediaedit.php
+lib/tpl/default/media.php
+lib/tpl/default/mediaref.php
+
+# removed in 2006-03-09
+data/pages/wiki/playground.txt
+inc/auth/ldap.php
+inc/auth/mysql.php
+inc/auth/pgsql.php
+inc/auth/plain.php
+inc/lang/ca/admin_acl.txt
+inc/lang/cs/admin_acl.txt
+inc/lang/da/admin_acl.txt
+inc/lang/de/admin_acl.txt
+inc/lang/en/admin_acl.txt
+inc/lang/et/admin_acl.txt
+inc/lang/eu/admin_acl.txt
+inc/lang/fr/admin_acl.txt
+inc/lang/it/admin_acl.txt
+inc/lang/ja/admin_acl.txt
+inc/lang/lt/admin_acl.txt
+inc/lang/lv/admin_acl.txt
+inc/lang/nl/admin_acl.txt
+inc/lang/no/admin_acl.txt
+inc/lang/pl/admin_acl.txt
+inc/lang/pt/admin_acl.txt
+inc/lang/vi/admin_acl.txt
+inc/lang/zh-tw/admin_acl.txt
+inc/parser/spamcheck.php
+lib/images/favicon.ico
+lib/images/thumbup.gif
+lib/images/toolbar/code.png
+lib/images/toolbar/empty.png
+lib/images/toolbar/extlink.png
+lib/images/toolbar/fonth1.png
+lib/images/toolbar/fonth2.png
+lib/images/toolbar/fonth3.png
+lib/images/toolbar/fonth4.png
+lib/images/toolbar/fonth5.png
+lib/images/toolbar/list.png
+lib/images/toolbar/list_ul.png
+lib/images/toolbar/rule.png
+lib/tpl/default/images/interwiki.png
diff --git a/_test/data/index/_dummy b/_test/data/index/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/index/_dummy
diff --git a/_test/data/locks/_dummy b/_test/data/locks/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/locks/_dummy
diff --git a/_test/data/media/wiki/dokuwiki-128.png b/_test/data/media/wiki/dokuwiki-128.png
new file mode 100644
index 000000000..b2306ac95
--- /dev/null
+++ b/_test/data/media/wiki/dokuwiki-128.png
Binary files differ
diff --git a/_test/data/media_attic/_dummy b/_test/data/media_attic/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/media_attic/_dummy
diff --git a/_test/data/media_meta/_dummy b/_test/data/media_meta/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/media_meta/_dummy
diff --git a/_test/data/meta/_dummy b/_test/data/meta/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/meta/_dummy
diff --git a/_test/data/pages/wiki/dokuwiki.txt b/_test/data/pages/wiki/dokuwiki.txt
new file mode 100644
index 000000000..e6fac5b65
--- /dev/null
+++ b/_test/data/pages/wiki/dokuwiki.txt
@@ -0,0 +1,64 @@
+====== DokuWiki ======
+
+[[doku>wiki:dokuwiki|{{wiki:dokuwiki-128.png }}]] DokuWiki is a standards compliant, simple to use [[wp>Wiki]], mainly aimed at creating documentation of any kind. It is targeted at developer teams, workgroups and small companies. It has a simple but powerful [[wiki:syntax]] which makes sure the datafiles remain readable outside the Wiki and eases the creation of structured texts. All data is stored in plain text files -- no database is required.
+
+Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki.
+
+===== Download =====
+
+DokuWiki is available at http://www.splitbrain.org/go/dokuwiki
+
+
+===== Read More =====
+
+All documentation and additional information besides the [[syntax|syntax description]] is maintained in the DokuWiki at [[doku>|www.dokuwiki.org]].
+
+**About DokuWiki**
+
+ * [[doku>features|A feature list]] :!:
+ * [[doku>users|Happy Users]]
+ * [[doku>press|Who wrote about it]]
+ * [[doku>blogroll|What Bloggers think]]
+ * [[http://www.wikimatrix.org/show/DokuWiki|Compare it with other wiki software]]
+
+**Installing DokuWiki**
+
+ * [[doku>requirements|System Requirements]]
+ * [[http://www.splitbrain.org/go/dokuwiki|Download DokuWiki]] :!:
+ * [[doku>changes|Change Log]]
+ * [[doku>Install|How to install or upgrade]] :!:
+ * [[doku>config|Configuration]]
+
+**Using DokuWiki**
+
+ * [[doku>syntax|Wiki Syntax]]
+ * [[doku>manual|The manual]] :!:
+ * [[doku>FAQ|Frequently Asked Questions (FAQ)]]
+ * [[doku>glossary|Glossary]]
+ * [[http://search.dokuwiki.org|Search for DokuWiki help and documentation]]
+
+**Customizing DokuWiki**
+
+ * [[doku>tips|Tips and Tricks]]
+ * [[doku>Template|How to create and use templates]]
+ * [[doku>plugins|Installing plugins]]
+ * [[doku>development|Development Resources]]
+
+**DokuWiki Feedback and Community**
+
+ * [[doku>newsletter|Subscribe to the newsletter]] :!:
+ * [[doku>mailinglist|Join the mailing list]]
+ * [[http://forum.dokuwiki.org|Check out the user forum]]
+ * [[doku>irc|Talk to other users in the IRC channel]]
+ * [[http://bugs.splitbrain.org/index.php?project=1|Submit bugs and feature wishes]]
+ * [[http://www.wikimatrix.org/forum/viewforum.php?id=10|Share your experiences in the WikiMatrix forum]]
+ * [[doku>thanks|Some humble thanks]]
+
+
+===== Copyright =====
+
+2004-2010 (c) Andreas Gohr <andi@splitbrain.org>((Please do not contact me for help and support -- use the [[doku>mailinglist]] or [[http://forum.dokuwiki.org|forum]] instead)) and the DokuWiki Community
+
+The DokuWiki engine is licensed under [[http://www.gnu.org/licenses/gpl.html|GNU General Public License]] Version 2. If you use DokuWiki in your company, consider [[doku>donate|donating]] a few bucks ;-).
+
+Not sure what this means? See the [[doku>faq:license|FAQ on the Licenses]].
diff --git a/_test/data/pages/wiki/syntax.txt b/_test/data/pages/wiki/syntax.txt
new file mode 100644
index 000000000..0b5480949
--- /dev/null
+++ b/_test/data/pages/wiki/syntax.txt
@@ -0,0 +1,486 @@
+====== Formatting Syntax ======
+
+[[doku>DokuWiki]] supports some simple markup language, which tries to make the datafiles to be as readable as possible. This page contains all possible syntax you may use when editing the pages. Simply have a look at the source of this page by pressing the //Edit this page// button at the top or bottom of the page. If you want to try something, just use the [[playground:playground|playground]] page. The simpler markup is easily accessible via [[doku>toolbar|quickbuttons]], too.
+
+===== Basic Text Formatting =====
+
+DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts. Of course you can **__//''combine''//__** all these.
+
+ DokuWiki supports **bold**, //italic//, __underlined__ and ''monospaced'' texts.
+ Of course you can **__//''combine''//__** all these.
+
+You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+ You can use <sub>subscript</sub> and <sup>superscript</sup>, too.
+
+You can mark something as <del>deleted</del> as well.
+
+ You can mark something as <del>deleted</del> as well.
+
+**Paragraphs** are created from blank lines. If you want to **force a newline** without a paragraph, you can use two backslashes followed by a whitespace or the end of line.
+
+This is some text with some linebreaks\\ Note that the
+two backslashes are only recognized at the end of a line\\
+or followed by\\ a whitespace \\this happens without it.
+
+ This is some text with some linebreaks\\ Note that the
+ two backslashes are only recognized at the end of a line\\
+ or followed by\\ a whitespace \\this happens without it.
+
+You should use forced newlines only if really needed.
+
+===== Links =====
+
+DokuWiki supports multiple ways of creating links.
+
+==== External ====
+
+External links are recognized automagically: http://www.google.com or simply www.google.com - You can set the link text as well: [[http://www.google.com|This Link points to google]]. Email addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+ DokuWiki supports multiple ways of creating links. External links are recognized
+ automagically: http://www.google.com or simply www.google.com - You can set
+ link text as well: [[http://www.google.com|This Link points to google]]. Email
+ addresses like this one: <andi@splitbrain.org> are recognized, too.
+
+==== Internal ====
+
+Internal links are created by using square brackets. You can either just give a [[pagename]] or use an additional [[pagename|link text]].
+
+ Internal links are created by using square brackets. You can either just give
+ a [[pagename]] or use an additional [[pagename|link text]].
+
+[[doku>pagename|Wiki pagenames]] are converted to lowercase automatically, special characters are not allowed.
+
+You can use [[some:namespaces]] by using a colon in the pagename.
+
+ You can use [[some:namespaces]] by using a colon in the pagename.
+
+For details about namespaces see [[doku>namespaces]].
+
+Linking to a specific section is possible, too. Just add the section name behind a hash character as known from HTML. This links to [[syntax#internal|this Section]].
+
+ This links to [[syntax#internal|this Section]].
+
+Notes:
+
+ * Links to [[syntax|existing pages]] are shown in a different style from [[nonexisting]] ones.
+ * DokuWiki does not use [[wp>CamelCase]] to automatically create links by default, but this behavior can be enabled in the [[doku>config]] file. Hint: If DokuWiki is a link, then it's enabled.
+ * When a section's heading is changed, its bookmark changes, too. So don't rely on section linking too much.
+
+==== Interwiki ====
+
+DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis. For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+ DokuWiki supports [[doku>Interwiki]] links. These are quick links to other Wikis.
+ For example this is a link to Wikipedia's page about Wikis: [[wp>Wiki]].
+
+==== Windows Shares ====
+
+Windows shares like [[\\server\share|this]] are recognized, too. Please note that these only make sense in a homogeneous user group like a corporate [[wp>Intranet]].
+
+ Windows Shares like [[\\server\share|this]] are recognized, too.
+
+Notes:
+
+ * For security reasons direct browsing of windows shares only works in Microsoft Internet Explorer per default (and only in the "local zone").
+ * For Mozilla and Firefox it can be enabled through different workaround mentioned in the [[http://kb.mozillazine.org/Links_to_local_pages_do_not_work|Mozilla Knowledge Base]]. However, there will still be a JavaScript warning about trying to open a Windows Share. To remove this warning (for all users), put the following line in ''conf/local.protected.php'':
+
+ $lang['js']['nosmblinks'] = '';
+
+==== Image Links ====
+
+You can also use an image to link to another internal or external page by combining the syntax for links and [[#images_and_other_files|images]] (see below) like this:
+
+ [[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+[[http://www.php.net|{{wiki:dokuwiki-128.png}}]]
+
+Please note: The image formatting is the only formatting syntax accepted in link names.
+
+The whole [[#images_and_other_files|image]] and [[#links|link]] syntax is supported (including image resizing, internal and external images and URLs and interwiki links).
+
+===== Footnotes =====
+
+You can add footnotes ((This is a footnote)) by using double parentheses.
+
+ You can add footnotes ((This is a footnote)) by using double parentheses.
+
+===== Sectioning =====
+
+You can use up to five different levels of headlines to structure your content. If you have more than three headlines, a table of contents is generated automatically -- this can be disabled by including the string ''<nowiki>~~NOTOC~~</nowiki>'' in the document.
+
+==== Headline Level 3 ====
+=== Headline Level 4 ===
+== Headline Level 5 ==
+
+ ==== Headline Level 3 ====
+ === Headline Level 4 ===
+ == Headline Level 5 ==
+
+By using four or more dashes, you can make a horizontal line:
+
+----
+
+===== Images and Other Files =====
+
+You can include external and internal [[doku>images]] with curly brackets. Optionally you can specify the size of them.
+
+Real size: {{wiki:dokuwiki-128.png}}
+
+Resize to given width: {{wiki:dokuwiki-128.png?50}}
+
+Resize to given width and height((when the aspect ratio of the given width and height doesn't match that of the image, it will be cropped to the new ratio before resizing)): {{wiki:dokuwiki-128.png?200x50}}
+
+Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+ Real size: {{wiki:dokuwiki-128.png}}
+ Resize to given width: {{wiki:dokuwiki-128.png?50}}
+ Resize to given width and height: {{wiki:dokuwiki-128.png?200x50}}
+ Resized external image: {{http://de3.php.net/images/php.gif?200x50}}
+
+
+By using left or right whitespaces you can choose the alignment.
+
+{{ wiki:dokuwiki-128.png}}
+
+{{wiki:dokuwiki-128.png }}
+
+{{ wiki:dokuwiki-128.png }}
+
+ {{ wiki:dokuwiki-128.png}}
+ {{wiki:dokuwiki-128.png }}
+ {{ wiki:dokuwiki-128.png }}
+
+Of course, you can add a title (displayed as a tooltip by most browsers), too.
+
+{{ wiki:dokuwiki-128.png |This is the caption}}
+
+ {{ wiki:dokuwiki-128.png |This is the caption}}
+
+If you specify a filename (external or internal) that is not an image (''gif, jpeg, png''), then it will be displayed as a link instead.
+
+For linking an image to another page see [[#Image Links]] above.
+
+===== Lists =====
+
+Dokuwiki supports ordered and unordered lists. To create a list item, indent your text by two spaces and use a ''*'' for unordered lists or a ''-'' for ordered ones.
+
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+
+<code>
+ * This is a list
+ * The second item
+ * You may have different levels
+ * Another item
+
+ - The same list but ordered
+ - Another item
+ - Just use indention for deeper levels
+ - That's it
+</code>
+
+Also take a look at the [[doku>faq:lists|FAQ on list items]].
+
+===== Text Conversions =====
+
+DokuWiki can convert certain pre-defined characters or strings into images or other text or HTML.
+
+The text to image conversion is mainly done for smileys. And the text to HTML conversion is used for typography replacements, but can be configured to use other HTML as well.
+
+==== Text to Image Conversions ====
+
+DokuWiki converts commonly used [[wp>emoticon]]s to their graphical equivalents. Those [[doku>Smileys]] and other images can be configured and extended. Here is an overview of Smileys included in DokuWiki:
+
+ * 8-) %% 8-) %%
+ * 8-O %% 8-O %%
+ * :-( %% :-( %%
+ * :-) %% :-) %%
+ * =) %% =) %%
+ * :-/ %% :-/ %%
+ * :-\ %% :-\ %%
+ * :-? %% :-? %%
+ * :-D %% :-D %%
+ * :-P %% :-P %%
+ * :-O %% :-O %%
+ * :-X %% :-X %%
+ * :-| %% :-| %%
+ * ;-) %% ;-) %%
+ * ^_^ %% ^_^ %%
+ * :?: %% :?: %%
+ * :!: %% :!: %%
+ * LOL %% LOL %%
+ * FIXME %% FIXME %%
+ * DELETEME %% DELETEME %%
+
+==== Text to HTML Conversions ====
+
+Typography: [[DokuWiki]] can convert simple text characters to their typographically correct entities. Here is an example of recognized characters.
+
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+
+<code>
+-> <- <-> => <= <=> >> << -- --- 640x480 (c) (tm) (r)
+"He thought 'It's a man's world'..."
+</code>
+
+The same can be done to produce any kind of HTML, it just needs to be added to the [[doku>entities|pattern file]].
+
+There are three exceptions which do not come from that pattern file: multiplication entity (640x480), 'single' and "double quotes". They can be turned off through a [[doku>config:typography|config option]].
+
+===== Quoting =====
+
+Some times you want to mark some text to show it's a reply or comment. You can use the following syntax:
+
+ I think we should do it
+
+ > No we shouldn't
+
+ >> Well, I say we should
+
+ > Really?
+
+ >> Yes!
+
+ >>> Then lets do it!
+
+I think we should do it
+
+> No we shouldn't
+
+>> Well, I say we should
+
+> Really?
+
+>> Yes!
+
+>>> Then lets do it!
+
+===== Tables =====
+
+DokuWiki supports a simple syntax to create tables.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+| Row 2 Col 1 | some colspan (note the double pipe) ||
+| Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+Table rows have to start and end with a ''|'' for normal rows or a ''^'' for headers.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+ | Row 2 Col 1 | some colspan (note the double pipe) ||
+ | Row 3 Col 1 | Row 3 Col 2 | Row 3 Col 3 |
+
+To connect cells horizontally, just make the next cell completely empty as shown above. Be sure to have always the same amount of cell separators!
+
+Vertical tableheaders are possible, too.
+
+| ^ Heading 1 ^ Heading 2 ^
+^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+^ Heading 4 | no colspan this time | |
+^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+As you can see, it's the cell separator before a cell which decides about the formatting:
+
+ | ^ Heading 1 ^ Heading 2 ^
+ ^ Heading 3 | Row 1 Col 2 | Row 1 Col 3 |
+ ^ Heading 4 | no colspan this time | |
+ ^ Heading 5 | Row 2 Col 2 | Row 2 Col 3 |
+
+You can have rowspans (vertically connected cells) by adding '':::'' into the cells below the one to which they should connect.
+
+^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+| Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+| Row 2 Col 1 | ::: | Row 2 Col 3 |
+| Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+Apart from the rowspan syntax those cells should not contain anything else.
+
+ ^ Heading 1 ^ Heading 2 ^ Heading 3 ^
+ | Row 1 Col 1 | this cell spans vertically | Row 1 Col 3 |
+ | Row 2 Col 1 | ::: | Row 2 Col 3 |
+ | Row 3 Col 1 | ::: | Row 2 Col 3 |
+
+You can align the table contents, too. Just add at least two whitespaces at the opposite end of your text: Add two spaces on the left to align right, two spaces on the right to align left and two spaces at least at both ends for centered text.
+
+^ Table with alignment ^^^
+| right| center |left |
+|left | right| center |
+| xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+This is how it looks in the source:
+
+ ^ Table with alignment ^^^
+ | right| center |left |
+ |left | right| center |
+ | xxxxxxxxxxxx | xxxxxxxxxxxx | xxxxxxxxxxxx |
+
+Note: Vertical alignment is not supported.
+
+===== No Formatting =====
+
+If you need to display text exactly like it is typed (without any formatting), enclose the area either with ''%%<nowiki>%%'' tags or even simpler, with double percent signs ''<nowiki>%%</nowiki>''.
+
+<nowiki>
+This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+</nowiki>
+The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+ <nowiki>
+ This is some text which contains addresses like this: http://www.splitbrain.org and **formatting**, but nothing is done with it.
+ </nowiki>
+ The same is true for %%//__this__ text// with a smiley ;-)%%.
+
+===== Code Blocks =====
+
+You can include code blocks into your documents by either indenting them by at least two spaces (like used for the previous examples) or by using the tags ''%%<code>%%'' or ''%%<file>%%''.
+
+ This is text is indented by two spaces.
+
+<code>
+This is preformatted code all spaces are preserved: like <-this
+</code>
+
+<file>
+This is pretty much the same, but you could use it to show that you quoted a file.
+</file>
+
+Those blocks were created by this source:
+
+ This is text is indented by two spaces.
+
+ <code>
+ This is preformatted code all spaces are preserved: like <-this
+ </code>
+
+ <file>
+ This is pretty much the same, but you could use it to show that you quoted a file.
+ </file>
+
+==== Syntax Highlighting ====
+
+[[wiki:DokuWiki]] can highlight sourcecode, which makes it easier to read. It uses the [[http://qbnz.com/highlighter/|GeSHi]] Generic Syntax Highlighter -- so any language supported by GeSHi is supported. The syntax uses the same code and file blocks described in the previous section, but this time the name of the language syntax to be highlighted is included inside the tag, e.g. ''<nowiki><code java></nowiki>'' or ''<nowiki><file java></nowiki>''.
+
+<code java>
+/**
+ * The HelloWorldApp class implements an application that
+ * simply displays "Hello World!" to the standard output.
+ */
+class HelloWorldApp {
+ public static void main(String[] args) {
+ System.out.println("Hello World!"); //Display the string.
+ }
+}
+</code>
+
+The following language strings are currently recognized: //4cs, abap, actionscript-french, actionscript, actionscript3, ada, apache, applescript, asm, asp, autoconf, autohotkey, autoit, avisynth, awk, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, cpp, cpp-qt, csharp, css, cuesheet, d, dcs, delphi, diff, div, dos, dot, ecmascript, eiffel, email, erlang, fo, fortran, freebasic, fsharp, gambas, genero, genie, gdb, glsl, gml, gnuplot, groovy, gettext, gwbasic, haskell, hicest, hq9plus, html, icon, idl, ini, inno, intercal, io, j, java5, java, javascript, jquery, kixtart, klonec, klonecpp, latex, lisp, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, modula2, modula3, mmix, mpasm, mxml, mysql, newlisp, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle8, oracle11, oxygene, oz, pascal, pcre, perl, perl6, per, pf, php-brief, php, pike, pic16, pixelbender, plsql, postgresql, povray, powerbuilder, powershell, progress, prolog, properties, providex, purebasic, python, q, qbasic, rails, rebol, reg, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, vala, vbnet, vb, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, winbatch, whois, xbasic, xml, xorg_conf, xpp, z80//
+
+==== Downloadable Code Blocks ====
+
+When you use the ''%%<code>%%'' or ''%%<file>%%'' syntax as above, you might want to make the shown code available for download as well. You can to this by specifying a file name after language code like this:
+
+<code>
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+</code>
+
+<file php myexample.php>
+<?php echo "hello world!"; ?>
+</file>
+
+If you don't want any highlighting but want a downloadable file, specify a dash (''-'') as the language code: ''%%<code - myfile.foo>%%''.
+
+
+===== Embedding HTML and PHP =====
+
+You can embed raw HTML or PHP code into your documents by using the ''%%<html>%%'' or ''%%<php>%%'' tags. (Use uppercase tags if you need to enclose block level elements.)
+
+HTML example:
+
+<code>
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+</code>
+
+<html>
+This is some <span style="color:red;font-size:150%;">inline HTML</span>
+</html>
+<HTML>
+<p style="border:2px dashed red;">And this is some block HTML</p>
+</HTML>
+
+PHP example:
+
+<code>
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(generated inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+</code>
+
+<php>
+echo 'A logo generated by PHP:';
+echo '<img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" />';
+echo '(inline HTML)';
+</php>
+<PHP>
+echo '<table class="inline"><tr><td>The same, but inside a block level element:</td>';
+echo '<td><img src="' . $_SERVER['PHP_SELF'] . '?=' . php_logo_guid() . '" alt="PHP Logo !" /></td>';
+echo '</tr></table>';
+</PHP>
+
+**Please Note**: HTML and PHP embedding is disabled by default in the configuration. If disabled, the code is displayed instead of executed.
+
+===== RSS/ATOM Feed Aggregation =====
+[[DokuWiki]] can integrate data from external XML feeds. For parsing the XML feeds, [[http://simplepie.org/|SimplePie]] is used. All formats understood by SimplePie can be used in DokuWiki as well. You can influence the rendering by multiple additional space separated parameters:
+
+^ Parameter ^ Description ^
+| any number | will be used as maximum number items to show, defaults to 8 |
+| reverse | display the last items in the feed first |
+| author | show item authors names |
+| date | show item dates |
+| description| show the item description. If [[doku>config:htmlok|HTML]] is disabled all tags will be stripped |
+| //n//[dhm] | refresh period, where d=days, h=hours, m=minutes. (e.g. 12h = 12 hours). |
+
+The refresh period defaults to 4 hours. Any value below 10 minutes will be treated as 10 minutes. [[wiki:DokuWiki]] will generally try to supply a cached version of a page, obviously this is inappropriate when the page contains dynamic external content. The parameter tells [[wiki:DokuWiki]] to re-render the page if it is more than //refresh period// since the page was last rendered.
+
+**Example:**
+
+ {{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+{{rss>http://slashdot.org/index.rss 5 author date 1h }}
+
+
+===== Control Macros =====
+
+Some syntax influences how DokuWiki renders a page without creating any output it self. The following control macros are availble:
+
+^ Macro ^ Description |
+| %%~~NOTOC~~%% | If this macro is found on the page, no table of contents will be created |
+| %%~~NOCACHE~~%% | DokuWiki caches all output by default. Sometimes this might not be wanted (eg. when the %%<php>%% syntax above is used), adding this macro will force DokuWiki to rerender a page on every call |
+
+===== Syntax Plugins =====
+
+DokuWiki's syntax can be extended by [[doku>plugins|Plugins]]. How the installed plugins are used is described on their appropriate description pages. The following syntax plugins are available in this particular DokuWiki installation:
+
+~~INFO:syntaxplugins~~
diff --git a/_test/data/security.png b/_test/data/security.png
new file mode 100644
index 000000000..c4f1a9771
--- /dev/null
+++ b/_test/data/security.png
Binary files differ
diff --git a/_test/data/security.xcf b/_test/data/security.xcf
new file mode 100644
index 000000000..990287830
--- /dev/null
+++ b/_test/data/security.xcf
Binary files differ
diff --git a/_test/data/tmp/_dummy b/_test/data/tmp/_dummy
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/data/tmp/_dummy
diff --git a/_test/phpunit.xml b/_test/phpunit.xml
new file mode 100644
index 000000000..bb0768b90
--- /dev/null
+++ b/_test/phpunit.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+ bootstrap="bootstrap.php"
+ convertNoticesToExceptions="false"
+ backupGlobals="yes">
+
+ <testsuites>
+ <testsuite name="DokuWiki Tests">
+ <directory suffix=".test.php">tests/</directory>
+ </testsuite>
+ <testsuite name="Plugin Tests">
+ <directory suffix=".test.php">../lib/plugins/*/_testing</directory>
+ </testsuite>
+ </testsuites>
+
+
+</phpunit>
diff --git a/_test/tests/inc/auth_aclcheck.test.php b/_test/tests/inc/auth_aclcheck.test.php
new file mode 100644
index 000000000..837926904
--- /dev/null
+++ b/_test/tests/inc/auth_aclcheck.test.php
@@ -0,0 +1,244 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/auth.php';
+require_once DOKU_INC.'inc/auth/basic.class.php';
+
+class auth_acl_test extends DokuWikiTest {
+
+ var $oldConf;
+ var $oldAuthAcl;
+
+ function setup() {
+ global $conf;
+ global $AUTH_ACL;
+ global $auth;
+ $this->oldConf = $conf;
+ $this->oldAuthAcl = $AUTH_ACL;
+ $auth = new auth_basic();
+ }
+
+ function teardown() {
+ global $conf;
+ global $AUTH_ACL;
+ $conf = $this->oldConf;
+ $AUTH_ACL = $this->oldAuthAcl;
+
+ }
+
+ function test_restricted(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+ }
+
+ function test_restricted_ropage(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ 'namespace:page @user 1',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+ }
+
+ function test_aclexample(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 4',
+ '* bigboss 16',
+ 'start @ALL 1',
+ 'marketing:* @marketing 8',
+ 'devel:* @ALL 0',
+ 'devel:* @devel 8',
+ 'devel:* bigboss 16',
+ 'devel:funstuff bigboss 0',
+ 'devel:* @marketing 1',
+ 'devel:marketing @marketing 2',
+ );
+
+
+ $this->assertEquals(auth_aclcheck('page', '' ,array()) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('page', 'jill' ,array('marketing')) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('page', 'jane' ,array('devel')) , AUTH_CREATE);
+
+ $this->assertEquals(auth_aclcheck('start', '' ,array()) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'bigboss' ,array('foo')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('start', 'jane' ,array('devel')) , AUTH_READ);
+
+ $this->assertEquals(auth_aclcheck('marketing:page', '' ,array()) , AUTH_CREATE);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'jill' ,array('marketing')) , AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('marketing:page', 'jane' ,array('devel')) , AUTH_CREATE);
+
+
+ $this->assertEquals(auth_aclcheck('devel:page', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:page', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('devel:page', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('devel:page', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ $this->assertEquals(auth_aclcheck('devel:funstuff', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'bigboss' ,array('foo')) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'jill' ,array('marketing')) , AUTH_READ);
+ $this->assertEquals(auth_aclcheck('devel:funstuff', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ $this->assertEquals(auth_aclcheck('devel:marketing', '' ,array()) , AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'bigboss' ,array('foo')) , AUTH_DELETE);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'jill' ,array('marketing')) , AUTH_EDIT);
+ $this->assertEquals(auth_aclcheck('devel:marketing', 'jane' ,array('devel')) , AUTH_UPLOAD);
+
+ }
+
+ function test_multiadmin_restricted(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user john
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+
+ // super user doe
+ $this->assertEquals(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
+
+ // user with matching admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
+
+ // user with matching another admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
+ }
+
+ function test_multiadmin_restricted_ropage(){
+ global $conf;
+ global $AUTH_ACL;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+ $conf['useacl'] = 1;
+
+ $AUTH_ACL = array(
+ '* @ALL 0',
+ '* @user 8',
+ 'namespace:page @user 1',
+ );
+
+ // anonymous user
+ $this->assertEquals(auth_aclcheck('page', '',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','',array()), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', '',array()), AUTH_NONE);
+
+ // user with no matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo')), AUTH_NONE);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo')), AUTH_NONE);
+
+ // user with matching group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','user')), AUTH_UPLOAD);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','user')), AUTH_READ);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','user')), AUTH_UPLOAD);
+
+ // super user john
+ $this->assertEquals(auth_aclcheck('page', 'john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','john',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'john',array('foo')), AUTH_ADMIN);
+
+ // super user doe
+ $this->assertEquals(auth_aclcheck('page', 'doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','doe',array('foo')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'doe',array('foo')), AUTH_ADMIN);
+
+ // user with matching admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','admin')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','admin')), AUTH_ADMIN);
+
+ // user with matching another admin group
+ $this->assertEquals(auth_aclcheck('page', 'jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:page','jill',array('foo','roots')), AUTH_ADMIN);
+ $this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_admincheck.test.php b/_test/tests/inc/auth_admincheck.test.php
new file mode 100644
index 000000000..c108c60c0
--- /dev/null
+++ b/_test/tests/inc/auth_admincheck.test.php
@@ -0,0 +1,130 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/auth.php';
+require_once DOKU_INC.'inc/auth/basic.class.php';
+
+class auth_admin_test_AuthInSensitive extends auth_basic {
+ function isCaseSensitive(){
+ return false;
+ }
+}
+
+class auth_admin_test extends DokuWikiTest {
+
+ private $oldauth;
+
+ function setup() {
+ global $auth;
+ $this->oldauth = $auth;
+ }
+
+ function setSensitive() {
+ global $auth;
+ $auth = new auth_basic();
+ }
+
+ function setInSensitive() {
+ global $auth;
+ $auth = new auth_admin_test_AuthInSensitive();
+ }
+
+ function teardown() {
+ global $auth;
+ global $conf;
+ global $AUTH_ACL;
+ unset($conf);
+ unset($AUTH_ACL);
+ $auth = $this->oldauth;
+ }
+
+ function test_ismanager_insensitive(){
+ $this->setInSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
+ $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,false), false);
+
+ // admin or manager users
+ $this->assertEquals(auth_ismanager('john', null,false), true);
+ $this->assertEquals(auth_ismanager('doe', null,false), true);
+
+ $this->assertEquals(auth_ismanager('dörte', null,false), true);
+ $this->assertEquals(auth_ismanager('dänny', null,false), true);
+
+ // admin or manager groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('managers'),false), true);
+
+ $this->assertEquals(auth_ismanager('jill', array('mötly görls'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('mötly böys'),false), true);
+ }
+
+ function test_isadmin_insensitive(){
+ $this->setInSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,true), false);
+
+ // admin user
+ $this->assertEquals(auth_ismanager('john', null,true), true);
+ $this->assertEquals(auth_ismanager('doe', null,true), true);
+
+ // admin groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('jill', array('roots'),true), true);
+ $this->assertEquals(auth_ismanager('john', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('doe', array('admin'),true), true);
+ }
+
+ function test_ismanager_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
+ $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,false), false);
+
+ // admin or manager users
+ $this->assertEquals(auth_ismanager('john', null,false), true);
+ $this->assertEquals(auth_ismanager('doe', null,false), true);
+
+ $this->assertEquals(auth_ismanager('dörte', null,false), false);
+ $this->assertEquals(auth_ismanager('dänny', null,false), false);
+
+ // admin or manager groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),false), true);
+ $this->assertEquals(auth_ismanager('jill', array('managers'),false), true);
+
+ $this->assertEquals(auth_ismanager('jill', array('mötly görls'),false), false);
+ $this->assertEquals(auth_ismanager('jill', array('mötly böys'),false), false);
+ }
+
+ function test_isadmin_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+
+ // anonymous user
+ $this->assertEquals(auth_ismanager('jill', null,true), false);
+
+ // admin user
+ $this->assertEquals(auth_ismanager('john', null,true), true);
+ $this->assertEquals(auth_ismanager('Doe', null,true), false);
+
+ // admin groups
+ $this->assertEquals(auth_ismanager('jill', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('jill', array('roots'),true), true);
+ $this->assertEquals(auth_ismanager('john', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('doe', array('admin'),true), true);
+ $this->assertEquals(auth_ismanager('Doe', array('admin'),true), true);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_nameencode.test.php b/_test/tests/inc/auth_nameencode.test.php
new file mode 100644
index 000000000..a3df6ac8c
--- /dev/null
+++ b/_test/tests/inc/auth_nameencode.test.php
@@ -0,0 +1,50 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/auth.php';
+
+class auth_nameencode_test extends DokuWikiTest {
+
+ function teardown() {
+ global $cache_authname;
+ $cache_authname = array();
+ }
+
+ function test_simple(){
+ $in = 'hey$you';
+ $out = 'hey%24you';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_quote(){
+ $in = 'hey"you';
+ $out = 'hey%22you';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_complex(){
+ $in = 'hey $ you !$%! foo ';
+ $out = 'hey%20%24%20you%20%21%24%25%21%20foo%20';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_complexutf8(){
+ $in = 'häü $ yü !$%! foo ';
+ $out = 'häü%20%24%20yü%20%21%24%25%21%20foo%20';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+
+ function test_groupskipon(){
+ $in = '@hey$you';
+ $out = '@hey%24you';
+ $this->assertEquals(auth_nameencode($in,true),$out);
+ }
+
+ function test_groupskipoff(){
+ $in = '@hey$you';
+ $out = '%40hey%24you';
+ $this->assertEquals(auth_nameencode($in),$out);
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/auth_password.cputest.php b/_test/tests/inc/auth_password.cputest.php
new file mode 100644
index 000000000..4c922d0e3
--- /dev/null
+++ b/_test/tests/inc/auth_password.cputest.php
@@ -0,0 +1,70 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/auth.php';
+
+class auth_password_test extends PHPUnit_Framework_TestCase {
+
+ // hashes for the password foo$method, using abcdefgh as salt
+ var $passes = array(
+ 'smd5' => '$1$abcdefgh$SYbjm2AEvSoHG7Xapi8so.',
+ 'apr1' => '$apr1$abcdefgh$C/GzYTF4kOVByYLEoD5X4.',
+ 'md5' => '8fa22d62408e5351553acdd91c6b7003',
+ 'sha1' => 'b456d3b0efd105d613744ffd549514ecafcfc7e1',
+ 'ssha' => '{SSHA}QMHG+uC7bHNYKkmoLbNsNI38/dJhYmNk',
+ 'lsmd5' => '{SMD5}HGbkPrkWgy9KgcRGWlrsUWFiY2RlZmdo',
+ 'crypt' => 'ablvoGr1hvZ5k',
+ 'mysql' => '4a1fa3780bd6fd55',
+ 'my411' => '*e5929347e25f82e19e4ebe92f1dc6b6e7c2dbd29',
+ 'kmd5' => 'a579299436d7969791189acadd86fcb716',
+ 'pmd5' => '$P$abcdefgh1RC6Fd32heUzl7EYCG9uGw.',
+ 'hmd5' => '$H$abcdefgh1ZbJodHxmeXVAhEzTG7IAp.',
+ 'djangomd5' => 'md5$abcde$d0fdddeda8cd92725d2b54148ac09158',
+ 'djangosha1' => 'sha1$abcde$c8e65a7f0acc9158843048a53dcc5a6bc4d17678',
+ );
+
+
+ function test_cryptPassword(){
+ foreach($this->passes as $method => $hash){
+ $info = "testing method $method";
+ $this->assertEquals(auth_cryptPassword('foo'.$method, $method,'abcdefgh12345678912345678912345678'),
+ $hash, $info);
+ }
+ }
+
+ function test_verifyPassword(){
+ foreach($this->passes as $method => $hash){
+ $info = "testing method $method";
+ $this->assertTrue(auth_verifyPassword('foo'.$method, $hash), $info);
+ }
+ }
+
+ function test_verifySelf(){
+ foreach($this->passes as $method => $hash){
+ $info = "testing method $method";
+ $hash = auth_cryptPassword('foo'.$method,$method);
+ $this->assertTrue(auth_verifyPassword('foo'.$method, $hash), $info);
+ }
+ }
+
+ function test_bcrypt_self(){
+ $hash = auth_cryptPassword('foobcrypt','bcrypt');
+ $this->assertTrue(auth_verifyPassword('foobcrypt',$hash));
+ }
+
+ function test_verifyPassword_fixedbcrypt(){
+ $this->assertTrue(auth_verifyPassword('foobcrypt','$2a$12$uTWercxbq4sjp2xAzv3we.ZOxk51m5V/Bv5bp2H27oVFJl5neFQoC'));
+ }
+
+ function test_verifyPassword_nohash(){
+ $this->assertTrue(auth_verifyPassword('foo','$1$$n1rTiFE0nRifwV/43bVon/'));
+ }
+
+ function test_verifyPassword_fixedpmd5(){
+ $this->assertTrue(auth_verifyPassword('test12345','$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
+ $this->assertTrue(auth_verifyPassword('test12345','$H$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_cleanText.test.php b/_test/tests/inc/common_cleanText.test.php
new file mode 100644
index 000000000..58f38d9bf
--- /dev/null
+++ b/_test/tests/inc/common_cleanText.test.php
@@ -0,0 +1,28 @@
+<?php
+
+require_once DOKU_INC . 'inc/init.php';
+require_once DOKU_INC . 'inc/common.php';
+
+class common_cleanText_test extends DokuWikiTest {
+
+ function test_unix(){
+ $unix = 'one
+ two
+
+ three';
+
+ $this->assertEquals($unix,cleanText($unix));
+ }
+
+ function test_win(){
+ $unix = "one\ntwo\nthree";
+ $win = "one\r\ntwo\r\nthree";
+
+ $this->assertEquals(bin2hex($unix), '6f6e650a74776f0a7468726565');
+ $this->assertEquals(bin2hex($win), '6f6e650d0a74776f0d0a7468726565');
+ $this->assertNotEquals($unix, $win);
+ $this->assertEquals($unix, cleanText($win));
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_clientip.test.php b/_test/tests/inc/common_clientip.test.php
new file mode 100644
index 000000000..680050e42
--- /dev/null
+++ b/_test/tests/inc/common_clientip.test.php
@@ -0,0 +1,154 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/common.php';
+
+class common_clientIP_test extends DokuWikiTest {
+
+ function test_simple_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_proxy1_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+ $out = '123.123.123.123,77.77.77.77';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_proxy2_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
+ $out = '123.123.123.123,77.77.77.77';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_proxyhops_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
+ $out = '123.123.123.123,77.77.77.77,66.66.66.66';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_simple_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_proxy1_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '77.77.77.77';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '';
+ $out = '77.77.77.77';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_proxy2_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77';
+ $out = '77.77.77.77';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_proxyhops_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '77.77.77.77,66.66.66.66';
+ $out = '66.66.66.66';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_local_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
+ $out = '123.123.123.123,127.0.0.1';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_local1_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_local2_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '123.123.123.123';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_local3_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '127.0.0.1,10.0.0.1,192.168.0.2,172.17.1.1,172.21.1.1,172.31.1.1';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_local4_single(){
+ $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.0.5';
+ $out = '192.168.0.5';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_garbage_all(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_garbage_single(){
+ $_SERVER['REMOTE_ADDR'] = '123.123.123.123';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
+ $out = '123.123.123.123';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_garbageonly_all(){
+ $_SERVER['REMOTE_ADDR'] = 'argh';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
+ $out = '0.0.0.0';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+ function test_garbageonly_single(){
+ $_SERVER['REMOTE_ADDR'] = 'argh';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = 'some garbage, or something, 222';
+ $out = '0.0.0.0';
+ $this->assertEquals(clientIP(true),$out);
+ }
+
+ function test_malicious(){
+ $_SERVER['REMOTE_ADDR'] = '';
+ $_SERVER['HTTP_X_REAL_IP'] = '';
+ $_SERVER['HTTP_X_FORWARDED_FOR'] = '<?php set_time_limit(0);echo \'my_delim\';passthru(123.123.123.123);die;?>';
+ $out = '0.0.0.0';
+ $this->assertEquals(clientIP(),$out);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_obfuscate.test.php b/_test/tests/inc/common_obfuscate.test.php
new file mode 100644
index 000000000..19dd2ff2c
--- /dev/null
+++ b/_test/tests/inc/common_obfuscate.test.php
@@ -0,0 +1,29 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/common.php';
+
+class common_obfuscate_test extends DokuWikiTest {
+
+ function test_none(){
+ global $conf;
+ $conf['mailguard'] = 'none';
+ $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon-doe@example.com');
+ }
+
+ function test_hex(){
+ global $conf;
+ $conf['mailguard'] = 'hex';
+ $this->assertEquals(obfuscate('jon-doe@example.com'),
+ '&#x6a;&#x6f;&#x6e;&#x2d;&#x64;&#x6f;&#x65;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;');
+ }
+
+ function test_visible(){
+ global $conf;
+ $conf['mailguard'] = 'visible';
+ $this->assertEquals(obfuscate('jon-doe@example.com'), 'jon [dash] doe [at] example [dot] com');
+ }
+
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/common_pagetemplate.test.php b/_test/tests/inc/common_pagetemplate.test.php
new file mode 100644
index 000000000..c4a2dfdf9
--- /dev/null
+++ b/_test/tests/inc/common_pagetemplate.test.php
@@ -0,0 +1,18 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/common.php';
+
+class common_pagetemplate_test extends DokuWikiTest {
+
+ function test_none(){
+ global $conf;
+ $conf['sepchar'] = '-';
+ $data = array(
+ 'id' => 'page-id-long',
+ 'tpl' => '"@PAGE@" "@!PAGE@" "@!!PAGE@" "@!PAGE!@"',
+ );
+ $this->assertEquals(parsePageTemplate($data), '"page id long" "Page id long" "Page Id Long" "PAGE ID LONG"');
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/form_form.test.php b/_test/tests/inc/form_form.test.php
new file mode 100644
index 000000000..f55f16106
--- /dev/null
+++ b/_test/tests/inc/form_form.test.php
@@ -0,0 +1,104 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+
+class form_test extends DokuWikiTest {
+
+ function _testform() {
+ $form = new Doku_Form(array('id' => 'dw__testform', 'action' => '/test'));
+ $form->startFieldset('Test');
+ $form->addHidden('summary', 'changes &c');
+ $form->addElement(form_makeTextField('t', 'v', 'Text', 'text__id', 'block'));
+ $form->addElement(form_makeCheckboxField('r', '1', 'Check', 'check__id', 'simple'));
+ $form->addElement(form_makeButton('submit', 'save', 'Save', array('accesskey'=>'s')));
+ $form->addElement(form_makeButton('submit', 'cancel', 'Cancel'));
+ $form->endFieldset();
+ return $form;
+ }
+
+ function _realoutput() {
+ global $lang;
+ $realoutput = '<form id="dw__testform" action="/test" method="post" ';
+ $realoutput .= 'accept-charset="'.$lang['encoding'].'">';
+ $realoutput .= "\n";
+ $realoutput .= '<div class="no"><input type="hidden" name="sectok" value="'.getSecurityToken().'" />';
+ $realoutput .= '<input type="hidden" name="summary" value="changes &amp;c" />';
+ $realoutput .= "\n";
+ $realoutput .= "<fieldset ><legend>Test</legend>\n";
+ $realoutput .= '<label class="block" for="text__id"><span>Text</span> ';
+ $realoutput .= '<input type="text" id="text__id" name="t" value="v" class="edit" /></label><br />';
+ $realoutput .= "\n";
+ $realoutput .= '<label class="simple" for="check__id">';
+ $realoutput .= '<input type="checkbox" id="check__id" name="r" value="1" /> ';
+ $realoutput .= '<span>Check</span></label>';
+ $realoutput .= "\n";
+ $realoutput .= '<input name="do[save]" type="submit" value="Save" class="button" accesskey="s" title="Save [S]" />';
+ $realoutput .= "\n";
+ $realoutput .= '<input name="do[cancel]" type="submit" value="Cancel" class="button" />';
+ $realoutput .= "\n";
+ $realoutput .= "</fieldset>\n</div></form>\n";
+ return $realoutput;
+ }
+
+ function _ignoreTagWS($data){
+ return preg_replace('/>\s+</','><',$data);
+ }
+
+ function test_form_print() {
+ $form = $this->_testform();
+ ob_start();
+ $form->printForm();
+ $output = ob_get_contents();
+ ob_end_clean();
+ $form->addHidden('sectok', getSecurityToken());
+ $this->assertEquals($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
+ }
+
+ function test_get_element_at() {
+ $form = $this->_testform();
+ $e1 =& $form->getElementAt(1);
+ $this->assertEquals($e1, array('_elem'=>'textfield',
+ '_text'=>'Text',
+ '_class'=>'block',
+ 'id'=>'text__id',
+ 'name'=>'t',
+ 'value'=>'v',
+ 'class'=>'edit'));
+ $e2 =& $form->getElementAt(99);
+ $this->assertEquals($e2, array('_elem'=>'closefieldset'));
+ }
+
+ function test_find_element_by_type() {
+ $form = $this->_testform();
+ $this->assertEquals($form->findElementByType('button'), 3);
+ $this->assertFalse($form->findElementByType('text'));
+ }
+
+ function test_find_element_by_id() {
+ $form = $this->_testform();
+ $this->assertEquals($form->findElementById('check__id'), 2);
+ $this->assertFalse($form->findElementById('dw__testform'));
+ }
+
+ function test_find_element_by_attribute() {
+ $form = $this->_testform();
+ $this->assertEquals($form->findElementByAttribute('value','Cancel'), 4);
+ $this->assertFalse($form->findElementByAttribute('name','cancel'));
+ }
+
+ function test_close_fieldset() {
+ $form = new Doku_Form(array('id' => 'dw__testform', 'action' => '/test'));
+ $form->startFieldset('Test');
+ $form->addHidden('summary', 'changes &c');
+ $form->addElement(form_makeTextField('t', 'v', 'Text', 'text__id', 'block'));
+ $form->addElement(form_makeCheckboxField('r', '1', 'Check', 'check__id', 'simple'));
+ $form->addElement(form_makeButton('submit', 'save', 'Save', array('accesskey'=>'s')));
+ $form->addElement(form_makeButton('submit', 'cancel', 'Cancel'));
+ ob_start();
+ $form->printForm();
+ $output = ob_get_contents();
+ ob_end_clean();
+ $this->assertEquals($this->_ignoreTagWS($output),$this->_ignoreTagWS($this->_realoutput()));
+ }
+
+}
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
new file mode 100644
index 000000000..3857273f7
--- /dev/null
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -0,0 +1,141 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/HTTPClient.php';
+
+class httpclient_http_test extends DokuWikiTest {
+ protected $server = 'http://httpbin.org';
+
+ function test_simpleget(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/get?foo=bar');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('args',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['args']);
+ }
+
+ function test_dget(){
+ $http = new HTTPClient();
+ $data = $http->dget($this->server.'/get',array('foo'=>'bar'));
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('args',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['args']);
+ }
+
+ function test_gzip(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/gzip');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('gzipped',$resp);
+ $this->assertTrue($resp['gzipped']);
+ }
+
+ function test_simplepost(){
+ $http = new HTTPClient();
+ $data = $http->post($this->server.'/post',array('foo'=>'bar'));
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('form',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['form']);
+ }
+
+ function test_redirect(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/redirect/3');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('url',$resp);
+ $this->assertRegExp('/\/get$/', $resp['url']);
+ }
+
+ function test_relredirect(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/relative-redirect/3');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('url',$resp);
+ $this->assertRegExp('/\/get$/', $resp['url']);
+ }
+
+ function test_redirectfail(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/redirect/5');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals('Maximum number of redirects exceeded',$http->error);
+ }
+
+ function test_cookies(){
+ $http = new HTTPClient();
+ $http->get($this->server.'/cookies/set/foo/bar');
+ $this->assertEquals(array('foo' => 'bar'), $http->cookies);
+ $data = $http->get($this->server.'/cookies');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('cookies',$resp);
+ $this->assertEquals(array('foo'=>'bar'), $resp['cookies']);
+ }
+
+ function test_teapot(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/status/418');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(418,$http->status);
+ }
+
+ function test_maxbody(){
+ $http = new HTTPClient();
+ $http->max_bodysize = 250;
+ $data = $http->get($this->server.'/stream/30');
+ $this->assertTrue($data === false, 'HTTP response');
+ }
+
+ function test_basicauth(){
+ $http = new HTTPClient();
+ $http->user = 'user';
+ $http->pass = 'pass';
+ $data = $http->get($this->server.'/basic-auth/user/pass');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertEquals(array('authenticated'=>true,'user'=>'user'), $resp);
+ }
+
+ function test_basicauthfail(){
+ $http = new HTTPClient();
+ $http->user = 'user';
+ $http->pass = 'invalid';
+ $data = $http->get($this->server.'/basic-auth/user/pass');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(401,$http->status);
+ }
+
+ function test_timeout(){
+ $http = new HTTPClient();
+ $http->timeout = 5;
+ $data = $http->get($this->server.'/delay/10');
+ $this->assertTrue($data === false, 'HTTP response');
+ $this->assertEquals(-100,$http->status);
+ }
+
+ function test_headers(){
+ $http = new HTTPClient();
+ $data = $http->get($this->server.'/response-headers?baz=&foo=bar');
+ $this->assertFalse($data === false, 'HTTP response');
+ $resp = json_decode($data, true);
+ $this->assertTrue(is_array($resp), 'JSON response');
+ $this->assertArrayHasKey('baz',$http->resp_headers);
+ $this->assertArrayHasKey('foo',$http->resp_headers);
+ $this->assertEquals('bar',$http->resp_headers['foo']);
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/httpclient_https.test.php b/_test/tests/inc/httpclient_https.test.php
new file mode 100644
index 000000000..f19e7c6d6
--- /dev/null
+++ b/_test/tests/inc/httpclient_https.test.php
@@ -0,0 +1,8 @@
+<?php
+
+require_once dirname(__FILE__).'/httpclient_http.test.php';
+
+class httpclient_https_test extends httpclient_http_test {
+ protected $server = 'https://httpbin.org/';
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/init_fullpath.test.php b/_test/tests/inc/init_fullpath.test.php
new file mode 100644
index 000000000..e5b322874
--- /dev/null
+++ b/_test/tests/inc/init_fullpath.test.php
@@ -0,0 +1,87 @@
+<?php
+require_once DOKU_INC.'inc/init.php';
+
+class init_fullpath_test extends DokuWikiTest {
+
+ function test_unix_paths(){
+ $base = $_SERVER['SCRIPT_FILENAME'];
+ $_SERVER['SCRIPT_FILENAME'] = '/absolute/path/self.php';
+ $GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS'] = false;
+
+ // paths to check
+ $tests = array(
+ '/foo/bar/baz' => '/foo/bar/baz',
+ '/foo//bar/baz' => '/foo/bar/baz',
+ '/foo/../bar/baz' => '/bar/baz',
+ '/foo/./bar/baz' => '/foo/bar/baz',
+ '/foo/bar/..' => '/foo',
+ '/foo/bar/../../../baz' => '/baz',
+
+ 'foo/bar/baz' => '/absolute/path/foo/bar/baz',
+ 'foo//bar/baz' => '/absolute/path/foo/bar/baz',
+ 'foo/../bar/baz' => '/absolute/path/bar/baz',
+ 'foo/./bar/baz' => '/absolute/path/foo/bar/baz',
+ 'foo/bar/..' => '/absolute/path/foo',
+ 'foo/bar/../../../baz' => '/absolute/baz',
+ );
+
+ foreach($tests as $from => $to){
+ $info = "Testing '$from' resulted in '".fullpath($from)."'";
+
+ $this->assertEquals(fullpath($from), $to, $info);
+ }
+
+
+ $_SERVER['SCRIPT_FILENAME'] = $base;
+ unset($GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']);
+ }
+
+ function test_windows_paths(){
+ $base = $_SERVER['SCRIPT_FILENAME'];
+ $_SERVER['SCRIPT_FILENAME'] = '/absolute/path/self.php';
+ $GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS'] = true;
+
+ // paths to check
+ $tests = array(
+ 'c:foo/bar/baz' => 'c:/foo/bar/baz',
+ 'c:foo//bar/baz' => 'c:/foo/bar/baz',
+ 'c:foo/../bar/baz' => 'c:/bar/baz',
+ 'c:foo/./bar/baz' => 'c:/foo/bar/baz',
+ 'c:foo/bar/..' => 'c:/foo',
+ 'c:foo/bar/../../../baz' => 'c:/baz',
+
+ 'c:/foo/bar/baz' => 'c:/foo/bar/baz',
+ 'c:/foo//bar/baz' => 'c:/foo/bar/baz',
+ 'c:/foo/../bar/baz' => 'c:/bar/baz',
+ 'c:/foo/./bar/baz' => 'c:/foo/bar/baz',
+ 'c:/foo/bar/..' => 'c:/foo',
+ 'c:/foo/bar/../../../baz' => 'c:/baz',
+
+ 'c:\\foo\\bar\\baz' => 'c:/foo/bar/baz',
+ 'c:\\foo\\\\bar\\baz' => 'c:/foo/bar/baz',
+ 'c:\\foo\\..\\bar\\baz' => 'c:/bar/baz',
+ 'c:\\foo\\.\\bar\\baz' => 'c:/foo/bar/baz',
+ 'c:\\foo\\bar\\..' => 'c:/foo',
+ 'c:\\foo\\bar\\..\\..\\..\\baz' => 'c:/baz',
+
+ '\\\\server\\share/foo/bar/baz' => '\\\\server\\share/foo/bar/baz',
+ '\\\\server\\share/foo//bar/baz' => '\\\\server\\share/foo/bar/baz',
+ '\\\\server\\share/foo/../bar/baz' => '\\\\server\\share/bar/baz',
+ '\\\\server\\share/foo/./bar/baz' => '\\\\server\\share/foo/bar/baz',
+ '\\\\server\\share/foo/bar/..' => '\\\\server\\share/foo',
+ '\\\\server\\share/foo/bar/../../../baz' => '\\\\server\\share/baz',
+ );
+
+ foreach($tests as $from => $to){
+ $info = "Testing '$from' resulted in '".fullpath($from)."'";
+
+ $this->assertEquals(fullpath($from), $to, $info);
+ }
+
+
+ $_SERVER['SCRIPT_FILENAME'] = $base;
+ unset($GLOBALS['DOKU_UNITTEST_ASSUME_WINDOWS']);
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/init_getbaseurl.test.php b/_test/tests/inc/init_getbaseurl.test.php
new file mode 100644
index 000000000..9d1377b3c
--- /dev/null
+++ b/_test/tests/inc/init_getbaseurl.test.php
@@ -0,0 +1,305 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+
+class init_getBaseURL_test extends DokuWikiTest {
+
+ /**
+ * Apache, mod_php, subdirectory
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test1(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
+ }
+
+ /**
+ * Apache, CGI, mod_userdir, subdirectory
+ *
+ * data provided by Hilko Bengen <bengen@hilluzination.de>
+ */
+ function test2(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/localhost';
+ $_SERVER['HTTP_HOST'] = 'localhost';
+ $_SERVER['SCRIPT_FILENAME'] = '/usr/lib/cgi-bin/php4';
+ $_SERVER['REQUEST_URI'] = '/~bengen/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/cgi-bin/php4';
+ $_SERVER['PATH_INFO'] = '/~bengen/dokuwiki/doku.php';
+ $_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
+ }
+
+ /**
+ * Apache, FastCGI, mod_userdir, subdirectory
+ *
+ * data provided by Hilko Bengen <bengen@hilluzination.de>
+ */
+ function test3(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/localhost';
+ $_SERVER['HTTP_HOST'] = 'localhost';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/run/php-fastcgi/fcgi-bin/bengen/php4';
+ $_SERVER['REQUEST_URI'] = '/~bengen/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/fcgi-bin/php4-bengen';
+ $_SERVER['PATH_INFO'] = '/~bengen/dokuwiki/doku.php';
+ $_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
+ }
+
+ /**
+ * Apache, mod_php, mod_userdir, subdirectory
+ *
+ * data provided by Hilko Bengen <bengen@hilluzination.de>
+ */
+ function test4(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/localhost';
+ $_SERVER['HTTP_HOST'] = 'localhost';
+ $_SERVER['SCRIPT_FILENAME'] = '/home/bengen/public_html/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/~bengen/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/~bengen/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = '/home/bengen/public_html/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/~bengen/dokuwiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/~bengen/dokuwiki/');
+ }
+
+ /**
+ * IIS
+ *
+ * data provided by David Mach <david.mach@centrum.cz>
+ */
+ function test5(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = null;
+ $_SERVER['HTTP_HOST'] = 'intranet';
+ $_SERVER['SCRIPT_FILENAME'] = null;
+ $_SERVER['REQUEST_URI'] = null;
+ $_SERVER['SCRIPT_NAME'] = '/wiki/doku.php';
+ $_SERVER['PATH_INFO'] = '/wiki/doku.php';
+ $_SERVER['PATH_TRANSLATED'] = 'C:\\Inetpub\\wwwroot\\wiki\\doku.php';
+ $_SERVER['PHP_SELF'] = '/wiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/wiki/');
+ }
+
+ /**
+ * Apache 2, mod_php, real URL rewriting, useslash (bug #292)
+ *
+ * data provided by Ted <bugsX2904@elcsplace.com>
+ */
+ function test6(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/home/websites/wiki/htdocs';
+ $_SERVER['HTTP_HOST'] = 'wiki.linuxwan.net';
+ $_SERVER['SCRIPT_FILENAME'] = '/home/websites/wiki/htdocs/doku.php';
+ $_SERVER['REQUEST_URI'] = '/wiki/syntax?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/wiki/syntax';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = null;
+ $_SERVER['PHP_SELF'] = '/wiki/syntax';
+
+ $this->assertEquals(getBaseURL(),'/');
+ }
+
+ /**
+ * lighttpd, fastcgi
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test7(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'localhost';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = '';
+ $_SERVER['PATH_TRANSLATED'] = null;
+ $_SERVER['PHP_SELF'] = '';
+
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
+ }
+
+ /**
+ * Apache, mod_php, Pseudo URL rewrite, useslash
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test8(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/doku.php/wiki/syntax?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = '/wiki/syntax';
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/wiki/syntax';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/wiki/syntax';
+
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
+ }
+
+ /**
+ * Apache, mod_php, real URL rewrite, useslash
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test9(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/wiki/syntax?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
+
+ $this->assertEquals(getBaseURL(),'/dokuwiki/');
+ }
+
+ /**
+ * Possible user settings of $conf['baseurl'] & absolute baseURL required
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test10(){
+ // values for $conf['baseurl'] and expected results
+ $tests = array(
+ 'http://www.mysite.com' => 'http://www.mysite.com/dokuwiki/',
+ 'http://www.mysite.com/' => 'http://www.mysite.com/dokuwiki/',
+ 'http://www.mysite.com/path/to/wiki' => 'http://www.mysite.com/path/to/wiki/dokuwiki/',
+ 'http://www.mysite.com/path/to/wiki/' => 'http://www.mysite.com/path/to/wiki/dokuwiki/',
+ );
+
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/wiki/syntax?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
+
+ foreach ($tests as $test => $correct_result) {
+ $conf['baseurl'] = $test;
+ $this->assertEquals(getBaseURL(true),$correct_result);
+ }
+ }
+ /**
+ * Possible user settings of $conf['baseurl'] & absolute baseURL required
+ *
+ * data provided by Andreas Gohr <andi@splitbrain.org>
+ */
+ function test11(){
+ // values for $conf['baseurl'] and expected results
+ $tests = array(
+ 'http://www.mysite.com' => 'http://www.mysite.com/dokuwiki/',
+ 'http://www.mysite.com/' => 'http://www.mysite.com/dokuwiki/',
+ 'http://www.mysite.com/path/to/wiki' => 'http://www.mysite.com/path/to/wiki/dokuwiki/',
+ 'http://www.mysite.com/path/to/wiki/' => 'http://www.mysite.com/path/to/wiki/dokuwiki/',
+ );
+
+ global $conf;
+ $conf['basedir'] = '/dokuwiki';
+ $conf['baseurl'] = '';
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/wiki/syntax?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php';
+
+ foreach ($tests as $test => $correct_result) {
+ $conf['baseurl'] = $test;
+ $this->assertEquals(getBaseURL(true),$correct_result);
+ }
+ }
+
+ /**
+ * Absolute URL with IPv6 domain name.
+ * lighttpd, fastcgi
+ *
+ * data provided by Michael Hamann <michael@content-space.de>
+ */
+ function test12() {
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/srv/http/';
+ $_SERVER['HTTP_HOST'] = '[fd00::6592:39ed:a2ed:2c78]';
+ $_SERVER['SCRIPT_FILENAME'] = '/srv/http/~michitux/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/~michitux/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/~michitux/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = null;
+ $_SERVER['PHP_SELF'] = '/~michitux/dokuwiki/doku.php';
+ $_SERVER['SERVER_PORT'] = '80';
+ $_SERVER['SERVER_NAME'] = '[fd00';
+ $this->assertEquals(getBaseURL(true), 'http://[fd00::6592:39ed:a2ed:2c78]/~michitux/dokuwiki/');
+ }
+}
+
+//Setup VIM: ex: et ts=2 :
diff --git a/_test/tests/inc/ixr_library_date.test.php b/_test/tests/inc/ixr_library_date.test.php
new file mode 100644
index 000000000..377b0fd33
--- /dev/null
+++ b/_test/tests/inc/ixr_library_date.test.php
@@ -0,0 +1,36 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/IXR_Library.php';
+
+class ixr_library_date_test extends DokuWikiTest {
+
+
+ function test_parseIso(){
+ // multiple tests
+ $tests = array(
+ // full datetime, different formats
+ array('2010-08-17T09:23:14', 1282036994),
+ array('20100817T09:23:14', 1282036994),
+ array('2010-08-17 09:23:14', 1282036994),
+ array('20100817 09:23:14', 1282036994),
+ array('2010-08-17T09:23:14Z', 1282036994),
+ array('20100817T09:23:14Z', 1282036994),
+
+ // no seconds
+ array('2010-08-17T09:23', 1282036980),
+ array('20100817T09:23', 1282036980),
+
+ // no time
+ array('2010-08-17', 1282003200),
+ //array('20100817', 1282003200), #this will NOT be parsed, but is assumed to be timestamp
+ );
+
+ foreach($tests as $test){
+ $dt = new IXR_Date($test[0]);
+ $this->assertEquals($dt->getTimeStamp(),$test[1]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/ixr_library_ixr_message.test.php b/_test/tests/inc/ixr_library_ixr_message.test.php
new file mode 100644
index 000000000..ea7646b6a
--- /dev/null
+++ b/_test/tests/inc/ixr_library_ixr_message.test.php
@@ -0,0 +1,140 @@
+<?php
+require_once DOKU_INC.'inc/init.php';
+require_once DOKU_INC.'inc/IXR_Library.php';
+
+class ixr_library_ixr_message_test extends DokuWikiTest {
+
+
+
+
+
+ function test_untypedvalue1(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value> change </value></param></params></methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
+ }
+
+ function test_untypedvalue2(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>
+ <methodCall>
+ <methodName>wiki.getBackLinks</methodName>
+ <params>
+ <param>
+ <value> change </value>
+ </param>
+ </params>
+ </methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
+ }
+
+ function test_stringvalue1(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value><string> change </string></value></param></params></methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
+ }
+
+ function test_stringvalue2(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>
+ <methodCall>
+ <methodName>wiki.getBackLinks</methodName>
+ <params>
+ <param>
+ <value>
+ <string> change </string>
+ </value>
+ </param>
+ </params>
+ </methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(' change '));
+ }
+
+ function test_emptyvalue1(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value><string></string></value></param></params></methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(''));
+ }
+
+ function test_emptyvalue2(){
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>
+ <methodCall>
+ <methodName>wiki.getBackLinks</methodName>
+ <params>
+ <param>
+ <value>
+ <string></string>
+ </value>
+ </param>
+ </params>
+ </methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.getBackLinks');
+ $this->assertEquals($ixrmsg->params,array(''));
+ }
+
+ function test_struct(){
+ $xml = '<?xml version=\'1.0\'?>
+ <methodCall>
+ <methodName>wiki.putPage</methodName>
+ <params>
+ <param>
+ <value><string>start</string></value>
+ </param>
+ <param>
+ <value><string>test text</string></value>
+ </param>
+ <param>
+ <value><struct>
+ <member>
+ <name>sum</name>
+ <value><string>xmlrpc edit</string></value>
+ </member>
+ <member>
+ <name>minor</name>
+ <value><string>1</string></value>
+ </member>
+ </struct></value>
+ </param>
+ </params>
+ </methodCall>';
+
+ $ixrmsg = new IXR_Message($xml);
+ $ixrmsg->parse();
+
+ $this->assertEquals($ixrmsg->messageType,'methodCall');
+ $this->assertEquals($ixrmsg->methodName,'wiki.putPage');
+ $this->assertEquals($ixrmsg->params,array('start','test text',array('sum'=>'xmlrpc edit','minor'=>'1')));
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/mail_isvalid.test.php b/_test/tests/inc/mail_isvalid.test.php
new file mode 100644
index 000000000..58f8e69d7
--- /dev/null
+++ b/_test/tests/inc/mail_isvalid.test.php
@@ -0,0 +1,82 @@
+<?php
+// use no mbstring help here
+require_once DOKU_INC.'inc/init.php';
+
+class mail_isvalid extends DokuWikiTest {
+
+
+ function test1(){
+ $tests = array();
+
+ // our own tests
+ $tests[] = array('bugs@php.net',true);
+ $tests[] = array('~someone@somewhere.com',true);
+ $tests[] = array('no+body.here@somewhere.com.au',true);
+ $tests[] = array('username+tag@domain.com',true); // FS#1447
+ $tests[] = array("rfc2822+allthesechars_#*!'`/-={}are.legal@somewhere.com.au",true);
+ $tests[] = array('_foo@test.com',true); // FS#1049
+ $tests[] = array('bugs@php.net1',true); // new ICAN rulez seem to allow this
+ $tests[] = array('.bugs@php.net1',false);
+ $tests[] = array('bu..gs@php.net',false);
+ $tests[] = array('bugs@php..net',false);
+ $tests[] = array('bugs@.php.net',false);
+ $tests[] = array('bugs@php.net.',false);
+ $tests[] = array('bu(g)s@php.net1',false);
+ $tests[] = array('bu[g]s@php.net1',false);
+ $tests[] = array('somebody@somewhere.museum',true);
+ $tests[] = array('somebody@somewhere.travel',true);
+ $tests[] = array('root@[2010:fb:fdac::311:2101]',true);
+ $tests[] = array('test@example', true); // we allow local addresses
+
+ // tests from http://code.google.com/p/php-email-address-validation/ below
+
+ $tests[] = array('test@example.com', true);
+ $tests[] = array('TEST@example.com', true);
+ $tests[] = array('1234567890@example.com', true);
+ $tests[] = array('test+test@example.com', true);
+ $tests[] = array('test-test@example.com', true);
+ $tests[] = array('t*est@example.com', true);
+ $tests[] = array('+1~1+@example.com', true);
+ $tests[] = array('{_test_}@example.com', true);
+ $tests[] = array('"[[ test ]]"@example.com', true);
+ $tests[] = array('test.test@example.com', true);
+ $tests[] = array('test."test"@example.com', true);
+ $tests[] = array('"test@test"@example.com', true);
+ $tests[] = array('test@123.123.123.123', true);
+ $tests[] = array('test@[123.123.123.123]', true);
+ $tests[] = array('test@example.example.com', true);
+ $tests[] = array('test@example.example.example.com', true);
+
+ $tests[] = array('test.example.com', false);
+ $tests[] = array('test.@example.com', false);
+ $tests[] = array('test..test@example.com', false);
+ $tests[] = array('.test@example.com', false);
+ $tests[] = array('test@test@example.com', false);
+ $tests[] = array('test@@example.com', false);
+ $tests[] = array('-- test --@example.com', false); // No spaces allowed in local part
+ $tests[] = array('[test]@example.com', false); // Square brackets only allowed within quotes
+ $tests[] = array('"test\test"@example.com', false); // Quotes cannot contain backslash
+ $tests[] = array('"test"test"@example.com', false); // Quotes cannot be nested
+ $tests[] = array('()[]\;:,<>@example.com', false); // Disallowed Characters
+ $tests[] = array('test@.', false);
+ $tests[] = array('test@example.', false);
+ $tests[] = array('test@.org', false);
+ $tests[] = array('12345678901234567890123456789012345678901234567890123456789012345@example.com', false); // 64 characters is maximum length for local part. This is 65.
+ $tests[] = array('test@123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012.com', false); // 255 characters is maximum length for domain. This is 256.
+ $tests[] = array('test@[123.123.123.123', false);
+ $tests[] = array('test@123.123.123.123]', false);
+
+
+ foreach($tests as $test){
+ $info = 'Testing '.$test[0];
+
+ if($test[1]){
+ $this->assertTrue((bool) mail_isvalid($test[0]), $info);
+ }else{
+ $this->assertFalse((bool) mail_isvalid($test[0]), $info);
+ }
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/mail_quoted_printable_encode.test.php b/_test/tests/inc/mail_quoted_printable_encode.test.php
new file mode 100644
index 000000000..888b1d1bf
--- /dev/null
+++ b/_test/tests/inc/mail_quoted_printable_encode.test.php
@@ -0,0 +1,44 @@
+<?php
+
+require_once DOKU_INC.'inc/mail.php';
+
+class mail_quotedprintable_encode extends DokuWikiTest {
+
+ function test_simple(){
+ $in = 'hello';
+ $out = 'hello';
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
+ }
+
+ function test_spaceend(){
+ $in = "hello \nhello";
+ $out = "hello=20\nhello";
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
+ }
+
+ function test_german_utf8(){
+ $in = 'hello überlänge';
+ $out = 'hello =C3=BCberl=C3=A4nge';
+ $this->assertEquals(mail_quotedprintable_encode($in),$out);
+ }
+
+ function test_wrap(){
+ $in = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
+ $out = "123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234=\n56789 123456789";
+ $this->assertEquals(mail_quotedprintable_encode($in,74),$out);
+ }
+
+ function test_nowrap(){
+ $in = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
+ $out = '123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789';
+ $this->assertEquals(mail_quotedprintable_encode($in,0),$out);
+ }
+
+ function test_russian_utf8(){
+ $in = 'Ваш пароль для системы Доку Вики';
+ $out = '=D0=92=D0=B0=D1=88 =D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C =D0=B4=D0=BB=D1=8F =D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B =D0=94=D0=BE=D0=BA=D1=83 =D0=92=D0=B8=D0=BA=D0=B8';
+ $this->assertEquals(mail_quotedprintable_encode($in,0),$out);
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_clean_id.test.php b/_test/tests/inc/pageutils_clean_id.test.php
new file mode 100644
index 000000000..37debfa0a
--- /dev/null
+++ b/_test/tests/inc/pageutils_clean_id.test.php
@@ -0,0 +1,157 @@
+<?php
+require_once DOKU_INC.'inc/utf8.php';
+require_once DOKU_INC.'inc/pageutils.php';
+
+class init_clean_id_test extends DokuWikiTest {
+
+ function teardown() {
+ global $cache_cleanid;
+ $cache_cleanid = array();
+ }
+
+ function test_default(){
+ // we test multiple cases here
+ // format: $id, $ascii, $correct_output
+ $tests = array();
+
+ // set dokuwiki defaults
+ global $conf;
+ $conf['sepchar'] = '_';
+ $conf['deaccent'] = 1;
+
+ $tests[] = array('page',false,'page');
+ $tests[] = array('pa_ge',false,'pa_ge');
+ $tests[] = array('pa%ge',false,'pa_ge');
+ $tests[] = array('pa#ge',false,'pa_ge');
+ $tests[] = array('pàge',false,'page');
+ $tests[] = array('pagĖ',false,'page');
+ $tests[] = array('pa$%^*#ge',false,'pa_ge');
+ $tests[] = array('*page*',false,'page');
+ $tests[] = array('ښ',false,'ښ');
+ $tests[] = array('päge',false,'paege');
+ $tests[] = array('foo bar',false,'foo_bar');
+ $tests[] = array('PÄGÖ',false,'paegoe');
+ $tests[] = array('Faß','false','fass');
+ $tests[] = array('ښ侧化并곦 β',false,'ښ侧化并곦_β');
+ $tests[] = array('page:page',false,'page:page');
+ $tests[] = array('page;page',false,'page:page');
+ $tests[] = array('page:page 1.2',false,'page:page_1.2');
+
+ $tests[] = array('page._#!','false','page');
+ $tests[] = array('._#!page','false','page');
+ $tests[] = array('page._#!page','false','page._page');
+ $tests[] = array('ns._#!:page','false','ns:page');
+ $tests[] = array('ns:._#!page','false','ns:page');
+ $tests[] = array('ns._#!ns:page','false','ns._ns:page');
+ $tests[] = array('ns_:page',false,'ns:page');
+ $tests[] = array('page...page','false','page...page');
+
+ $conf['useslash'] = 0;
+ $tests[] = array('page/page',false,'page_page');
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+
+ $conf['useslash'] = 1;
+ $tests = array();
+ $tests[] = array('page/page',false,'page:page');
+
+ $this->teardown();
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+ }
+
+ function test_sepchar(){
+ // we test multiple cases here
+ // format: $id, $ascii, $correct_output
+ $tests = array();
+
+ global $conf;
+ $conf['sepchar'] = '-';
+ $conf['deaccent'] = 1;
+
+ $tests[] = array('pa-ge',false,'pa-ge');
+ $tests[] = array('pa%ge',false,'pa-ge');
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+ }
+
+ function test_deaccent_keep(){
+ // we test multiple cases here
+ // format: $id, $ascii, $correct_output
+ $tests = array();
+
+ global $conf;
+ $conf['sepchar'] = '_';
+ $conf['deaccent'] = 0;
+
+ $tests[] = array('pàge',false,'pàge');
+ $tests[] = array('pagĖ',false,'pagė');
+ $tests[] = array('pagĒēĔĕĖėĘęĚě',false,'pagēēĕĕėėęęěě');
+ $tests[] = array('ښ',false,'ښ');
+ $tests[] = array('ښ侧化并곦ঝഈβ',false,'ښ侧化并곦ঝഈβ');
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+ }
+
+ function test_deaccent_romanize(){
+ // we test multiple cases here
+ // format: $id, $ascii, $correct_output
+ $tests = array();
+
+ global $conf;
+ $conf['sepchar'] = '_';
+ $conf['deaccent'] = 2;
+
+ $tests[] = array('pàge',false,'page');
+ $tests[] = array('pagĖ',false,'page');
+ $tests[] = array('pagĒēĔĕĖėĘęĚě',false,'pageeeeeeeeee');
+ $tests[] = array('ښ',false,'ښ');
+ $tests[] = array('ښ侧化并곦ঝഈβ',false,'ښ侧化并곦ঝഈβ');
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+ }
+
+ function test_deaccent_ascii(){
+ // we test multiple cases here
+ // format: $id, $ascii, $correct_output
+ $tests = array();
+
+ global $conf;
+ $conf['sepchar'] = '_';
+ $conf['deaccent'] = 0;
+
+ $tests[] = array('pàge',true,'page');
+ $tests[] = array('pagĖ',true,'page');
+ $tests[] = array('pagĒēĔĕĖėĘęĚě',true,'pageeeeeeeeee');
+ $tests[] = array('ښ',true,'');
+ $tests[] = array('ښ侧化并곦ঝഈβ',true,'');
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+
+ $conf['deaccent'] = 1;
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+
+ $conf['deaccent'] = 2;
+
+ foreach($tests as $test){
+ $this->assertEquals(cleanID($test[0],$test[1]),$test[2]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_getid.test.php b/_test/tests/inc/pageutils_getid.test.php
new file mode 100644
index 000000000..608760298
--- /dev/null
+++ b/_test/tests/inc/pageutils_getid.test.php
@@ -0,0 +1,108 @@
+<?php
+require_once DOKU_INC.'inc/utf8.php';
+require_once DOKU_INC.'inc/pageutils.php';
+
+class init_getID_test extends DokuWikiTest {
+
+ /**
+ * fetch media files with basedir and urlrewrite=2
+ *
+ * data provided by Jan Decaluwe <jan@jandecaluwe.com>
+ */
+ function test1(){
+ global $conf;
+ $conf['basedir'] = '//';
+ $conf['userewrite'] = 2;
+ $conf['deaccent'] = 0; // the default (1) gives me strange exceptions
+
+
+ $_SERVER['SCRIPT_FILENAME'] = '/lib/exe/fetch.php';
+ $_SERVER['REQUEST_URI'] = '/lib/exe/fetch.php/myhdl-0.5dev1.tar.gz?id=snapshots&cache=cache';
+
+ $this->assertEquals(getID('media'), 'myhdl-0.5dev1.tar.gz');
+ }
+
+
+ /**
+ * getID with internal mediafile, urlrewrite=2, no basedir set, apache, mod_php
+ */
+ function test2(){
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['userewrite'] = '2';
+ $conf['baseurl'] = '';
+ $conf['useslash'] = '1';
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['HTTP_HOST'] = 'xerxes.my.home';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/lib/exe/detail.php';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/lib/exe/detail.php/wiki/discussion/button-dw.png';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/lib/exe/detail.php/wiki/discussion/button-dw.png?id=test&debug=1';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/lib/exe/detail.php';
+ $_SERVER['PATH_INFO'] = '/wiki/discussion/button-dw.png';
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/wiki/discussion/button-dw.png';
+
+ $this->assertEquals(getID('media',true), 'wiki:discussion:button-dw.png');
+ $this->assertEquals(getID('media',false), 'wiki/discussion/button-dw.png');
+ }
+
+ /**
+ * getID with given id in url and userewrite=2, no basedir set, dokuwiki not in document root.
+ */
+ function test3() {
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['userewrite'] = '2';
+ $conf['baseurl'] = '';
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['SCRIPT_FILENAME'] = '/usr/share/dokuwiki/doku.php';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/doku.php/wiki:dokuwiki';
+ $_SERVER['PATH_INFO'] = '/wiki:dokuwiki';
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/wiki:dokuwiki';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/wiki:dokuwiki';
+
+ $this->assertEquals(getID(), 'wiki:dokuwiki');
+ }
+
+ /**
+ * getID with given id in url and userewrite=2, no basedir set, Apache and CGI.
+ */
+ function test4() {
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['userewrite'] = '2';
+ $conf['baseurl'] = '';
+ $conf['useslash'] = '1';
+
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/vhosts/example.com/htdocs';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/vhosts/example.com/htdocs/doku.php';
+ $_SERVER['SCRIPT_NAME'] = '/doku.php';
+ $_SERVER['REQUEST_URI'] = '/doku.php/wiki/dokuwiki';
+ $_SERVER['PATH_INFO'] = '/wiki/dokuwiki';
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/vhosts/example.com/htdocs/doku.php';
+ $_SERVER['PHP_SELF'] = '/doku.php/wiki/dokuwiki';
+
+ $this->assertEquals(getID(), 'wiki:dokuwiki');
+ }
+
+ /**
+ * getID with given id / in url and userewrite=2, no basedir set, Apache and CGI.
+ */
+ function test5() {
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['userewrite'] = '2';
+ $conf['baseurl'] = '';
+ $_SERVER['DOCUMENT_ROOT'] = '/var/www/';
+ $_SERVER['SCRIPT_FILENAME'] = '/var/www/dokuwiki/doku.php';
+ $_SERVER['SCRIPT_NAME'] = '/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/dokuwiki/doku.php/?do=debug';
+ $_SERVER['PATH_INFO'] = '/';
+ $_SERVER['PATH_TRANSLATED'] = '/var/www/index.html';
+ $_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/';
+
+ $this->assertEquals(getID(), cleanID($conf['start']));
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_resolve_id.test.php b/_test/tests/inc/pageutils_resolve_id.test.php
new file mode 100644
index 000000000..91f8dc696
--- /dev/null
+++ b/_test/tests/inc/pageutils_resolve_id.test.php
@@ -0,0 +1,45 @@
+<?php
+require_once DOKU_INC.'inc/utf8.php';
+require_once DOKU_INC.'inc/pageutils.php';
+
+class init_resolve_id_test extends DokuWikiTest {
+
+
+ function test1(){
+ // we test multiple cases here
+ // format: $ns, $page, $output
+ $tests = array();
+
+ // relative current in root
+ $tests[] = array('','page','page');
+ $tests[] = array('','.page','page');
+ $tests[] = array('','.:page','page');
+
+ // relative current in namespace
+ $tests[] = array('lev1:lev2','page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','.page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','.:page','lev1:lev2:page');
+
+ // relative upper in root
+ $tests[] = array('','..page','page');
+ $tests[] = array('','..:page','page');
+
+ // relative upper in namespace
+ $tests[] = array('lev1:lev2','..page','lev1:page');
+ $tests[] = array('lev1:lev2','..:page','lev1:page');
+ $tests[] = array('lev1:lev2','..:..:page','page');
+ $tests[] = array('lev1:lev2','..:..:..:page','page');
+
+ // strange and broken ones
+ $tests[] = array('lev1:lev2','....:....:page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','..:..:lev3:page','lev3:page');
+ $tests[] = array('lev1:lev2','..:..:lev3:..:page','page');
+ $tests[] = array('lev1:lev2','..:..:lev3:..:page:....:...','page');
+
+ foreach($tests as $test){
+ $this->assertEquals(resolve_id($test[0],$test[1]),$test[2]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/pageutils_resolve_pageid.test.php b/_test/tests/inc/pageutils_resolve_pageid.test.php
new file mode 100644
index 000000000..32e5f841f
--- /dev/null
+++ b/_test/tests/inc/pageutils_resolve_pageid.test.php
@@ -0,0 +1,83 @@
+<?php
+require_once DOKU_INC.'inc/utf8.php';
+require_once DOKU_INC.'inc/pageutils.php';
+
+global $conf;
+if (!isset($conf['datadir'])) $conf['datadir'] = $conf['savedir'].'/pages';
+
+class init_resolve_pageid_test extends DokuWikiTest {
+
+
+ function test1(){
+ global $conf;
+
+ // we test multiple cases here
+ // format: $ns, $page, $output
+ $tests = array();
+
+ // relative current in root
+ $tests[] = array('','page','page');
+ $tests[] = array('','.page','page');
+ $tests[] = array('','.:page','page');
+
+ // relative current in namespace
+ $tests[] = array('lev1:lev2','page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','.page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','.:page','lev1:lev2:page');
+
+ // relative upper in root
+ $tests[] = array('','..page','page');
+ $tests[] = array('','..:page','page');
+
+ // relative upper in namespace
+ $tests[] = array('lev1:lev2','..page','lev1:page');
+ $tests[] = array('lev1:lev2','..:page','lev1:page');
+ $tests[] = array('lev1:lev2','..:..:page','page');
+ $tests[] = array('lev1:lev2','..:..:..:page','page');
+
+ // strange and broken ones
+ $tests[] = array('lev1:lev2','....:....:page','lev1:lev2:page');
+ $tests[] = array('lev1:lev2','..:..:lev3:page','lev3:page');
+ $tests[] = array('lev1:lev2','..:..:lev3:..:page','page');
+ $tests[] = array('lev1:lev2','..:..:lev3:..:page:....:...','page');
+
+ // now some tests with existing and none existing files
+ $conf['start'] = 'start';
+
+ $tests[] = array('','.:','start');
+ $tests[] = array('foo','.:','foo:start');
+ $tests[] = array('','foo:','foo:start');
+ $tests[] = array('foo','foo:','foo:start');
+
+ // empty $page
+ global $ID;
+ $ID = 'my:space';
+ $tests[] = array('my', '', 'my:space');
+
+ foreach($tests as $test){
+ $page = $test[1];
+ resolve_pageid($test[0],$page,$foo);
+
+ $this->assertEquals($page,$test[2]);
+ }
+ }
+
+ /**
+ * Empty page on homepage should resolve to start page
+ */
+ function test_resolve_pageid_empty_homepage() {
+ global $ID;
+ $ID = '';
+ global $conf;
+ $conf['start'] = 'someverystrangestartname';
+
+ $ns = '';
+ $page = '';
+ $exist = true;
+
+ resolve_pageid($ns, $page, $exist);
+ $this->assertEquals($page, $conf['start']);
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/parser/lexer.test.php b/_test/tests/inc/parser/lexer.test.php
new file mode 100644
index 000000000..9b914fbd4
--- /dev/null
+++ b/_test/tests/inc/parser/lexer.test.php
@@ -0,0 +1,531 @@
+<?php
+/**
+* @version $Id: lexer.todo.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
+* @package Doku
+* @subpackage Tests
+*/
+
+/**
+* Includes
+*/
+require_once DOKU_INC . 'inc/parser/lexer.php';
+
+/**
+* @package Doku
+* @subpackage Tests
+*/
+class TestOfLexerParallelRegex extends DokuWikiTest {
+
+ function testNoPatterns() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $this->assertFalse($regex->match("Hello", $match));
+ $this->assertEquals($match, "");
+ }
+ function testNoSubject() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("", $match));
+ $this->assertEquals($match, "");
+ }
+ function testMatchAll() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern(".*");
+ $this->assertTrue($regex->match("Hello", $match));
+ $this->assertEquals($match, "Hello");
+ }
+ function testCaseSensitive() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "abc");
+ }
+ function testCaseInsensitive() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern("abc");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ }
+ function testMatchMultiple() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $regex->addPattern("ABC");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ $this->assertFalse($regex->match("Hello", $match));
+ }
+ function testPatternLabels() {
+ $regex = new Doku_LexerParallelRegex(false);
+ $regex->addPattern("abc", "letter");
+ $regex->addPattern("123", "number");
+ $this->assertEquals($regex->match("abcdef", $match), "letter");
+ $this->assertEquals($match, "abc");
+ $this->assertEquals($regex->match("0123456789", $match), "number");
+ $this->assertEquals($match, "123");
+ }
+ function testMatchMultipleWithLookaheadNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("abc");
+ $regex->addPattern("ABC");
+ $regex->addPattern("a(?!\n).{1}");
+ $this->assertTrue($regex->match("abcdef", $match));
+ $this->assertEquals($match, "abc");
+ $this->assertTrue($regex->match("AAABCabcdef", $match));
+ $this->assertEquals($match, "ABC");
+ $this->assertTrue($regex->match("a\nab", $match));
+ $this->assertEquals($match, "ab");
+ $this->assertFalse($regex->match("Hello", $match));
+ }
+ function testMatchSetOptionCaseless() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("a(?i)b(?i)c");
+ $this->assertTrue($regex->match("aBc", $match));
+ $this->assertEquals($match, "aBc");
+ }
+ function testMatchSetOptionUngreedy() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?U)\w+");
+ $this->assertTrue($regex->match("aaaaaa", $match));
+ $this->assertEquals($match, "a");
+ }
+ function testMatchLookaheadEqual() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("\w(?=c)");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "y");
+ }
+ function testMatchLookaheadNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("\w(?!b|c)");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "b");
+ }
+ function testMatchLookbehindEqual() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?<=c)\w");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "z");
+ }
+ function testMatchLookbehindNot() {
+ $regex = new Doku_LexerParallelRegex(true);
+ $regex->addPattern("(?<!\A|x|b)\w");
+ $this->assertTrue($regex->match("xbyczd", $match));
+ $this->assertEquals($match, "c");
+ }
+}
+
+
+class TestOfLexerStateStack extends DokuWikiTest {
+ function testStartState() {
+ $stack = new Doku_LexerStateStack("one");
+ $this->assertEquals($stack->getCurrent(), "one");
+ }
+ function testExhaustion() {
+ $stack = new Doku_LexerStateStack("one");
+ $this->assertFalse($stack->leave());
+ }
+ function testStateMoves() {
+ $stack = new Doku_LexerStateStack("one");
+ $stack->enter("two");
+ $this->assertEquals($stack->getCurrent(), "two");
+ $stack->enter("three");
+ $this->assertEquals($stack->getCurrent(), "three");
+ $this->assertTrue($stack->leave());
+ $this->assertEquals($stack->getCurrent(), "two");
+ $stack->enter("third");
+ $this->assertEquals($stack->getCurrent(), "third");
+ $this->assertTrue($stack->leave());
+ $this->assertTrue($stack->leave());
+ $this->assertEquals($stack->getCurrent(), "one");
+ }
+}
+
+class TestParser {
+ function TestParser() {
+ }
+ function accept() {
+ }
+ function a() {
+ }
+ function b() {
+ }
+}
+
+class TestOfLexer extends DokuWikiTest {
+ function testNoPatterns() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->never())->method('accept');
+ $lexer = new Doku_Lexer($handler);
+ $this->assertFalse($lexer->parse("abcdef"));
+ }
+ function testEmptyPage() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->never())->method('accept');
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse(""));
+ }
+ function testSinglePattern() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('accept')
+ ->with("aaa", DOKU_LEXER_MATCHED, 0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('accept')
+ ->with("x", DOKU_LEXER_UNMATCHED, 3)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('accept')
+ ->with("a", DOKU_LEXER_MATCHED, 4)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('accept')
+ ->with("yyy", DOKU_LEXER_UNMATCHED, 5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('accept')
+ ->with("a", DOKU_LEXER_MATCHED, 8)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('accept')
+ ->with("x", DOKU_LEXER_UNMATCHED, 9)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('accept')
+ ->with("aaa", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('accept')
+ ->with("z", DOKU_LEXER_UNMATCHED, 13)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
+ }
+ function testMultiplePattern() {
+ $handler = $this->getMock('TestParser', array('accept'));
+ $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");
+ $positions = array(0, 1, 2, 3, 5, 6, 7, 8, 14, 15);
+ for ($i = 0; $i < count($target); $i++) {
+ $handler->expects($this->at($i))->method('accept')
+ ->with($target[$i], $this->anything(), $positions[$i])->will($this->returnValue(true));
+ }
+ $lexer = new Doku_Lexer($handler);
+ $lexer->addPattern("a+");
+ $lexer->addPattern("b+");
+ $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
+ }
+}
+
+class TestOfLexerModes extends DokuWikiTest {
+ function testIsolatedPattern() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("bxb", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("aaa", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with("x", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('a')
+ ->with("aaaa", DOKU_LEXER_MATCHED,11)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('a')
+ ->with("x", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true));
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
+ }
+ function testModeChange() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("aaa", DOKU_LEXER_MATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('b')
+ ->with(":", DOKU_LEXER_ENTER,8)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('b')
+ ->with("b", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true));
+ $handler->expects($this->at(8))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,11)->will($this->returnValue(true));
+ $handler->expects($this->at(9))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,12)->will($this->returnValue(true));
+ $handler->expects($this->at(10))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,14)->will($this->returnValue(true));
+ $handler->expects($this->at(11))->method('b')
+ ->with("bbb", DOKU_LEXER_MATCHED,15)->will($this->returnValue(true));
+ $handler->expects($this->at(12))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,18)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern(":", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));
+ }
+ function testNesting() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('b')
+ ->with("(", DOKU_LEXER_ENTER,6)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('b')
+ ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+ $handler->expects($this->at(7))->method('b')
+ ->with("bb", DOKU_LEXER_MATCHED,10)->will($this->returnValue(true));
+ $handler->expects($this->at(8))->method('b')
+ ->with(")", DOKU_LEXER_EXIT,12)->will($this->returnValue(true));
+ $handler->expects($this->at(9))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,13)->will($this->returnValue(true));
+ $handler->expects($this->at(10))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true));
+
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addEntryPattern("(", "a", "b");
+ $lexer->addPattern("b+", "b");
+ $lexer->addExitPattern(")", "b");
+ $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));
+ }
+ function testSingular() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('b')
+ ->with("b", DOKU_LEXER_SPECIAL,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("xx", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('b')
+ ->with("bbb", DOKU_LEXER_SPECIAL,7)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with("xx", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true));
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addSpecialPattern("b+", "a", "b");
+ $this->assertTrue($lexer->parse("aabaaxxbbbxx"));
+ }
+ function testUnwindTooFar() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with(")", DOKU_LEXER_EXIT,2)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "a");
+ $lexer->addPattern("a+", "a");
+ $lexer->addExitPattern(")", "a");
+ $this->assertFalse($lexer->parse("aa)aa"));
+ }
+}
+
+class TestOfLexerHandlers extends DokuWikiTest {
+ function testModeMapping() {
+ $handler = $this->getMock('TestParser');
+ $handler->expects($this->at(0))->method('a')
+ ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('a')
+ ->with("(", DOKU_LEXER_ENTER,2)->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('a')
+ ->with("bb", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('a')
+ ->with("a", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('a')
+ ->with("bb", DOKU_LEXER_MATCHED,6)->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('a')
+ ->with(")", DOKU_LEXER_EXIT,8)->will($this->returnValue(true));
+ $handler->expects($this->at(6))->method('a')
+ ->with("b", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "mode_a");
+ $lexer->addPattern("a+", "mode_a");
+ $lexer->addEntryPattern("(", "mode_a", "mode_b");
+ $lexer->addPattern("b+", "mode_b");
+ $lexer->addExitPattern(")", "mode_b");
+ $lexer->mapHandler("mode_a", "a");
+ $lexer->mapHandler("mode_b", "a");
+ $this->assertTrue($lexer->parse("aa(bbabb)b"));
+ }
+}
+
+class TestParserByteIndex {
+
+ function TestParserByteIndex() {}
+
+ function ignore() {}
+
+ function caught() {}
+}
+
+class TestOfLexerByteIndices extends DokuWikiTest {
+
+ function testIndex() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern("<file>", "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookaheadEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>(?=.*</file>)', "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookaheadNotEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>(?!foo)', "ignore", "caught");
+ $lexer->addExitPattern("</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookbehindEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addEntryPattern('<file>', "ignore", "caught");
+ $lexer->addExitPattern("(?<=d)</file>", "caught");
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ function testIndexLookbehindNotEqual() {
+ $doc = "aaa<file>bcd</file>eee";
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+ $handler->expects($this->at(1))->method('caught')
+ ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true));
+ $handler->expects($this->at(2))->method('caught')
+ ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true));
+ $handler->expects($this->at(3))->method('caught')
+ ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true));
+ $handler->expects($this->at(4))->method('caught')
+ ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true));
+ $handler->expects($this->at(5))->method('caught')
+ ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, 'ignore');
+ $lexer->addEntryPattern('<file>', 'ignore', 'caught');
+ $lexer->addExitPattern('(?<!c)</file>', 'caught');
+ $lexer->addSpecialPattern('b','caught','special');
+ $lexer->mapHandler('special','caught');
+ $lexer->addPattern('c','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+ /**
+ * This test is primarily to ensure the correct match is chosen
+ * when there are non-captured elements in the pattern.
+ */
+ function testIndexSelectCorrectMatch() {
+ $doc = "ALL FOOLS ARE FOO";
+ $pattern = '\bFOO\b';
+
+ $handler = $this->getMock('TestParserByteIndex');
+ $handler->expects($this->any())->method('ignore')->will($this->returnValue(true));
+
+ $matches = array();
+ preg_match('/'.$pattern.'/',$doc,$matches,PREG_OFFSET_CAPTURE);
+
+ $handler->expects($this->once())->method('caught')
+ ->with("FOO", DOKU_LEXER_SPECIAL, $matches[0][1])->will($this->returnValue(true));
+
+ $lexer = new Doku_Lexer($handler, "ignore");
+ $lexer->addSpecialPattern($pattern,'ignore','caught');
+
+ $this->assertTrue($lexer->parse($doc));
+ }
+
+}
+
+?>
diff --git a/_test/tests/inc/parser/parser.inc.php b/_test/tests/inc/parser/parser.inc.php
new file mode 100644
index 000000000..06c314ac6
--- /dev/null
+++ b/_test/tests/inc/parser/parser.inc.php
@@ -0,0 +1,45 @@
+<?php
+/**
+* @version $Id: parser.inc.php,v 1.2 2005/03/25 21:00:22 harryf Exp $
+* @package Doku
+* @subpackage Tests
+*/
+
+/**
+* Includes
+*/
+require_once DOKU_INC . 'inc/init.php';
+require_once DOKU_INC . 'inc/confutils.php';
+require_once DOKU_INC . 'inc/parser/parser.php';
+require_once DOKU_INC . 'inc/parser/handler.php';
+require_once DOKU_INC . 'inc/events.php';
+require_once DOKU_INC . 'inc/mail.php';
+
+/**
+* @package Doku
+* @subpackage Tests
+*/
+abstract class TestOfDoku_Parser extends PHPUnit_Framework_TestCase {
+
+ var $P;
+ var $H;
+
+ function setup() {
+ $this->P = new Doku_Parser();
+ $this->H = new Doku_Handler();
+ $this->P->Handler = & $this->H;
+ }
+
+ function tearDown() {
+ unset($this->P);
+ unset($this->H);
+ }
+}
+
+function stripByteIndex($call) {
+ unset($call[2]);
+ if ($call[0] == "nest") {
+ $call[1][0] = array_map('stripByteIndex',$call[1][0]);
+ }
+ return $call;
+}
diff --git a/_test/tests/inc/parser/parser_eol.test.php b/_test/tests/inc/parser/parser_eol.test.php
new file mode 100644
index 000000000..03569bb62
--- /dev/null
+++ b/_test/tests/inc/parser/parser_eol.test.php
@@ -0,0 +1,96 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
+
+ function testEol() {
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo\nBar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testEolMultiple() {
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo\n\nbar\nFoo");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("Foo")),
+ array('p_close',array()),
+ array('p_open',array()),
+ array('cdata',array("bar".DOKU_PARSER_EOL."Foo")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testWinEol() {
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo\r\nBar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testLinebreak() {
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->parse('Foo\\\\ Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo")),
+ array('linebreak',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testLinebreakPlusEol() {
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse('Foo\\\\'."\n\n".'Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("Foo")),
+ array('linebreak',array()),
+ array('p_close',array()),
+ array('p_open',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testLinebreakInvalid() {
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->parse('Foo\\\\Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo\\\\Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/parser/parser_footnote.test.php b/_test/tests/inc/parser/parser_footnote.test.php
new file mode 100644
index 000000000..f3b5ddf56
--- /dev/null
+++ b/_test/tests/inc/parser/parser_footnote.test.php
@@ -0,0 +1,388 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
+
+ function setup() {
+ parent::setup();
+ $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ }
+
+ function testFootnote() {
+ $this->P->parse('Foo (( testing )) Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' testing ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testNotAFootnote() {
+ $this->P->parse("Foo (( testing\n Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo (( testing\n Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteLinefeed() {
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo (( testing\ntesting )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array('Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(" testing\ntesting ")),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteNested() {
+ $this->P->parse('Foo (( x((y))z )) Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' x((y')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array('z )) Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteEol() {
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo \nX(( test\ning ))Y\n Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array('Foo '.DOKU_PARSER_EOL.'X')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(" test\ning ")),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array('Y'.DOKU_PARSER_EOL.' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteStrong() {
+ $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->parse('Foo (( **testing** )) Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('strong_open',array()),
+ array('cdata',array('testing')),
+ array('strong_close',array()),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteHr() {
+ $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->parse("Foo (( \n ---- \n )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('hr',array()),
+ array('cdata',array("\n ")),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteCode() {
+ $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->parse("Foo (( <code>Test</code> )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('code',array('Test',null,null)),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnotePreformatted() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->parse("Foo (( \n Test\n )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('preformatted',array('Test')),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnotePreformattedEol() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("Foo (( \n Test\n )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array('Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('preformatted',array('Test')),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteUnformatted() {
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse("Foo (( <nowiki>Test</nowiki> )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' ')),
+ array('unformatted',array('Test')),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteNotHeader() {
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse("Foo (( \n====Test====\n )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(" \n====Test====\n ")),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteTable() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse("Foo ((
+| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+ )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('table_open',array(3, 2, 8)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(123)),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteList() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse("Foo ((
+ *A
+ * B
+ * C
+ )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteQuote() {
+ $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->parse("Foo ((
+> def
+>>ghi
+ )) Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('quote_open',array()),
+ array('cdata',array(" def")),
+ array('quote_open',array()),
+ array('cdata',array("ghi")),
+ array('quote_close',array()),
+ array('quote_close',array()),
+ array('cdata',array(' ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testFootnoteNesting() {
+ $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->parse("(( a ** (( b )) ** c ))");
+
+ $calls = array(
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n")),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array(' a ')),
+ array('strong_open',array()),
+ array('cdata',array(' (( b ')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(" ")),
+ array('strong_close',array()),
+ array('cdata',array(" c ))")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_headers.test.php b/_test/tests/inc/parser/parser_headers.test.php
new file mode 100644
index 000000000..d7e5f0e42
--- /dev/null
+++ b/_test/tests/inc/parser/parser_headers.test.php
@@ -0,0 +1,282 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
+
+ function testHeader1() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ====== Header ====== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',1,6)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader2() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ===== Header ===== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',2,6)),
+ array('section_open',array(2)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader3() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ==== Header ==== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',3,6)),
+ array('section_open',array(3)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader4() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n === Header === \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',4,6)),
+ array('section_open',array(4)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader5() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n == Header == \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',5,6)),
+ array('section_open',array(5)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader2UnevenSmaller() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ===== Header == \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',2,6)),
+ array('section_open',array(2)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader2UnevenBigger() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ===== Header =========== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',2,6)),
+ array('section_open',array(2)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeaderLarge() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ======= Header ======= \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',1,6)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeaderSmall() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n= Header =\n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc \n= Header =\n def")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+
+ function testHeader1Mixed() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n====== == Header == ======\n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('== Header ==',1,6)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeader5Mixed() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n== ====== Header ====== ==\n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('====== Header ======',5,6)),
+ array('section_open',array(5)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testHeaderMultiline() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n== ====== Header\n ====== ==\n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc \n== ====== Header")),
+ array('p_close',array()),
+ array('header',array('',1,23)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+# function testNoToc() {
+# $this->P->addMode('notoc',new Doku_Parser_Mode_NoToc());
+# $this->P->parse('abc ~~NOTOC~~ def');
+# $this->assertFalse($this->H->meta['toc']);
+# }
+
+ function testHeader1Eol() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("abc \n ====== Header ====== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array('abc ')),
+ array('p_close',array()),
+ array('header',array('Header',1, 6)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array(' def')),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+
+ }
+
+ function testHeaderMulti2() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("abc \n ====== Header ====== \n def abc \n ===== Header2 ===== \n def");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc ")),
+ array('p_close',array()),
+ array('header',array('Header',1,6)),
+ array('section_open',array(1)),
+ array('p_open',array()),
+ array('cdata',array("\n def abc ")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('header',array('Header2',2,39)),
+ array('section_open',array(2)),
+ array('p_open',array()),
+ array('cdata',array("\n def")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array())
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/parser/parser_i18n.test.php b/_test/tests/inc/parser/parser_i18n.test.php
new file mode 100644
index 000000000..096f2e227
--- /dev/null
+++ b/_test/tests/inc/parser/parser_i18n.test.php
@@ -0,0 +1,162 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
+
+ function testFormatting() {
+ $formats = array (
+ 'strong', 'emphasis', 'underline', 'monospace',
+ 'subscript', 'superscript', 'deleted',
+ );
+ foreach ( $formats as $format ) {
+ $this->P->addMode($format,new Doku_Parser_Mode_Formatting($format));
+ }
+ $this->P->parse("I**ñ**t__ë__r//n//â<sup>t</sup>i<sub>ô</sub>n''à''liz<del>æ</del>tiøn");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nI")),
+ array('strong_open',array()),
+ array('cdata',array('ñ')),
+ array('strong_close',array()),
+ array('cdata',array('t')),
+ array('underline_open',array()),
+ array('cdata',array('ë')),
+ array('underline_close',array()),
+ array('cdata',array('r')),
+ array('emphasis_open',array()),
+ array('cdata',array('n')),
+ array('emphasis_close',array()),
+ array('cdata',array('â')),
+ array('superscript_open',array()),
+ array('cdata',array('t')),
+ array('superscript_close',array()),
+ array('cdata',array('i')),
+ array('subscript_open',array()),
+ array('cdata',array('ô')),
+ array('subscript_close',array()),
+ array('cdata',array('n')),
+ array('monospace_open',array()),
+ array('cdata',array('à')),
+ array('monospace_close',array()),
+ array('cdata',array('liz')),
+ array('deleted_open',array()),
+ array('cdata',array('æ')),
+ array('deleted_close',array()),
+ array('cdata',array("tiøn")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testHeader() {
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->parse("Foo\n ==== Iñtërnâtiônàlizætiøn ==== \n Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo")),
+ array('p_close',array()),
+ array('header',array('Iñtërnâtiônàlizætiøn',3,5)),
+ array('section_open',array(3)),
+ array('p_open',array()),
+ array('cdata',array("\n Bar")),
+ array('p_close',array()),
+ array('section_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testTable() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+| Row 0 Col 1 | Iñtërnâtiônàlizætiøn | Row 0 Col 3 |
+| Row 1 Col 1 | Iñtërnâtiônàlizætiøn | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Iñtërnâtiônàlizætiøn ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Iñtërnâtiônàlizætiøn ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(153)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testAcronym() {
+ $t = array('Iñtërnâtiônàlizætiøn');
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym($t));
+ $this->P->parse("Foo Iñtërnâtiônàlizætiøn Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo ")),
+ array('acronym',array('Iñtërnâtiônàlizætiøn')),
+ array('cdata',array(" Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testInterwiki() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[wp>Iñtërnâtiônàlizætiøn|Iñtërnâtiônàlizætiøn]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('interwikilink',array('wp>Iñtërnâtiônàlizætiøn','Iñtërnâtiônàlizætiøn','wp','Iñtërnâtiônàlizætiøn')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[x:Iñtërnâtiônàlizætiøn:y:foo_bar:z|Iñtërnâtiônàlizætiøn]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('x:Iñtërnâtiônàlizætiøn:y:foo_bar:z','Iñtërnâtiônàlizætiøn')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_links.test.php b/_test/tests/inc/parser/parser_links.test.php
new file mode 100644
index 000000000..529efac6e
--- /dev/null
+++ b/_test/tests/inc/parser/parser_links.test.php
@@ -0,0 +1,691 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
+
+ function testExternalLinkSimple() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo http://www.google.com Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://www.google.com', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalLinkCase() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo HTTP://WWW.GOOGLE.COM Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('HTTP://WWW.GOOGLE.COM', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalIPv4() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo http://123.123.3.21/foo Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://123.123.3.21/foo', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalIPv6() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo http://[3ffe:2a00:100:7031::1]/foo Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://[3ffe:2a00:100:7031::1]/foo', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalMulti(){
+ $this->teardown();
+
+ $links = array(
+ 'http://www.google.com',
+ 'HTTP://WWW.GOOGLE.COM',
+ 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html',
+ 'http://[1080:0:0:0:8:800:200C:417A]/index.html',
+ 'http://[3ffe:2a00:100:7031::1]',
+ 'http://[1080::8:800:200C:417A]/foo',
+ 'http://[::192.9.5.5]/ipng',
+ 'http://[::FFFF:129.144.52.38]:80/index.html',
+ 'http://[2010:836B:4179::836B:4179]',
+ );
+ $titles = array(false,null,'foo bar');
+ foreach($links as $link){
+ foreach($titles as $title){
+ if($title === false){
+ $source = $link;
+ $name = null;
+ }elseif($title === null){
+ $source = "[[$link]]";
+ $name = null;
+ }else{
+ $source = "[[$link|$title]]";
+ $name = $title;
+ }
+ $this->setup();
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo $source Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array($link, $name)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls), $calls, $source);
+ $this->teardown();
+ }
+ }
+
+ $this->setup();
+ }
+
+ function testExternalLinkJavascript() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo javascript:alert('XSS'); Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo javascript:alert('XSS'); Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalWWWLink() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo www.google.com Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://www.google.com', 'www.google.com')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalFTPLink() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo ftp.sunsite.com Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('ftp://ftp.sunsite.com', 'ftp.sunsite.com')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+ function testEmail() {
+ $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->parse("Foo <bugs@php.net> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('emaillink',array('bugs@php.net', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testEmailRFC2822() {
+ $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->parse("Foo <~fix+bug's.for/ev{e}r@php.net> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('emaillink',array("~fix+bug's.for/ev{e}r@php.net", NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testEmailCase() {
+ $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
+ $this->P->parse("Foo <bugs@pHp.net> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('emaillink',array('bugs@pHp.net', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+
+ function testInternalLinkOneChar() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[l]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('l',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLinkNoChar() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLinkNamespaceNoTitle() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[foo:bar]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('foo:bar',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLinkNamespace() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('x:1:y:foo_bar:z','Test')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLinkSectionRef() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('wiki:syntax#internal','Syntax')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalInInternalLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[http://www.google.com|Google]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://www.google.com','Google')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInterwikiLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[iw>somepage|Some Page]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('interwikilink',array('iw>somepage','Some Page','iw','somepage')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInterwikiLinkCase() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[IW>somepage|Some Page]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('interwikilink',array('IW>somepage','Some Page','iw','somepage')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInterwikiPedia() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testCamelCase() {
+ $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink());
+ $this->P->parse("Foo FooBar Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('camelcaselink',array('FooBar')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testFileLink() {
+ $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink());
+ $this->P->parse('Foo file://temp/file.txt Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('filelink',array('file://temp/file.txt ',NULL)),
+ array('cdata',array('Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testFileLinkInternal() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('file://temp/file.txt','Some File')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testWindowsShareLink() {
+ $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
+ $this->P->parse('Foo \\\server\share Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('windowssharelink',array('\\\server\share',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testWindowsShareLinkHyphen() {
+ $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
+ $this->P->parse('Foo \\\server\share-hyphen Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('windowssharelink',array('\\\server\share-hyphen',NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testWindowsShareLinkInternal() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse('Foo [[\\\server\share|My Documents]] Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('windowssharelink',array('\\\server\share','My Documents')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternal() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalLinkOnly() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif?linkonly}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','linkonly')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaNotImage() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('foo.txt','Some File',null,10,10,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalLAlign() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif }} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalRAlign() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{ img.gif}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalCenter() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{ img.gif }} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalParams() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif?50x100nocache}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif',NULL,NULL,'50','100','nocache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInternalTitle() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',array('img.gif','Some Image',NULL,'50','100','cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaExternal() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{http://www.google.com/img.gif}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,'cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaExternalParams() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100','nocache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaExternalTitle() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externalmedia',
+ array('http://www.google.com/img.gif','Some Image',NULL,'50','100','cache','details')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInInternalLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar");
+
+ $image = array(
+ 'type'=>'internalmedia',
+ 'src'=>'img.gif',
+ 'title'=>'Some Image',
+ 'align'=>NULL,
+ 'width'=>10,
+ 'height'=>20,
+ 'cache'=>'nocache',
+ 'linking'=>'details',
+ );
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('x:1:y:foo_bar:z',$image)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaNoImageInInternalLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar");
+
+ $image = array(
+ 'type'=>'internalmedia',
+ 'src'=>'foo.txt',
+ 'title'=>'Some Image',
+ 'align'=>NULL,
+ 'width'=>10,
+ 'height'=>20,
+ 'cache'=>'nocache',
+ 'linking'=>'details',
+ );
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('x:1:y:foo_bar:z',$image)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testMediaInEmailLink() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar");
+
+ $image = array(
+ 'type'=>'internalmedia',
+ 'src'=>'img.gif',
+ 'title'=>'Some Image',
+ 'align'=>NULL,
+ 'width'=>10,
+ 'height'=>20,
+ 'cache'=>'nocache',
+ 'linking'=>'details',
+ );
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('emaillink',array('foo@example.com',$image)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testNestedMedia() {
+ $this->P->addMode('media',new Doku_Parser_Mode_Media());
+ $this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internalmedia',
+ array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,'cache','details')),
+ array('cdata',array('}}}} Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/parser/parser_lists.test.php b/_test/tests/inc/parser/parser_lists.test.php
new file mode 100644
index 000000000..e4ef1f83e
--- /dev/null
+++ b/_test/tests/inc/parser/parser_lists.test.php
@@ -0,0 +1,393 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
+
+ function testUnorderedList() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse('
+ *A
+ * B
+ * C
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testOrderedList() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse('
+ -A
+ - B
+ - C
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+
+ function testMixedList() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse('
+ -A
+ * B
+ - C
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testUnorderedListWinEOL() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse("\r\n *A\r\n * B\r\n * C\r\n");
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testOrderedListWinEOL() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse("\r\n -A\r\n - B\r\n - C\r\n");
+ $calls = array (
+ array('document_start',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testNotAList() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse("Foo -bar *foo Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nFoo -bar *foo Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testUnorderedListParagraph() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse('Foo
+ *A
+ * B
+ * C
+Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("Foo")),
+ array('p_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('p_open',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // This is really a failing test - formatting able to spread across list items
+ // Problem is fixing it would mean a major rewrite of lists
+ function testUnorderedListStrong() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->parse('
+ ***A**
+ *** B
+ * C**
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('strong_open',array()),
+ array('cdata',array("A")),
+ array('strong_close',array()),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('strong_open',array()),
+ array('cdata',array(" B\n * C")),
+ array('strong_close',array()),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // This is really a failing test - unformatted able to spread across list items
+ // Problem is fixing it would mean a major rewrite of lists
+ function testUnorderedListUnformatted() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse('
+ *%%A%%
+ *%% B
+ * C%%
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('unformatted',array("A")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('unformatted',array(" B\n * C")),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testUnorderedListLinebreak() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->parse('
+ *A\\\\ D
+ * B
+ * C
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('linebreak',array()),
+ array('cdata',array("D")),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' C')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testUnorderedListLinebreak2() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->parse('
+ *A\\\\
+ * B
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array("A")),
+ array('linebreak',array()),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(' B')),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testUnorderedListFootnote() {
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ $this->P->parse('
+ *((A))
+ *(( B
+ * C ))
+
+');
+ $calls = array (
+ array('document_start',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('nest', array( array(
+ array('footnote_open',array()),
+ array('cdata',array("A")),
+ array('footnote_close',array())
+ ))),
+ array('listcontent_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(2)),
+ array('listcontent_open',array()),
+ array('nest', array( array(
+ array('footnote_open',array()),
+ array('cdata',array(" B")),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(" C )) ")),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('cdata',array("\n\n")),
+ array('footnote_close',array())
+ ))),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('document_end',array())
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_preformatted.test.php b/_test/tests/inc/parser/parser_preformatted.test.php
new file mode 100644
index 000000000..f7a01a7e5
--- /dev/null
+++ b/_test/tests/inc/parser/parser_preformatted.test.php
@@ -0,0 +1,231 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
+
+ function testFile() {
+ $this->P->addMode('file',new Doku_Parser_Mode_File());
+ $this->P->parse('Foo <file>testing</file> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('file',array('testing',null,null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCode() {
+ $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->parse('Foo <code>testing</code> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('testing', null, null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCodeWhitespace() {
+ $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->parse("Foo <code \n>testing</code> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('testing', null, null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCodeLang() {
+ $this->P->addMode('code',new Doku_Parser_Mode_Code());
+ $this->P->parse("Foo <code php>testing</code> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('code',array('testing', 'php', null)),
+ array('p_open',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPreformatted() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->parse("F oo\n x \n y \nBar\n");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nF oo")),
+ array('p_close',array()),
+ array('preformatted',array("x \n y ")),
+ array('p_open',array()),
+ array('cdata',array('Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPreformattedWinEOL() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->parse("F oo\r\n x \r\n y \r\nBar\r\n");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nF oo")),
+ array('p_close',array()),
+ array('preformatted',array("x \n y ")),
+ array('p_open',array()),
+ array('cdata',array('Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPreformattedTab() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->parse("F oo\n\tx\t\n\t\ty\t\nBar\n");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nF oo")),
+ array('p_close',array()),
+ array('preformatted',array("x\t\n\ty\t")),
+ array('p_open',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPreformattedTabWinEOL() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->parse("F oo\r\n\tx\t\r\n\t\ty\t\r\nBar\r\n");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nF oo")),
+ array('p_close',array()),
+ array('preformatted',array("x\t\n\ty\t")),
+ array('p_open',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPreformattedList() {
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
+ $this->P->parse(" - x \n * y \nF oo\n x \n y \n -X\n *Y\nBar\n");
+ $calls = array (
+ array('document_start',array()),
+ array('listo_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(" x ")),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listo_close',array()),
+ array('listu_open',array()),
+ array('listitem_open',array(1)),
+ array('listcontent_open',array()),
+ array('cdata',array(" y ")),
+ array('listcontent_close',array()),
+ array('listitem_close',array()),
+ array('listu_close',array()),
+ array('p_open',array()),
+ array('cdata',array("F oo")),
+ array('p_close',array()),
+ array('preformatted',array("x \n y \n-X\n*Y")),
+ array('p_open',array()),
+ array('cdata',array("Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // test for php
+ function testPHP() {
+
+ $this->P->addMode('php',new Doku_Parser_Mode_PHP());
+ $this->P->parse('Foo <php>testing</php> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('php',array('testing')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // test with for HTML
+ function testHTML() {
+
+ $this->P->addMode('html',new Doku_Parser_Mode_HTML());
+ $this->P->parse('Foo <html>testing</html> Bar');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('html',array('testing')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+
+
+ function testPreformattedPlusHeaderAndEol() {
+ // Note that EOL must come after preformatted!
+ $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted());
+ $this->P->addMode('header',new Doku_Parser_Mode_Header());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("F oo\n ==Test==\n y \nBar\n");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("F oo")),
+ array('p_close',array()),
+ array('preformatted',array("==Test==\n y ")),
+ array('p_open',array()),
+ array('cdata',array('Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_quote.test.php b/_test/tests/inc/parser/parser_quote.test.php
new file mode 100644
index 000000000..4d77f2a39
--- /dev/null
+++ b/_test/tests/inc/parser/parser_quote.test.php
@@ -0,0 +1,94 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
+
+ function testQuote() {
+ $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->parse("abc\n> def\n>>ghi\nklm");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc")),
+ array('p_close',array()),
+ array('quote_open',array()),
+ array('cdata',array(" def")),
+ array('quote_open',array()),
+ array('cdata',array("ghi")),
+ array('quote_close',array()),
+ array('quote_close',array()),
+ array('p_open',array()),
+ array('cdata',array("klm")),
+ array('p_close',array()),
+ array('document_end',array()),
+
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testQuoteWinCr() {
+ $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->parse("abc\r\n> def\r\n>>ghi\r\nklm");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc")),
+ array('p_close',array()),
+ array('quote_open',array()),
+ array('cdata',array(" def")),
+ array('quote_open',array()),
+ array('cdata',array("ghi")),
+ array('quote_close',array()),
+ array('quote_close',array()),
+ array('p_open',array()),
+ array('cdata',array("klm")),
+ array('p_close',array()),
+ array('document_end',array()),
+
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testQuoteMinumumContext() {
+ $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->parse("\n> def\n>>ghi\n ");
+ $calls = array (
+ array('document_start',array()),
+ array('quote_open',array()),
+ array('cdata',array(" def")),
+ array('quote_open',array()),
+ array('cdata',array("ghi")),
+ array('quote_close',array()),
+ array('quote_close',array()),
+ array('document_end',array()),
+
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testQuoteEol() {
+ $this->P->addMode('quote',new Doku_Parser_Mode_Quote());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse("abc\n> def\n>>ghi\nklm");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("abc")),
+ array('p_close',array()),
+ array('quote_open',array()),
+ array('cdata',array(" def")),
+ array('quote_open',array()),
+ array('cdata',array("ghi")),
+ array('quote_close',array()),
+ array('quote_close',array()),
+ array('p_open',array()),
+ array('cdata',array("klm")),
+ array('p_close',array()),
+ array('document_end',array()),
+
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/parser/parser_quotes.test.php b/_test/tests/inc/parser/parser_quotes.test.php
new file mode 100644
index 000000000..b2dae1039
--- /dev/null
+++ b/_test/tests/inc/parser/parser_quotes.test.php
@@ -0,0 +1,269 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
+
+ function setup() {
+ parent::setup();
+ global $conf;
+ $conf['typography'] = 2;
+ }
+
+ function testSingleQuoteOpening() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo 'hello Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('singlequoteopening',array()),
+ array('cdata',array('hello Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleQuoteOpeningSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo said:'hello Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo said:')),
+ array('singlequoteopening',array()),
+ array('cdata',array('hello Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleQuoteClosing() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo hello' Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo hello')),
+ array('singlequoteclosing',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleQuoteClosingSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo hello') Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo hello')),
+ array('singlequoteclosing',array()),
+ array('cdata',array(') Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleQuotes() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo 'hello' Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('singlequoteopening',array()),
+ array('cdata',array('hello')),
+ array('singlequoteclosing',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testApostrophe() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("hey it's fine weather today");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'hey it')),
+ array('apostrophe',array()),
+ array('cdata',array('s fine weather today')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+
+ function testSingleQuotesSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse("Foo ('hello') Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo (')),
+ array('singlequoteopening',array()),
+ array('cdata',array('hello')),
+ array('singlequoteclosing',array()),
+ array('cdata',array(') Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuoteOpening() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo "hello Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('doublequoteopening',array()),
+ array('cdata',array('hello Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuoteOpeningSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo said:"hello Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo said:')),
+ array('doublequoteopening',array()),
+ array('cdata',array('hello Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuoteClosing() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo hello" Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo hello')),
+ array('doublequoteclosing',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuoteClosingSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo hello") Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo hello')),
+ array('doublequoteclosing',array()),
+ array('cdata',array(') Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuotes() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo "hello" Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('doublequoteopening',array()),
+ array('cdata',array('hello')),
+ array('doublequoteclosing',array()),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testDoubleQuotesSpecial() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('Foo ("hello") Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo (')),
+ array('doublequoteopening',array()),
+ array('cdata',array('hello')),
+ array('doublequoteclosing',array()),
+ array('cdata',array(') Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testAllQuotes() {
+ $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes());
+ $this->P->parse('There was written "He thought \'It\'s a man\'s world\'".');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'There was written ')),
+ array('doublequoteopening',array()),
+ array('cdata',array('He thought ')),
+ array('singlequoteopening',array()),
+ array('cdata',array('It')),
+ array('apostrophe',array()),
+ array('cdata',array('s a man')),
+ array('apostrophe',array()),
+ array('cdata',array('s world')),
+ array('singlequoteclosing',array()),
+ array('doublequoteclosing',array()),
+ array('cdata',array(".")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+}
+
diff --git a/_test/tests/inc/parser/parser_replacements.test.php b/_test/tests/inc/parser/parser_replacements.test.php
new file mode 100644
index 000000000..f0367dac0
--- /dev/null
+++ b/_test/tests/inc/parser/parser_replacements.test.php
@@ -0,0 +1,379 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
+
+ function testSingleAcronym() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR')));
+ $this->P->parse('abc FOOBAR xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('acronym',array('FOOBAR')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testAlmostAnAcronym() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR')));
+ $this->P->parse('abcFOOBARxyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abcFOOBARxyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testPickAcronymCorrectly() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO')));
+ $this->P->parse('FOOBAR FOO');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'FOOBAR ')),
+ array('acronym',array('FOO')),
+ array('cdata',array('')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleAcronyms() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO','BAR')));
+ $this->P->parse('abc FOO def BAR xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('acronym',array('FOO')),
+ array('cdata',array(' def ')),
+ array('acronym',array('BAR')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+
+ }
+
+ function testMultipleAcronymsWithSubset1() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO','A.FOO','FOO.1','A.FOO.1')));
+ $this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n")),
+ array('acronym',array('FOO')),
+ array('cdata',array(" ")),
+ array('acronym',array('A.FOO')),
+ array('cdata',array(" ")),
+ array('acronym',array('FOO.1')),
+ array('cdata',array(" ")),
+ array('acronym',array('A.FOO.1')),
+ array('cdata',array('')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleAcronymsWithSubset2() {
+ $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('A.FOO.1','FOO.1','A.FOO','FOO')));
+ $this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n")),
+ array('acronym',array('FOO')),
+ array('cdata',array(" ")),
+ array('acronym',array('A.FOO')),
+ array('cdata',array(" ")),
+ array('acronym',array('FOO.1')),
+ array('cdata',array(" ")),
+ array('acronym',array('A.FOO.1')),
+ array('cdata',array('')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleSmileyFail() {
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
+ $this->P->parse('abc:-)xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc:-)xyz")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleSmiley() {
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
+ $this->P->parse('abc :-) xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('smiley',array(':-)')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleSmileysFail() {
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
+ $this->P->parse('abc:-)x^_^yz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc:-)x^_^yz")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleSmileys() {
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
+ $this->P->parse('abc :-) x ^_^ yz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('smiley',array(':-)')),
+ array('cdata',array(' x ')),
+ array('smiley',array('^_^')),
+ array('cdata',array(' yz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testBackslashSmileyFail() {
+ // This smiley is really :-\\ but escaping makes like interesting
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
+ $this->P->parse('abc:-\\\xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\nabc".':-\\\\'."xyz")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testBackslashSmiley() {
+ // This smiley is really :-\\ but escaping makes like interesting
+ $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
+ $this->P->parse('abc :-\\\ xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('smiley',array(':-\\\\')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleWordblock() {
+ $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT')));
+ $this->P->parse('abc CAT xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('wordblock',array('CAT')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testWordblockCase() {
+ $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT')));
+ $this->P->parse('abc cat xyz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('wordblock',array('cat')),
+ array('cdata',array(' xyz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleWordblock() {
+ $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT','dog')));
+ $this->P->parse('abc cat x DOG yz');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'abc ')),
+ array('wordblock',array('cat')),
+ array('cdata',array(' x ')),
+ array('wordblock',array('DOG')),
+ array('cdata',array(' yz')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testSingleEntity() {
+ $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->')));
+ $this->P->parse('x -> y');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'x ')),
+ array('entity',array('->')),
+ array('cdata',array(' y')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultipleEntities() {
+ $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->','<-')));
+ $this->P->parse('x -> y <- z');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'x ')),
+ array('entity',array('->')),
+ array('cdata',array(' y ')),
+ array('entity',array('<-')),
+ array('cdata',array(' z')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultiplyEntity() {
+ $this->P->addMode('multiplyentity',new Doku_Parser_Mode_MultiplyEntity());
+ $this->P->parse('Foo 10x20 Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('multiplyentity',array(10,20)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testMultiplyEntityHex() {
+ // the multiply entity pattern should not match hex numbers, eg. 0x123
+ $this->P->addMode('multiplyentity',new Doku_Parser_Mode_MultiplyEntity());
+ $this->P->parse('Foo 0x123 Bar');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo 0x123 Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testHR() {
+ $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->parse("Foo \n ---- \n Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('hr',array()),
+ array('p_open',array()),
+ array('cdata',array("\n Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testHREol() {
+ $this->P->addMode('hr',new Doku_Parser_Mode_HR());
+ $this->P->parse("Foo \n----\n Bar");
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('p_close',array()),
+ array('hr',array()),
+ array('p_open',array()),
+ array('cdata',array("\n Bar")),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_table.test.php b/_test/tests/inc/parser/parser_table.test.php
new file mode 100644
index 000000000..96789c38c
--- /dev/null
+++ b/_test/tests/inc/parser/parser_table.test.php
@@ -0,0 +1,572 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Table extends TestOfDoku_Parser {
+
+ function testTable() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(121)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testTableWinEOL() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse("\r\nabc\r\n| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |\r\n| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |\r\ndef");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(121)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testEmptyTable() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+|
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(0, 1, 6)),
+ array('tablerow_open',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(7)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testTableHeaders() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+^ X | Y ^ Z |
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 1, 6)),
+ array('tablerow_open',array()),
+ array('tableheader_open',array(1,NULL,1)),
+ array('cdata',array(' X ')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' Y ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,NULL,1)),
+ array('cdata',array(' Z ')),
+ array('tableheader_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(19)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+
+ }
+
+ function testCellAlignment() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+| X | Y ^ Z |
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 1, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'right',1)),
+ array('cdata',array(' X ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Y ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'center',1)),
+ array('cdata',array(' Z ')),
+ array('tableheader_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(23)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCellSpan() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+| d || e |
+| f ^ ^|
+||||
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 3, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(2,'right',1)),
+ array('cdata',array(' d ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' e ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' f ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(2,NULL,1)),
+ array('cdata',array(' ')),
+ array('tableheader_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(31)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCellRowSpan() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->parse('
+abc
+| a | c:::||
+|:::^ d | e|
+|b ^ ::: |:::f|
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 3, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,NULL,2)),
+ array('cdata',array(' a ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(2,'right',1)),
+ array('cdata',array(' c:::')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tableheader_open',array(1,'left',2)),
+ array('cdata',array(' d ')),
+ array('tableheader_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(' e')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array('b ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,NULL,1)),
+ array('cdata',array(':::f')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(51)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testCellAlignmentFormatting() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->parse('
+abc
+| **X** | Y ^ Z |
+def');
+
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 1, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'right',1)),
+ array('cdata',array(' ')),
+ array('strong_open',array()),
+ array('cdata',array('X')),
+ array('strong_close',array()),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Y ')),
+ array('tablecell_close',array()),
+ array('tableheader_open',array(1,'center',1)),
+ array('cdata',array(' Z ')),
+ array('tableheader_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(27)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+
+ }
+
+ function testTableEol() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
+ $this->P->parse('
+abc
+| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("abc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(121)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // This is really a failing test - formatting able to spread across cols
+ // Problem is fixing it would mean a major rewrite of table handling
+ function testTableStrong() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
+ $this->P->parse('
+abc
+| **Row 0 Col 1** | **Row 0 Col 2 | Row 0 Col 3** |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('strong_open',array()),
+ array('cdata',array('Row 0 Col 1')),
+ array('strong_close',array()),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('strong_open',array()),
+ array('cdata',array('Row 0 Col 2 | Row 0 Col 3')),
+ array('strong_close',array()),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,null,1)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(129)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // This is really a failing test - unformatted able to spread across cols
+ // Problem is fixing it would mean a major rewrite of table handling
+ function testTableUnformatted() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse('
+abc
+| <nowiki>Row 0 Col 1</nowiki> | <nowiki>Row 0 Col 2 | Row 0 Col 3</nowiki> |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('unformatted',array('Row 0 Col 1')),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('unformatted',array('Row 0 Col 2 | Row 0 Col 3')),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,null,1)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(155)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ function testTableLinebreak() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
+ $this->P->parse('
+abc
+| Row 0\\\\ Col 1 | Row 0 Col 2 | Row 0 Col 3 |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0')),
+ array('linebreak',array()),
+ array('cdata',array('Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 0 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(123)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+
+ // This is really a failing test - footnote able to spread across cols
+ // Problem is fixing it would mean a major rewrite of table handling
+ function testTableFootnote() {
+ $this->P->addMode('table',new Doku_Parser_Mode_Table());
+ $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
+ $this->P->parse('
+abc
+| ((Row 0 Col 1)) | ((Row 0 Col 2 | Row 0 Col 3)) |
+| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |
+def');
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n\nabc")),
+ array('p_close',array()),
+ array('table_open',array(3, 2, 6)),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array('Row 0 Col 1')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' ')),
+ array('nest', array ( array (
+ array('footnote_open',array()),
+ array('cdata',array('Row 0 Col 2 | Row 0 Col 3')),
+ array('footnote_close',array()),
+ ))),
+ array('cdata',array(' ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,null,1)),
+ array('cdata',array('')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('tablerow_open',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 1 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 2 ')),
+ array('tablecell_close',array()),
+ array('tablecell_open',array(1,'left',1)),
+ array('cdata',array(' Row 1 Col 3 ')),
+ array('tablecell_close',array()),
+ array('tablerow_close',array()),
+ array('table_close',array(129)),
+ array('p_open',array()),
+ array('cdata',array('def')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parser/parser_unformatted.test.php b/_test/tests/inc/parser/parser_unformatted.test.php
new file mode 100644
index 000000000..7608cfd1c
--- /dev/null
+++ b/_test/tests/inc/parser/parser_unformatted.test.php
@@ -0,0 +1,38 @@
+<?php
+require_once 'parser.inc.php';
+
+class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
+
+ function testNowiki() {
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse("Foo <nowiki>testing</nowiki> Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('unformatted',array('testing')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+
+ }
+
+ function testDoublePercent() {
+ $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
+ $this->P->parse("Foo %%testing%% Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('unformatted',array('testing')),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+}
+
diff --git a/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
new file mode 100644
index 000000000..66371509c
--- /dev/null
+++ b/_test/tests/inc/parserutils_set_metadata_during_rendering.test.php
@@ -0,0 +1,93 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+
+class parserutils_set_metadata_during_rendering_test extends DokuWikiTest {
+ // the id used for this test case
+ private $id;
+ // if the test case is currently running
+ private $active = false;
+ // the original plugin controller
+ private $plugin_controller;
+
+ // the actual test
+ function test_p_set_metadata_during_rendering() {
+ global $EVENT_HANDLER;
+ $this->id = 'test:p_set_metadata_during_rendering';
+ $this->active = true;
+
+ // write the wiki page so it exists and needs to be rendered
+ saveWikiText($this->id, 'Test '.time(), 'Test data setup');
+
+ $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'BEFORE', $this, 'helper_set_metadata', array('test_before_set' => 'test'));
+ $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'helper_set_metadata', array('test_after_set' => 'test'));
+ $EVENT_HANDLER->register_hook('PARSER_HANDLER_DONE', 'BEFORE', $this, 'helper_inject_test_instruction');
+
+ // Change the global plugin controller so this test can be a fake syntax plugin
+ global $plugin_controller;
+ $this->plugin_controller = $plugin_controller;
+ $plugin_controller = $this;
+
+ // the actual rendering, all hooks should be executed here
+ $newMeta = p_get_metadata($this->id);
+
+ // restore the plugin controller
+ $plugin_controller = $this->plugin_controller;
+
+ // assert that all three calls to p_set_metadata have been successful
+ $this->assertEquals($newMeta['test_before_set'], 'test');
+ $this->assertEquals($newMeta['test_after_set'], 'test');
+ $this->assertEquals($newMeta['test_during_rendering'], 'test');
+
+ // clean up
+ $this->active = false;
+
+ // make sure the saved metadata is the one that has been rendered
+ $this->assertEquals($newMeta, p_get_metadata($this->id));
+
+ saveWikiText($this->id, '', 'Test data remove');
+ }
+
+ // helper for the action plugin part of the test, tries executing p_set_metadata during rendering
+ function helper_set_metadata($event, $meta) {
+ if ($this->active) {
+ p_set_metadata($this->id, $meta, false, true);
+ $key = array_pop(array_keys($meta));
+ $this->assertTrue(is_string($meta[$key])); // ensure we really have a key
+ // ensure that the metadata property hasn't been set previously
+ $this->assertNotEquals($meta[$key], p_get_metadata($this->id, $key));
+ }
+ }
+
+ // helper for injecting an instruction for this test case
+ function helper_inject_test_instruction($event) {
+ if ($this->active)
+ $event->data->calls[] = array('plugin', array('parserutils_test', array()));
+ }
+
+ // fake syntax plugin rendering method that tries calling p_set_metadata during the actual rendering process
+ function render($format, &$renderer, $data) {
+ if ($this->active) {
+ $key = 'test_during_rendering';
+ p_set_metadata($this->id, array($key => 'test'), false, true);
+ // ensure that the metadata property hasn't been set previously
+ $this->assertNotEquals($key, p_get_metadata($this->id, $key));
+ }
+ }
+
+ // wrapper function for the fake plugin controller
+ function getList($type='',$all=false){
+ return $this->plugin_controller->getList();
+ }
+
+ // wrapper function for the fake plugin controller, return $this for the fake syntax of this test
+ function &load($type,$name,$new=false,$disabled=false){
+ if ($name == 'parserutils_test') {
+ return $this;
+ } else {
+ return $this->plugin_controller->load($type, $name, $new, $disabled);
+ }
+ }
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/_test/tests/inc/remote.test.php b/_test/tests/inc/remote.test.php
new file mode 100644
index 000000000..5dc868295
--- /dev/null
+++ b/_test/tests/inc/remote.test.php
@@ -0,0 +1,334 @@
+<?php
+
+require_once DOKU_INC . 'inc/init.php';
+require_once DOKU_INC . 'inc/RemoteAPICore.php';
+require_once DOKU_INC . 'inc/auth/basic.class.php';
+
+class MockAuth extends auth_basic {
+ function isCaseSensitive() { return true; }
+}
+
+class RemoteAPICoreTest {
+
+ function __getRemoteInfo() {
+ return array(
+ 'wiki.stringTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'stringTestMethod',
+ ), 'wiki.intTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'int',
+ 'doc' => 'Test method',
+ 'name' => 'intTestMethod',
+ ), 'wiki.floatTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'float',
+ 'doc' => 'Test method',
+ 'name' => 'floatTestMethod',
+ ), 'wiki.dateTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'date',
+ 'doc' => 'Test method',
+ 'name' => 'dateTestMethod',
+ ), 'wiki.fileTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'file',
+ 'doc' => 'Test method',
+ 'name' => 'fileTestMethod',
+ ), 'wiki.voidTestMethod' => array(
+ 'args' => array(),
+ 'return' => 'void',
+ 'doc' => 'Test method',
+ 'name' => 'voidTestMethod',
+ ), 'wiki.oneStringArgMethod' => array(
+ 'args' => array('string'),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'oneStringArgMethod',
+ ), 'wiki.twoArgMethod' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'doc' => 'Test method',
+ 'name' => 'twoArgMethod',
+ ), 'wiki.twoArgWithDefaultArg' => array(
+ 'args' => array('string', 'string'),
+ 'return' => 'string',
+ 'doc' => 'Test method',
+ 'name' => 'twoArgWithDefaultArg',
+ ), 'wiki.publicCall' => array(
+ 'args' => array(),
+ 'return' => 'boolean',
+ 'doc' => 'testing for public access',
+ 'name' => 'publicCall',
+ 'public' => 1
+ )
+ );
+ }
+ function stringTestMethod() { return 'success'; }
+ function intTestMethod() { return 42; }
+ function floatTestMethod() { return 3.14159265; }
+ function dateTestMethod() { return 2623452346; }
+ function fileTestMethod() { return 'file content'; }
+ function voidTestMethod() { return null; }
+ function oneStringArgMethod($arg) {return $arg; }
+ function twoArgMethod($string, $int) { return array($string, $int); }
+ function twoArgWithDefaultArg($string1, $string2 = 'default') { return array($string1, $string2); }
+ function publicCall() {return true;}
+
+}
+
+class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
+ function _getMethods() {
+ return array(
+ 'method1' => array(
+ 'args' => array(),
+ 'return' => 'void'
+ ), 'methodString' => array(
+ 'args' => array(),
+ 'return' => 'string'
+ ), 'method2' => array(
+ 'args' => array('string', 'int'),
+ 'return' => 'array',
+ 'name' => 'method2',
+ ), 'method2ext' => array(
+ 'args' => array('string', 'int', 'bool'),
+ 'return' => 'array',
+ 'name' => 'method2',
+ ), 'publicCall' => array(
+ 'args' => array(),
+ 'return' => 'boolean',
+ 'doc' => 'testing for public access',
+ 'name' => 'publicCall',
+ 'public' => 1
+ )
+ );
+ }
+
+ function method1() { return null; }
+ function methodString() { return 'success'; }
+ function method2($str, $int, $bool = false) { return array($str, $int, $bool); }
+ function publicCall() {return true;}
+
+}
+
+
+class remote_test extends DokuWikiTest {
+
+ var $originalConf;
+ var $userinfo;
+
+ var $remote;
+
+ function setUp() {
+ global $plugin_controller;
+ global $conf;
+ global $USERINFO;
+ global $auth;
+
+ parent::setUp();
+
+ $pluginManager = $this->getMock('Doku_Plugin_Controller');
+ $pluginManager->expects($this->any())->method('getList')->will($this->returnValue(array('testplugin')));
+ $pluginManager->expects($this->any())->method('load')->will($this->returnValue(new remote_plugin_testplugin()));
+
+ $plugin_controller = $pluginManager;
+
+ $this->originalConf = $conf;
+ $conf['remote'] = 1;
+ $conf['remoteuser'] = '!!not set!!';
+ $conf['useacl'] = 0;
+
+ $this->userinfo = $USERINFO;
+ $this->remote = new RemoteAPI();
+
+ $auth = new MockAuth();
+ }
+
+ function tearDown() {
+ global $conf;
+ global $USERINFO;
+ $conf = $this->originalConf;
+ $USERINFO = $this->userinfo;
+
+ }
+
+ function test_pluginMethods() {
+ $methods = $this->remote->getPluginMethods();
+ $actual = array_keys($methods);
+ sort($actual);
+ $expect = array('plugin.testplugin.method1', 'plugin.testplugin.method2', 'plugin.testplugin.methodString', 'plugin.testplugin.method2ext', 'plugin.testplugin.publicCall');
+ sort($expect);
+ $this->assertEquals($expect,$actual);
+ }
+
+ function test_hasAccessSuccess() {
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFail() {
+ global $conf;
+ $conf['remote'] = 0;
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFailAcl() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+ function test_hasAccessSuccessAclEmptyRemoteUser() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '';
+
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessSuccessAcl() {
+ global $conf;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '@grp,@grp2';
+ $USERINFO['grps'] = array('grp');
+ $this->assertTrue($this->remote->hasAccess());
+ }
+
+ function test_hasAccessFailAcl2() {
+ global $conf;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+ $conf['remoteuser'] = '@grp';
+ $USERINFO['grps'] = array('grp1');
+
+ $this->assertFalse($this->remote->hasAccess());
+ }
+
+
+ function test_forceAccessSuccess() {
+ global $conf;
+ $conf['remote'] = 1;
+ $this->remote->forceAccess(); // no exception should occur
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_forceAccessFail() {
+ global $conf;
+ $conf['remote'] = 0;
+ $this->remote->forceAccess();
+ }
+
+ function test_generalCoreFunctionWithoutArguments() {
+ global $conf;
+ $conf['remote'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $this->assertEquals($remoteApi->call('wiki.stringTestMethod'), 'success');
+ $this->assertEquals($remoteApi->call('wiki.intTestMethod'), 42);
+ $this->assertEquals($remoteApi->call('wiki.floatTestMethod'), 3.14159265);
+ $this->assertEquals($remoteApi->call('wiki.dateTestMethod'), 2623452346);
+ $this->assertEquals($remoteApi->call('wiki.fileTestMethod'), 'file content');
+ $this->assertEquals($remoteApi->call('wiki.voidTestMethod'), null);
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_generalCoreFunctionOnArgumentMismatch() {
+ global $conf;
+ $conf['remote'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $remoteApi->call('wiki.voidTestMethod', array('something'));
+ }
+
+ function test_generalCoreFunctionWithArguments() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+
+ $this->assertEquals($remoteApi->call('wiki.oneStringArgMethod', array('string')), 'string');
+ $this->assertEquals($remoteApi->call('wiki.twoArgMethod', array('string', 1)), array('string' , 1));
+ $this->assertEquals($remoteApi->call('wiki.twoArgWithDefaultArg', array('string')), array('string', 'default'));
+ $this->assertEquals($remoteApi->call('wiki.twoArgWithDefaultArg', array('string', 'another')), array('string', 'another'));
+ }
+
+ function test_pluginCallMethods() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method1'), null);
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method2', array('string', 7)), array('string', 7, false));
+ $this->assertEquals($remoteApi->call('plugin.testplugin.method2ext', array('string', 7, true)), array('string', 7, true));
+ $this->assertEquals($remoteApi->call('plugin.testplugin.methodString'), 'success');
+ }
+
+ /**
+ * @expectedException RemoteException
+ */
+ function test_notExistingCall() {
+ global $conf;
+ $conf['remote'] = 1;
+
+ $remoteApi = new RemoteApi();
+ $remoteApi->call('dose not exist');
+ }
+
+ function test_publicCallCore() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+ $this->assertTrue($remoteApi->call('wiki.publicCall'));
+ }
+
+ function test_publicCallPlugin() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $this->assertTrue($remoteApi->call('plugin.testplugin.publicCall'));
+ }
+
+ /**
+ * @expectedException RemoteAccessDeniedException
+ */
+ function test_publicCallCoreDeny() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->getCoreMethods(new RemoteAPICoreTest());
+ $remoteApi->call('wiki.stringTestMethod');
+ }
+
+ /**
+ * @expectedException RemoteAccessDeniedException
+ */
+ function test_publicCallPluginDeny() {
+ global $conf;
+ $conf['useacl'] = 1;
+ $remoteApi = new RemoteApi();
+ $remoteApi->call('plugin.testplugin.methodString');
+ }
+
+ function test_pluginCallCustomPath() {
+ global $EVENT_HANDLER;
+ $EVENT_HANDLER->register_hook('RPC_CALL_ADD', 'BEFORE', &$this, 'pluginCallCustomPathRegister');
+
+ $remoteApi = new RemoteAPI();
+ $result = $remoteApi->call('custom.path');
+ $this->assertEquals($result, 'success');
+ }
+
+ function pluginCallCustomPathRegister(&$event, $param) {
+ $event->data['custom.path'] = array('testplugin', 'methodString');
+ }
+}
diff --git a/_test/tests/inc/safefn.test.php b/_test/tests/inc/safefn.test.php
new file mode 100644
index 000000000..78e08fec6
--- /dev/null
+++ b/_test/tests/inc/safefn.test.php
@@ -0,0 +1,48 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+require_once DOKU_INC.'inc/utf8.php';
+require_once DOKU_INC.'inc/SafeFN.class.php';
+
+class safeFN_test extends DokuWikiTest {
+
+
+ function test1(){
+ // we test multiple cases here - format: string, repl, additional, test
+ $tests = array();
+ $tests[] = array('äa.txt', '%5g]a.txt');
+ $tests[] = array('ä.', '%5g].');
+ $tests[] = array('asciistring','asciistring');
+ $tests[] = array('ascii-_/.string','ascii-_/.string');
+ $tests[] = array('AName','%x%1a]ame');
+ $tests[] = array('A Name','%x%0%1a]ame');
+ $tests[] = array('Another...Name','%x]nother...%1a]ame');
+ $tests[] = array('Aß∂ƒName','%x%5b%6oy%aa%1a]ame');
+ $tests[] = array('A%ß-∂_.ƒName','%x%%5b]-%6oy]_.%aa%1a]ame');
+ $tests[] = array('A%%ß-∂_.ƒName','%x%%%5b]-%6oy]_.%aa%1a]ame');
+ $tests[] = array('데이터도 함께 복원됩니다. 강력한','%zf4%13dg%15ao%zhg%0%164o%yig%0%11at%138w%zk9%zag%zb8].%0%xyt%10cl%164c]');
+ $tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr]');
+ $tests[] = array('нехватка_файлового_пространства_на_сервере_p0-squid.some.domain.1270211897.txt.gz','%t9%t1%th%sy%sw%te%t6%sw]_%tg%sw%t5%t7%ta%sy%ta%sz%ta]_%tb%tc%ta%td%te%tc%sw%t9%td%te%sy%sw]_%t9%sw]_%td%t1%tc%sy%t1%tc%t1]_p0-squid.some.domain.1270211897.txt.gz');
+
+ $tests[] = array('name[1]','name[1]');
+ $tests[] = array('Name[1]','%1a]ame[1]');
+ $tests[] = array('Name[A]','%1a]ame[%x]]');
+
+ foreach($tests as $test){
+ list($utf8,$safe) = $test;
+ $this->assertEquals(SafeFN::encode($utf8),$safe);
+ $this->assertEquals(SafeFN::decode($safe),$utf8);
+ }
+ }
+
+ function test2(){
+ $tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr');
+
+ foreach($tests as $test){
+ list($utf8,$safe) = $test;
+ $this->assertEquals(SafeFN::decode($safe),$utf8);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/search/data/ns1/ns3/page3.txt b/_test/tests/inc/search/data/ns1/ns3/page3.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/ns3/page3.txt
diff --git a/_test/tests/inc/search/data/ns1/page1.txt b/_test/tests/inc/search/data/ns1/page1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/page1.txt
diff --git a/_test/tests/inc/search/data/ns1/page2.txt b/_test/tests/inc/search/data/ns1/page2.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns1/page2.txt
diff --git a/_test/tests/inc/search/data/ns2/nopage.ext b/_test/tests/inc/search/data/ns2/nopage.ext
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns2/nopage.ext
diff --git a/_test/tests/inc/search/data/ns2/page1.txt b/_test/tests/inc/search/data/ns2/page1.txt
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/_test/tests/inc/search/data/ns2/page1.txt
diff --git a/_test/tests/inc/search/search.test.php b/_test/tests/inc/search/search.test.php
new file mode 100644
index 000000000..f7ea469b9
--- /dev/null
+++ b/_test/tests/inc/search/search.test.php
@@ -0,0 +1,102 @@
+<?php
+require_once DOKU_INC.'inc/init.php';
+
+class search_test extends DokuWikiTest {
+ function strip_index_data($entry) {
+ $n_entry = array();
+ foreach(array('id', 'type', 'level', 'open') as $k) {
+ $n_entry[$k] = $entry[$k];
+ }
+ return $n_entry;
+ }
+
+ function test_search_index(){
+ $data = array();
+ search($data, dirname(__FILE__) . '/data', 'search_index',
+ array('ns' => 'ns2'));
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
+ array(
+ array(
+ 'id' => 'ns1',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => false
+ ), array(
+ 'id' => 'ns2',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => true
+ ), array(
+ 'id' => 'ns2:page1',
+ 'type' => 'f',
+ 'level' => 2,
+ 'open' => true,
+ ), ));
+ $data = array();
+ search($data, dirname(__FILE__) . '/data', 'search_index',
+ array('ns' => 'ns1/ns3'));
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
+ array(
+ array(
+ 'id' => 'ns1',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns1:ns3',
+ 'type' => 'd',
+ 'level' => 2,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns1:ns3:page3',
+ 'type' => 'f',
+ 'level' => 3,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns1:page1',
+ 'type' => 'f',
+ 'level' => 2,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns1:page2',
+ 'type' => 'f',
+ 'level' => 2,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns2',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => false,
+ ), ));
+ $data = array();
+ search($data, dirname(__FILE__) . '/data', 'search_index',
+ array('ns' => 'ns1/ns3', 'nofiles' => true));
+ $this->assertEquals(array_map(array($this, 'strip_index_data'), $data),
+ array(
+ array(
+ 'id' => 'ns1',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns1:ns3',
+ 'type' => 'd',
+ 'level' => 2,
+ 'open' => true,
+ ),
+ array(
+ 'id' => 'ns2',
+ 'type' => 'd',
+ 'level' => 1,
+ 'open' => false,
+ ), ));
+
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_correctidx.test.php b/_test/tests/inc/utf8_correctidx.test.php
new file mode 100644
index 000000000..5c37627b6
--- /dev/null
+++ b/_test/tests/inc/utf8_correctidx.test.php
@@ -0,0 +1,78 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+require_once DOKU_INC.'inc/utf8.php';
+
+class utf8_correctidx_test extends DokuWikiTest {
+
+
+ function test_singlebyte(){
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+
+ // single byte, should return current index
+ $tests[] = array('aaживπά우리をあöä',0,false,0);
+ $tests[] = array('aaживπά우리をあöä',1,false,1);
+ $tests[] = array('aaживπά우리をあöä',1,true,1);
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+ function test_twobyte(){
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+
+ // two byte, should move to boundary, expect even number
+ $tests[] = array('aaживπά우리をあöä',2,false,2);
+ $tests[] = array('aaживπά우리をあöä',3,false,2);
+ $tests[] = array('aaживπά우리をあöä',4,false,4);
+
+ $tests[] = array('aaживπά우리をあöä',2,true,2);
+ $tests[] = array('aaживπά우리をあöä',3,true,4);
+ $tests[] = array('aaживπά우리をあöä',4,true,4);
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+ function test_threebyte(){
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+
+ // three byte, should move to boundary 10 or 13
+ $tests[] = array('aaживπά우리をあöä',10,false,10);
+ $tests[] = array('aaживπά우리をあöä',11,false,10);
+ $tests[] = array('aaживπά우리をあöä',12,false,10);
+ $tests[] = array('aaживπά우리をあöä',13,false,13);
+
+ $tests[] = array('aaживπά우리をあöä',10,true,10);
+ $tests[] = array('aaживπά우리をあöä',11,true,13);
+ $tests[] = array('aaживπά우리をあöä',12,true,13);
+ $tests[] = array('aaживπά우리をあöä',13,true,13);
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+ function test_bounds(){
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+
+ // bounds checking
+ $tests[] = array('aaживπά우리をあöä',-2,false,0);
+ $tests[] = array('aaживπά우리をあöä',128,false,29);
+
+ $tests[] = array('aaживπά우리をあöä',-2,true,0);
+ $tests[] = array('aaживπά우리をあöä',128,true,29);
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_correctIdx($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_html.test.php b/_test/tests/inc/utf8_html.test.php
new file mode 100644
index 000000000..94acc6d6c
--- /dev/null
+++ b/_test/tests/inc/utf8_html.test.php
@@ -0,0 +1,72 @@
+<?php
+
+require_once DOKU_INC.'inc/utf8.php';
+
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+
+class utf8_html_test extends DokuWikiTest {
+
+ function test_from_1byte(){
+ $in = 'a';
+ $out = 'a';
+ $this->assertEquals(utf8_tohtml($in),$out);
+ }
+
+ function test_from_2byte(){
+ $in = "\xc3\xbc";
+ $out = '&#252;';
+ $this->assertEquals(utf8_tohtml($in),$out);
+ }
+
+ function test_from_3byte(){
+ $in = "\xe2\x99\x8a";
+ $out = '&#x264a;';
+ $this->assertEquals(utf8_tohtml($in),$out);
+ }
+
+ function test_from_4byte(){
+ $in = "\xf4\x80\x80\x81";
+ $out = '&#x100001;';
+ $this->assertEquals(utf8_tohtml($in),$out);
+ }
+
+ function test_to_1byte(){
+ $out = 'a';
+ $in = 'a';
+ $this->assertEquals(utf8_unhtml($in),$out);
+ }
+
+ function test_to_2byte(){
+ $out = "\xc3\xbc";
+ $in = '&#252;';
+ $this->assertEquals(utf8_unhtml($in),$out);
+ }
+
+ function test_to_3byte(){
+ $out = "\xe2\x99\x8a";
+ $in = '&#x264a;';
+ $this->assertEquals(utf8_unhtml($in),$out);
+ }
+
+ function test_to_4byte(){
+ $out = "\xf4\x80\x80\x81";
+ $in = '&#x100001;';
+ $this->assertEquals(utf8_unhtml($in),$out);
+ }
+
+ function test_without_entities(){
+ $out = '&amp;#38;&amp;#38;';
+ $in = '&amp;#38;&#38;amp;#38;';
+ $this->assertEquals(utf8_unhtml($in),$out);
+ }
+
+ function test_with_entities(){
+ $out = '&#38;&amp;#38;';
+ $in = '&amp;#38;&#38;amp;#38;';
+ $this->assertEquals(utf8_unhtml($in,HTML_ENTITIES),$out);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_kanaromaji.txt b/_test/tests/inc/utf8_kanaromaji.txt
new file mode 100644
index 000000000..d6bf51e95
--- /dev/null
+++ b/_test/tests/inc/utf8_kanaromaji.txt
@@ -0,0 +1,22893 @@
+いつか;itsuka
+いつか;itsuka
+いつつ;itsutsu
+いつでも;itsudemo
+いつのまにか;itsunomanika
+いつまでも;itsumademo
+いつも;itsumo
+いてん;iten
+いと;ito
+いとこ;itoko
+いとこ;itoko
+いとま;itoma
+いど;ido
+いど;ido
+いどう;idou
+いない;inai
+いなか;inaka
+いにしえ;inishie
+いぬ;inu
+いね;ine
+いねむり;inemuri
+いのち;inochi
+いのる;inoru
+いはん;ihan
+いばる;ibaru
+いふく;ifuku
+いま;ima
+いま;ima
+いまに;imani
+いまにも;imanimo
+いみ;imi
+いもうと;imouto
+いや;iya
+いやがる;iyagaru
+いよいよ;iyoiyo
+いらい;irai
+いらい;irai
+いらいら;iraira
+いらっしゃる;irassharu
+いりぐち;iriguchi
+いりょう;iryou
+いる;iru
+いる;iru
+いる;iru
+いる;iru
+いれもの;iremono
+いれる;ireru
+いろ;iro
+いろいろ;iroiro
+いわ;iwa
+いわい;iwai
+いわう;iwau
+いわば;iwaba
+いわゆる;iwayuru
+いん;in
+いん;in
+いんさつ;insatsu
+いんしょう;inshou
+いんたい;intai
+いんよう;in_you
+いんりょく;inryoku
+うえ;ue
+うえき;ueki
+うえした;ueshita
+うえる;ueru
+うえる;ueru
+うお;uo
+うかがう;ukagau
+うかぶ;ukabu
+うかべる;ukaberu
+うがい;ugai
+うく;uku
+うけたまわる;uketamawaru
+うけつけ;uketsuke
+うけとり;uketori
+うけとる;uketoru
+うけもつ;ukemotsu
+うける;ukeru
+うごかす;ugokasu
+うごく;ugoku
+うさぎ;usagi
+うし;ushi
+うしなう;ushinau
+うじ;uji
+うすい;usui
+うすぐらい;usugurai
+うすめる;usumeru
+うずめる;uzumeru
+うそ;uso
+うた;uta
+うたう;utau
+うたがう;utagau
+うち;uchi
+うちあわせ;uchiawase
+うちあわせる;uchiawaseru
+うちけす;uchikesu
+うちゅう;uchuu
+うっかり;ukkari
+うったえる;uttaeru
+うつ;utsu
+うつ;utsu
+うつ;utsu
+うつくしい;utsukushii
+うつす;utsusu
+うつす;utsusu
+うつす;utsusu
+うつる;utsuru
+うつる;utsuru
+うつる;utsuru
+うつわ;utsuwa
+うで;ude
+うどん;udon
+うなずく;unazuku
+うなる;unaru
+うばう;ubau
+うま;uma
+うまい;umai
+うまれ;umare
+うまれる;umareru
+うみ;umi
+うむ;umu
+うめ;ume
+うやまう;uyamau
+うら;ura
+うら;ura
+うらがえす;uragaesu
+うらぎる;uragiru
+うらぐち;uraguchi
+うらなう;uranau
+うらみ;urami
+うらむ;uramu
+うらやましい;urayamashii
+うらやむ;urayamu
+うりあげ;uriage
+うりきれ;urikire
+うりきれる;urikireru
+うりば;uriba
+うる;uru
+うる;uru
+うるさい;urusai
+うれしい;ureshii
+うれゆき;ureyuki
+うれる;ureru
+うろうろ;urouro
+うわぎ;uwagi
+うわさ;uwasa
+うわて;uwate
+うわる;uwaru
+うん;un
+うんが;unga
+うんてん;unten
+うんどう;undou
+え;e
+え;e
+え;e
+え;e
+えいえん;eien
+えいが;eiga
+えいきゅう;eikyuu
+えいきょう;eikyou
+えいぎょう;eigyou
+えいご;eigo
+えいせい;eisei
+えいぶん;eibun
+えいよう;eiyou
+えいわ;eiwa
+ええ;ee
+ええと;eeto
+えがお;egao
+えがく;egaku
+えき;eki
+えき;eki
+えきたい;ekitai
+えさ;esa
+えだ;eda
+えのぐ;enogu
+えらい;erai
+えらぶ;erabu
+えん;en
+えん;en
+えん;en
+えん;en
+えん;en
+えんかい;enkai
+えんき;enki
+えんぎ;engi
+えんげい;engei
+えんげき;engeki
+えんしゅう;enshuu
+えんしゅう;enshuu
+えんじょ;enjo
+えんぜつ;enzetsu
+えんそう;ensou
+えんそく;ensoku
+えんちょう;enchou
+えんとつ;entotsu
+えんりょ;enryo
+お;o
+おい;oi
+おいかける;oikakeru
+おいこす;oikosu
+おいしい;oishii
+おいつく;oitsuku
+おいでになる;oideninaru
+おう;ou
+おう;ou
+おうえん;ouen
+おうさま;ousama
+おうしょく;oushoku
+おうじ;ouji
+おうじょ;oujo
+おうじる;oujiru
+おうずる;ouzuru
+おうせつ;ousetsu
+おうたい;outai
+おうだん;oudan
+おうふく;oufuku
+おうべい;oubei
+おうよう;ouyou
+おえる;oeru
+おおい;ooi
+おおいに;ooini
+おおう;oou
+おおきい;ookii
+おおごと;oogoto
+おおざっぱ;oozappa
+おおどおり;oodoori
+おおや;ooya
+おおよそ;ooyoso
+おか;oka
+おかあさん;okaasan
+おかげ;okage
+おかげさまで;okagesamade
+おかしい;okashii
+おかず;okazu
+おかまいなく;okamainaku
+おかわり;okawari
+おがむ;ogamu
+おき;oki
+おきる;okiru
+おぎなう;oginau
+おく;oku
+おく;oku
+おく;oku
+おくがい;okugai
+おくさん;okusan
+おくじょう;okujou
+おくりがな;okurigana
+おくりもの;okurimono
+おくる;okuru
+おくる;okuru
+おくれる;okureru
+おこさん;okosan
+おこす;okosu
+おこたる;okotaru
+おこなう;okonau
+おこる;okoru
+おさ;osa
+おさえる;osaeru
+おさきに;osakini
+おさない;osanai
+おさめる;osameru
+おさめる;osameru
+おさめる;osameru
+おしい;oshii
+おしいれ;oshiire
+おしえる;oshieru
+おしゃべり;oshaberi
+おしゃれ;oshare
+おじ;oji
+おじいさん;ojiisan
+おじぎ;ojigi
+おじさん;ojisan
+おじゃまします;ojamashimasu
+おじょうさん;ojousan
+おす;osu
+おせん;osen
+おそい;osoi
+おそらく;osoraku
+おそれる;osoreru
+おそろしい;osoroshii
+おそわる;osowaru
+おだいじに;odaijini
+おだやか;odayaka
+おちつく;ochitsuku
+おちる;ochiru
+おっしゃる;ossharu
+おっと;otto
+おてあらい;otearai
+おてつだいさん;otetsudaisan
+おと;oto
+おとうと;otouto
+おとうさん;otousan
+おとこ;otoko
+おとこのひと;otokonohito
+おとしもの;otoshimono
+おとす;otosu
+おととい;ototoi
+おととし;ototoshi
+おとな;otona
+おとなしい;otonashii
+おとめ;otome
+おとる;otoru
+おどかす;odokasu
+おどり;odori
+おどる;odoru
+おどろかす;odorokasu
+おどろく;odoroku
+おなか;onaka
+おなご;onago
+おなじ;onaji
+おに;oni
+おにいさん;oniisan
+おねえさん;oneesan
+おねがいします;onegaishimasu
+おのおの;onoono
+おのおの;onoono
+おはよう;ohayou
+おば;oba
+おばあさん;obaasan
+おばさん;obasan
+おひる;ohiru
+おび;obi
+おぼえる;oboeru
+おぼれる;oboreru
+おまいり;omairi
+おまちどおさま;omachidoosama
+おまわりさん;omawarisan
+おめでとう;omedetou
+おも;omo
+おもい;omoi
+おもいがけない;omoigakenai
+おもいきり;omoikiri
+おもいこむ;omoikomu
+おもいだす;omoidasu
+おもいつく;omoitsuku
+おもいで;omoide
+おもう;omou
+おもしろい;omoshiroi
+おもたい;omotai
+おもちゃ;omocha
+おもて;omote
+おもなる;omonaru
+おもに;omoni
+おもやく;omoyaku
+おもわず;omowazu
+おや;oya
+おや;oya
+おやすみ;oyasumi
+おやつ;oyatsu
+おやゆび;oyayubi
+およぎ;oyogi
+およぐ;oyogu
+およそ;oyoso
+およぼす;oyobosu
+おりる;oriru
+おりる;oriru
+おる;oru
+おれる;oreru
+おろす;orosu
+おろす;orosu
+おわり;owari
+おわる;owaru
+おん;on
+おんがく;ongaku
+おんけい;onkei
+おんしつ;onshitsu
+おんせん;onsen
+おんたい;ontai
+おんだん;ondan
+おんちゅう;onchuu
+おんど;ondo
+おんな;onna
+おんなのこ;onnanoko
+おんなのひと;onnanohito
+か;ka
+か;ka
+か;ka
+か;ka
+か;ka
+か;ka
+かい;kai
+かい;kai
+かい;kai
+かいいん;kaiin
+かいかい;kaikai
+かいかん;kaikan
+かいが;kaiga
+かいがい;kaigai
+かいがん;kaigan
+かいぎ;kaigi
+かいけい;kaikei
+かいけつ;kaiketsu
+かいごう;kaigou
+かいさつ;kaisatsu
+かいさん;kaisan
+かいし;kaishi
+かいしゃ;kaisha
+かいしゃく;kaishaku
+かいじょう;kaijou
+かいすいよく;kaisuiyoku
+かいすう;kaisuu
+かいすうけん;kaisuuken
+かいせい;kaisei
+かいせい;kaisei
+かいせつ;kaisetsu
+かいぜん;kaizen
+かいぞう;kaizou
+かいだん;kaidan
+かいつう;kaitsuu
+かいてき;kaiteki
+かいてん;kaiten
+かいとう;kaitou
+かいとう;kaitou
+かいふく;kaifuku
+かいほう;kaihou
+かいほう;kaihou
+かいもの;kaimono
+かいよう;kaiyou
+かいわ;kaiwa
+かう;kau
+かう;kau
+かえす;kaesu
+かえす;kaesu
+かえって;kaette
+かえり;kaeri
+かえる;kaeru
+かえる;kaeru
+かえる;kaeru
+かえる;kaeru
+かえる;kaeru
+かえる;kaeru
+かお;kao
+かおく;kaoku
+かおり;kaori
+かかえる;kakaeru
+かかく;kakaku
+かかり;kakari
+かかる;kakaru
+かかわる;kakawaru
+かがく;kagaku
+かがく;kagaku
+かがみ;kagami
+かがやく;kagayaku
+かきとめ;kakitome
+かきとり;kakitori
+かきね;kakine
+かぎ;kagi
+かぎり;kagiri
+かぎる;kagiru
+かく;kaku
+かく;kaku
+かく;kaku
+かく;kaku
+かくう;kakuu
+かくご;kakugo
+かくじ;kakuji
+かくじつ;kakujitsu
+かくじゅう;kakujuu
+かくす;kakusu
+かくだい;kakudai
+かくち;kakuchi
+かくちょう;kakuchou
+かくど;kakudo
+かくにん;kakunin
+かくべつ;kakubetsu
+かくりつ;kakuritsu
+しびれる;shibireru
+しへい;shihei
+しほん;shihon
+しぼう;shibou
+しぼむ;shibomu
+しぼる;shiboru
+しま;shima
+しま;shima
+しまい;shimai
+しまう;shimau
+しまった;shimatta
+しまる;shimaru
+しみじみ;shimijimi
+しみん;shimin
+しめい;shimei
+しめきり;shimekiri
+しめきる;shimekiru
+しめす;shimesu
+しめた;shimeta
+しめる;shimeru
+しめる;shimeru
+しめる;shimeru
+しめる;shimeru
+しも;shimo
+しもべ;shimobe
+しゃかい;shakai
+しゃかいかがく;shakaikagaku
+しゃがむ;shagamu
+しゃこ;shako
+しゃしょう;shashou
+しゃしん;shashin
+しゃせい;shasei
+しゃせつ;shasetsu
+しゃっきん;shakkin
+しゃっくり;shakkuri
+しゃぶる;shaburu
+じょうはつ;jouhatsu
+じょうひん;jouhin
+じょうふ;joufu
+じょうほう;jouhou
+じょおう;joou
+じょきょうじゅ;jokyouju
+じょしゅ;joshu
+じょじょに;jojoni
+じょせい;josei
+じょゆう;joyuu
+じん;jin
+じんこう;jinkou
+じんこう;jinkou
+じんしゅ;jinshu
+じんじ;jinji
+じんじゃ;jinja
+じんせい;jinsei
+じんぞう;jinzou
+じんぶつ;jinbutsu
+じんぶんかがく;jinbunkagaku
+じんめい;jinmei
+じんもく;jinmoku
+じんるい;jinrui
+す;su
+す;su
+すいえい;suiei
+すいさん;suisan
+すいじ;suiji
+すいじゅん;suijun
+すいじょうき;suijouki
+すいせん;suisen
+すいそ;suiso
+すいちょく;suichoku
+すいてい;suitei
+すいてき;suiteki
+すいとう;suitou
+すいどう;suidou
+ちゅうがく;chuugaku
+ちゅうげん;chuugen
+ちゅうこ;chuuko
+ちゅうし;chuushi
+ちゅうし;chuushi
+ちゅうしゃ;chuusha
+ちゅうしゃ;chuusha
+ちゅうしょう;chuushou
+ちゅうしょく;chuushoku
+ちゅうしん;chuushin
+ちゅうじゅん;chuujun
+ちゅうせい;chuusei
+ちゅうせい;chuusei
+ちゅうと;chuuto
+ちゅうねん;chuunen
+ちゅうもく;chuumoku
+ちゅうもん;chuumon
+ちょう;chou
+ちょうか;chouka
+ちょうき;chouki
+ちょうこく;choukoku
+ちょうさ;chousa
+ちょうし;choushi
+ちょうしょ;chousho
+ちょうじょ;choujo
+ちょうじょう;choujou
+ちょうせい;chousei
+ちょうせつ;chousetsu
+ちょうたん;choutan
+ちょうだい;choudai
+ちょうてん;chouten
+ちょうど;choudo
+ちょうなん;chounan
+ちょうほうけい;chouhoukei
+ちょうみりょう;choumiryou
+ちょうめ;choume
+にんき;ninki
+にんぎょう;ningyou
+にんげん;ningen
+ぬう;nuu
+ぬく;nuku
+ぬぐ;nugu
+ぬける;nukeru
+ぬすむ;nusumu
+ぬの;nuno
+ぬらす;nurasu
+ぬる;nuru
+ぬるい;nurui
+ぬれる;nureru
+ね;ne
+ね;ne
+ねがい;negai
+ねがう;negau
+ねこ;neko
+ねじ;neji
+ねじる;nejiru
+ねず;nezu
+ねだん;nedan
+ねっしん;nesshin
+ねっする;nessuru
+ねったい;nettai
+ねっちゅう;necchuu
+ねつ;netsu
+ねぼう;nebou
+ねまき;nemaki
+ねまき;nemaki
+ねむい;nemui
+ねむる;nemuru
+ねらい;nerai
+ねらう;nerau
+ねる;neru
+ねんかん;nenkan
+ねんじゅう;nenjuu
+ねんせい;nensei
+ねんだい;nendai
+ねんど;nendo
+ほうそく;housoku
+ほうたい;houtai
+ほうちょう;houchou
+ほうていしき;houteishiki
+ほうふ;houfu
+ほうほう;houhou
+ほうめん;houmen
+ほうもん;houmon
+ほうりつ;houritsu
+ほうる;houru
+ほえる;hoeru
+ほお;hoo
+ほか;hoka
+ほかく;hokaku
+ほがらか;hogaraka
+ほけん;hoken
+ほこり;hokori
+ほこり;hokori
+ほこる;hokoru
+ほころびる;hokorobiru
+ほし;hoshi
+ほしい;hoshii
+ほしょう;hoshou
+ほす;hosu
+ほそい;hosoi
+ほそう;hosou
+ほぞん;hozon
+ほっきょく;hokkyoku
+ほとんど;hotondo
+ほど;hodo
+ほどう;hodou
+ほどく;hodoku
+ほのお;honoo
+ほほえむ;hohoemu
+ほぼ;hobo
+ほめる;homeru
+ほり;hori
+ほる;horu
+ほる;horu
+ほん;hon
+かならずしも;kanarazushimo
+かならずしもない;kanarazushimonai
+わけ;wake
+くげ;kuge
+ぶけ;buke
+へいみん;heimin
+いなか;inaka
+た;ta
+たとえば;tatoeba
+やま;yama
+わたなべ;watanabe
+かわ;kawa
+わたる;wataru
+いみ;imi
+つづき;tsuduki
+あきた;akita
+あきたけん;akitaken
+かいぬし;kainushi
+つかえる;tsukaeru
+そのうちに;sonouchini
+なくなる;nakunaru
+まいにち;mainichi
+あいだ;aida
+ねんかん;nenkan
+ある;aru
+しぬ;shinu
+たてる;tateru
+ひとびと;hitobito
+ゆうめい;yuumei
+にほんじゅう;nihonjuu
+はい;hai
+しょるい;shorui
+せつめい;setsumei
+こくせき;kokuseki
+うまれる;umareru
+ゆみ;yumi
+オーストラリア;oosutoraria
+スペイン;supein
+じゅうしょ;juusho
+しょくぎょう;shokugyou
+きょかしょう;kyokashou
+たいざい;taizai
+ため;tame
+にゅうがくする;nyuugakusuru
+クラブ;kurabu
+テニス;tenisu
+させる;saseru
+てがみ;tegami
+りょうしん;ryoushin
+どうぶつえん;doubutsuen
+もくようび;mokuyoubi
+おおよろこび;ooyorokobi
+はじめて;hajimete
+わたしたち;watashitachi
+いじょう;ijou
+ならぶ;narabu
+きせつ;kisetsu
+こたえる;kotaeru
+きりん;kirin
+くび;kubi
+しわ;shiwa
+ぞう;zou
+だらけ;darake
+とう;tou
+アフリカ;afurika
+インド;indo
+みみ;mimi
+あいきょう;aikyou
+くま;kuma
+ピーナッツ;piinattsu
+むしゃむしゃ;mushamusha
+えだ;eda
+さる;saru
+とびうつる;tobiutsuru
+ねむい;nemui
+め;me
+ゆっくり;yukkuri
+らくだ;rakuda
+いもうと;imouto
+おどろく;odoroku
+おり;ori
+こわい;kowai
+ちゃん;chan
+なく;naku
+ほえる;hoeru
+ライオン;raion
+かくれる;kakureru
+かぐ;kagu
+かぐ;kagu
+かけざん;kakezan
+かけつ;kaketsu
+かける;kakeru
+かける;kakeru
+かげ;kage
+かげつ;kagetsu
+かげん;kagen
+かこ;kako
+かこう;kakou
+かこう;kakou
+かこむ;kakomu
+かご;kago
+かさ;kasa
+かさい;kasai
+かさねる;kasaneru
+かざり;kazari
+かざる;kazaru
+かざん;kazan
+かし;kashi
+かし;kashi
+かしこい;kashikoi
+かしこまりました;kashikomarimashita
+かしだし;kashidashi
+かしつ;kashitsu
+かしま;kashima
+かしや;kashiya
+かしゅ;kashu
+かしょ;kasho
+かしょう;kashou
+かじ;kaji
+かじ;kaji
+かじつ;kajitsu
+かじょう;kajou
+かじる;kajiru
+かす;kasu
+かする;kasuru
+かず;kazu
+かせぐ;kasegu
+かせん;kasen
+かぜ;kaze
+かぜ;kaze
+かぜい;kazei
+かそく;kasoku
+かそくど;kasokudo
+かぞえる;kazoeru
+かぞく;kazoku
+かた;kata
+かた;kata
+かた;kata
+かたい;katai
+かたい;katai
+かたい;katai
+かたい;katai
+かたかな;katakana
+かたがた;katagata
+かたき;kataki
+かたち;katachi
+かたづく;kataduku
+かたづける;katadukeru
+かたな;katana
+かたぶく;katabuku
+かたまり;katamari
+かたまる;katamaru
+かたみち;katamichi
+かたよる;katayoru
+かたよる;katayoru
+かたる;kataru
+かち;kachi
+かち;kachi
+かっき;kakki
+かっこ;kakko
+かっこう;kakkou
+かってに;katteni
+かつ;katsu
+かつぐ;katsugu
+かつじ;katsuji
+かつどう;katsudou
+かつやく;katsuyaku
+かつよう;katsuyou
+かつりょく;katsuryoku
+かづけ;kaduke
+かてい;katei
+かてい;katei
+かてい;katei
+かてい;katei
+かど;kado
+かな;kana
+かない;kanai
+かなしい;kanashii
+かなしむ;kanashimu
+かなづかい;kanadukai
+かなづち;kanaduchi
+かならずしも;kanarazushimo
+かなり;kanari
+かね;kane
+かね;kane
+かねぐら;kanegura
+かねつ;kanetsu
+かねもち;kanemochi
+かねる;kaneru
+かのう;kanou
+かのじょ;kanojo
+かはんすう;kahansuu
+かばん;kaban
+かひん;kahin
+かび;kabi
+かびん;kabin
+かぶ;kabu
+かぶせる;kabuseru
+かぶる;kaburu
+かべ;kabe
+かま;kama
+かまいません;kamaimasen
+かみ;kami
+かみ;kami
+かみ;kami
+かみくず;kamikuzu
+かみさま;kamisama
+かみそり;kamisori
+かみのけ;kaminoke
+かむ;kamu
+かめ;kame
+かもく;kamoku
+かもしれない;kamoshirenai
+かもつ;kamotsu
+かゆ;kayu
+かゆい;kayui
+かよう;kayou
+かよう;kayou
+かよう;kayou
+から;kara
+からい;karai
+からかう;karakau
+からだ;karada
+からだ;karada
+からっぽ;karappo
+かりる;kariru
+かる;karu
+かるい;karui
+かるた;karuta
+かれ;kare
+かれら;karera
+かれる;kareru
+かわ;kawa
+かわ;kawa
+かわ;kawa
+かわいい;kawaii
+かわいがる;kawaigaru
+かわいそう;kawaisou
+かわいらしい;kawairashii
+かわかす;kawakasu
+かわく;kawaku
+かわく;kawaku
+かわせ;kawase
+かわら;kawara
+かわり;kawari
+かわる;kawaru
+かわる;kawaru
+かん;kan
+かん;kan
+かん;kan
+かん;kan
+かん;kan
+かん;kan
+かんかく;kankaku
+かんかく;kankaku
+かんがえ;kangae
+かんがえる;kangaeru
+かんき;kanki
+かんきゃく;kankyaku
+かんきょう;kankyou
+かんけい;kankei
+かんげい;kangei
+かんげき;kangeki
+かんこう;kankou
+かんごふ;kangofu
+かんさい;kansai
+かんさつ;kansatsu
+かんしゃ;kansha
+かんしょう;kanshou
+かんしん;kanshin
+かんしん;kanshin
+かんじ;kanji
+かんじ;kanji
+かんじゃ;kanja
+かんじょう;kanjou
+かんじょう;kanjou
+かんじる;kanjiru
+かんする;kansuru
+かんずる;kanzuru
+かんせい;kansei
+かんせつ;kansetsu
+かんぜん;kanzen
+かんそう;kansou
+かんそう;kansou
+かんそく;kansoku
+かんたい;kantai
+かんたん;kantan
+かんちがい;kanchigai
+かんちょう;kanchou
+かんづめ;kandume
+かんでんち;kandenchi
+かんとう;kantou
+かんとく;kantoku
+かんどう;kandou
+かんねん;kannen
+かんばん;kanban
+かんぱい;kanpai
+かんびょう;kanbyou
+かんり;kanri
+かんりょう;kanryou
+かんれん;kanren
+かんわ;kanwa
+がい;gai
+がい;gai
+がいこう;gaikou
+がいこく;gaikoku
+がいしゅつ;gaishutsu
+がいぶ;gaibu
+がいろん;gairon
+がか;gaka
+がく;gaku
+がくしゃ;gakusha
+がくしゅう;gakushuu
+がくじゅつ;gakujutsu
+がくせい;gakusei
+がくねん;gakunen
+がくぶ;gakubu
+がくもん;gakumon
+がくりょく;gakuryoku
+がち;gachi
+がっか;gakka
+がっかい;gakkai
+がっかり;gakkari
+がっき;gakki
+がっき;gakki
+がっきゅう;gakkyuu
+がっこう;gakkou
+がっぴ;gappi
+がまん;gaman
+がる;garu
+がわ;gawa
+がんきょう;gankyou
+がんじつ;ganjitsu
+がんばる;ganbaru
+き;ki
+き;ki
+き;ki
+き;ki
+きあつ;kiatsu
+きいろい;kiiroi
+きえる;kieru
+きおく;kioku
+きおん;kion
+きかい;kikai
+きかい;kikai
+きかえる;kikaeru
+きかん;kikan
+きかん;kikan
+きかんしゃ;kikansha
+ききん;kikin
+きぎょう;kigyou
+きく;kiku
+きく;kiku
+きぐ;kigu
+きけん;kiken
+きげん;kigen
+きげん;kigen
+きこう;kikou
+きこえる;kikoeru
+きごう;kigou
+きざし;kizashi
+きざむ;kizamu
+きし;kishi
+きしゃ;kisha
+きしゃ;kisha
+きしょう;kishou
+きじ;kiji
+きじ;kiji
+きじゅん;kijun
+きすう;kisuu
+きず;kizu
+きせつ;kisetsu
+きせる;kiseru
+きそ;kiso
+きそく;kisoku
+きた;kita
+きたい;kitai
+きたい;kitai
+きたく;kitaku
+きたない;kitanai
+きたる;kitaru
+きち;kichi
+きちょう;kichou
+きちんと;kichinto
+きっかけ;kikkake
+きっさ;kissa
+きって;kitte
+きっと;kitto
+きっぷ;kippu
+きつい;kitsui
+きづく;kiduku
+きにいる;kiniiru
+きにゅう;kinyuu
+きぬ;kinu
+きねん;kinen
+きのう;kinou
+きのう;kinou
+きのどく;kinodoku
+きはい;kihai
+きばん;kiban
+きびしい;kibishii
+きふ;kifu
+きぶん;kibun
+きほん;kihon
+きぼう;kibou
+きまり;kimari
+きまる;kimaru
+きみ;kimi
+きみ;kimi
+きみょう;kimyou
+きめる;kimeru
+きもち;kimochi
+きもの;kimono
+きゃく;kyaku
+きゃくせき;kyakuseki
+きゃくま;kyakuma
+きゅう;kyuu
+きゅう;kyuu
+きゅう;kyuu
+きゅう;kyuu
+きゅうか;kyuuka
+きゅうぎょう;kyuugyou
+きゅうけい;kyuukei
+きゅうげき;kyuugeki
+きゅうこう;kyuukou
+きゅうこう;kyuukou
+きゅうしゅう;kyuushuu
+きゅうじょ;kyuujo
+きゅうそく;kyuusoku
+きゅうそく;kyuusoku
+きゅうよ;kyuuyo
+きゅうよう;kyuuyou
+きゅうりょう;kyuuryou
+きょう;kyou
+きょう;kyou
+きょういく;kyouiku
+きょういん;kyouin
+きょうか;kyouka
+きょうかい;kyoukai
+きょうかい;kyoukai
+きょうかしょ;kyoukasho
+きょうきゅう;kyoukyuu
+きょうぎ;kyougi
+きょうさん;kyousan
+きょうし;kyoushi
+きょうしつ;kyoushitsu
+きょうしゅく;kyoushuku
+きょうじゅ;kyouju
+きょうそう;kyousou
+きょうだい;kyoudai
+きょうだい;kyoudai
+きょうちょう;kyouchou
+きょうつう;kyoutsuu
+きょうどう;kyoudou
+きょうふ;kyoufu
+きょうみ;kyoumi
+きょうよう;kyouyou
+きょうり;kyouri
+きょうりょく;kyouryoku
+きょうりょく;kyouryoku
+きょか;kyoka
+きょく;kyoku
+きょく;kyoku
+きょくせん;kyokusen
+きょだい;kyodai
+きょねん;kyonen
+きょり;kyori
+きよい;kiyoi
+きよう;kiyou
+きらい;kirai
+きらう;kirau
+きらく;kiraku
+きり;kiri
+きりつ;kiritsu
+きる;kiru
+きる;kiru
+きる;kiru
+きれい;kirei
+きれる;kireru
+きろく;kiroku
+きわ;kiwa
+きわた;kiwata
+きをつける;kiwotsukeru
+きんえん;kin_en
+きんがく;kingaku
+きんきん;kinkin
+きんぎょ;kingyo
+きんし;kinshi
+きんじょ;kinjo
+きんせん;kinsen
+きんぞく;kinzoku
+きんだい;kindai
+きんちょう;kinchou
+ああ;aa
+あい;ai
+あいかわらず;aikawarazu
+あいさつ;aisatsu
+あいじょう;aijou
+あいする;aisuru
+あいず;aizu
+あいだ;aida
+あいて;aite
+あいにく;ainiku
+あいまい;aimai
+あう;au
+あう;au
+あう;au
+あお;ao
+あおい;aoi
+あおじろい;aojiroi
+あか;aka
+あかい;akai
+あかがね;akagane
+あかちゃん;akachan
+あかり;akari
+あかるい;akarui
+あがる;agaru
+あき;aki
+あき;aki
+あき;aki
+あきうど;akiudo
+あきらか;akiraka
+あきらめる;akirameru
+あきる;akiru
+あきれる;akireru
+あく;aku
+あく;aku
+あく;aku
+あくしゅ;akushu
+あくび;akubi
+あくま;akuma
+あくまで;akumade
+あくる;akuru
+あけがた;akegata
+あける;akeru
+あける;akeru
+あげる;ageru
+あげる;ageru
+あこがれる;akogareru
+あさ;asa
+あさい;asai
+あさって;asatte
+あさねぼう;asanebou
+あざ;aza
+あし;ashi
+あしあと;ashiato
+あした;ashita
+あしもと;ashimoto
+あじ;aji
+あじわう;ajiwau
+あずかる;azukaru
+あずける;azukeru
+あずま;azuma
+あせ;ase
+あそこ;asoko
+あそび;asobi
+あたい;atai
+あたえる;ataeru
+あたし;atashi
+あたたかい;atatakai
+あたたまる;atatamaru
+あたためる;atatameru
+あたま;atama
+あたらしい;atarashii
+あたり;atari
+あたりまえ;atarimae
+あたる;ataru
+あだびと;adabito
+あちこち;achikochi
+あちら;achira
+あちらこちら;achirakochira
+あっこう;akkou
+あっしゅく;asshuku
+あっち;acchi
+あつい;atsui
+あつい;atsui
+あつい;atsui
+あつかう;atsukau
+あつかましい;atsukamashii
+あつまり;atsumari
+あつまる;atsumaru
+あつめる;atsumeru
+あてな;atena
+あてはまる;atehamaru
+あてはめる;atehameru
+あてる;ateru
+あと;ato
+あと;ato
+あな;ana
+あなた;anata
+あに;ani
+あね;ane
+あの;ano
+あばれる;abareru
+あびる;abiru
+あふれる;afureru
+あぶない;abunai
+あぶら;abura
+あぶる;aburu
+あまい;amai
+あまど;amado
+あまやかす;amayakasu
+あまり;amari
+あまる;amaru
+あみもの;amimono
+あむ;amu
+あめ;ame
+あめ;ame
+あやうい;ayaui
+あやしい;ayashii
+あやまり;ayamari
+あやまる;ayamaru
+あら;ara
+あらい;arai
+あらい;arai
+あらう;arau
+あらし;arashi
+あらすじ;arasuji
+あらそう;arasou
+あらた;arata
+あらためて;aratamete
+あらためる;aratameru
+あらゆる;arayuru
+あらわす;arawasu
+あらわす;arawasu
+あらわす;arawasu
+あらわれ;araware
+あらわれる;arawareru
+ありがたい;arigatai
+ありがとう;arigatou
+ある;aru
+ある;aru
+ある;aru
+あるいは;aruiha
+あるく;aruku
+あるじ;aruji
+あれ;are
+あれこれ;arekore
+あれる;areru
+あわ;awa
+あわせる;awaseru
+あわただしい;awatadashii
+あわてる;awateru
+あわれ;aware
+あん;an
+あんい;an_i
+あんがい;angai
+あんき;anki
+あんしん;anshin
+あんぜん;anzen
+あんてい;antei
+あんな;anna
+あんない;annai
+あんまり;anmari
+い;i
+いい;ii
+いいえ;iie
+いいだす;iidasu
+いいつける;iitsukeru
+いいん;iin
+いう;iu
+いえ;ie
+いえぬし;ienushi
+いか;ika
+いかが;ikaga
+いかずち;ikazuchi
+いかる;ikaru
+いがい;igai
+いがい;igai
+いがく;igaku
+いき;iki
+いき;iki
+いきいき;ikiiki
+いきおい;ikioi
+いきなり;ikinari
+いきもの;ikimono
+いきる;ikiru
+いぎ;igi
+いく;iku
+いく;iku
+いくさ;ikusa
+いくさ;ikusa
+いくじ;ikuji
+いくつ;ikutsu
+いくぶん;ikubun
+いくら;ikura
+いけ;ike
+いけない;ikenai
+いけばな;ikebana
+いけん;iken
+いこう;ikou
+いご;igo
+いさましい;isamashii
+いし;ishi
+いし;ishi
+いし;ishi
+いし;ishi
+いしき;ishiki
+いしゃ;isha
+いしょくじゅう;ishokujuu
+いじ;iji
+いじめる;ijimeru
+いじょう;ijou
+いじょう;ijou
+いじわる;ijiwaru
+いす;isu
+いずみ;izumi
+いずれ;izure
+いぜん;izen
+いそがしい;isogashii
+いそぐ;isogu
+いた;ita
+いたい;itai
+いたす;itasu
+いたずら;itazura
+いただきます;itadakimasu
+いただく;itadaku
+いたみ;itami
+いたむ;itamu
+いたる;itaru
+いだい;idai
+いだく;idaku
+いち;ichi
+いち;ichi
+いち;ichi
+いち;ichi
+いちいち;ichiichi
+いちおう;ichiou
+いちげん;ichigen
+いちじ;ichiji
+いちじつ;ichijitsu
+いちじょう;ichijou
+いちだんと;ichidanto
+いちど;ichido
+いちどに;ichidoni
+いちにん;ichinin
+いちば;ichiba
+いちばん;ichiban
+いちぶ;ichibu
+いちりゅう;ichiryuu
+いっか;ikka
+いっさくじつ;issakujitsu
+いっさくねん;issakunen
+いっしゅ;isshu
+いっしゅん;isshun
+いっしょ;issho
+いっしょう;isshou
+いっしょうけんめい;isshoukenmei
+いっせい;issei
+いっそう;issou
+いったい;ittai
+いったん;ittan
+いっち;icchi
+いっぱい;ippai
+いっぱん;ippan
+いっぽう;ippou
+いつ;itsu
+きんにく;kinniku
+きんゆう;kin_yuu
+きんよう;kin_you
+ぎいん;giin
+ぎかい;gikai
+ぎし;gishi
+ぎしき;gishiki
+ぎじゅつ;gijutsu
+ぎちょう;gichou
+ぎっしり;gisshiri
+ぎむ;gimu
+ぎもん;gimon
+ぎゃく;gyaku
+ぎゅうにゅう;gyuunyuu
+ぎょう;gyou
+ぎょうぎ;gyougi
+ぎょうじ;gyouji
+ぎょうれつ;gyouretsu
+ぎょぎょう;gyogyou
+ぎょく;gyoku
+ぎろん;giron
+ぎん;gin
+ぎんこう;ginkou
+く;ku
+くいき;kuiki
+くう;kuu
+くうき;kuuki
+くうこう;kuukou
+くうそう;kuusou
+くうちゅう;kuuchuu
+くぎ;kugi
+くぎる;kugiru
+くぐる;kuguru
+くさ;kusa
+くさい;kusai
+くさり;kusari
+くさる;kusaru
+くし;kushi
+くしゃみ;kushami
+くしん;kushin
+くじょう;kujou
+くすり;kusuri
+くすりゆび;kusuriyubi
+くず;kuzu
+くずす;kuzusu
+くずれる;kuzureru
+くせ;kuse
+くたびれる;kutabireru
+くだく;kudaku
+くだける;kudakeru
+くださる;kudasaru
+くだもの;kudamono
+くだらない;kudaranai
+くだり;kudari
+くだる;kudaru
+くち;kuchi
+くちびる;kuchibiru
+くちべに;kuchibeni
+くっつく;kuttsuku
+くっつける;kuttsukeru
+くつ;kutsu
+くつう;kutsuu
+くつした;kutsushita
+くとうてん;kutouten
+くどい;kudoi
+くに;kuni
+くにざかい;kunizakai
+くばる;kubaru
+くび;kubi
+くふう;kufuu
+くぶん;kubun
+くべつ;kubetsu
+くみ;kumi
+くみあい;kumiai
+くみあわせ;kumiawase
+くみたてる;kumitateru
+くむ;kumu
+くむ;kumu
+くむ;kumu
+くも;kumo
+くもり;kumori
+くもる;kumoru
+くやしい;kuyashii
+くやむ;kuyamu
+くらい;kurai
+くらい;kurai
+くらし;kurashi
+くらす;kurasu
+くらべる;kuraberu
+くりかえす;kurikaesu
+くるう;kuruu
+くるしい;kurushii
+くるしむ;kurushimu
+くるしめる;kurushimeru
+くるま;kuruma
+くるむ;kurumu
+くれ;kure
+くれぐれも;kureguremo
+くれる;kureru
+くれる;kureru
+くろ;kuro
+くろい;kuroi
+くろう;kurou
+くわえる;kuwaeru
+くわしい;kuwashii
+くわわる;kuwawaru
+くん;kun
+くんれん;kunren
+ぐあい;guai
+ぐうすう;guusuu
+ぐうぜん;guuzen
+ぐたい;gutai
+ぐっすり;gussuri
+ぐらい;gurai
+ぐん;gun
+ぐん;gun
+ぐんたい;guntai
+け;ke
+けい;kei
+けい;kei
+けい;kei
+けいい;keii
+けいえい;keiei
+けいかく;keikaku
+けいかん;keikan
+けいき;keiki
+けいけん;keiken
+けいこ;keiko
+けいこう;keikou
+けいこうとう;keikoutou
+けいこく;keikoku
+けいご;keigo
+けいさつ;keisatsu
+けいさん;keisan
+けいざい;keizai
+けいしき;keishiki
+けいじ;keiji
+けいじ;keiji
+けいぞく;keizoku
+けいと;keito
+けいとう;keitou
+けいど;keido
+けいば;keiba
+けいび;keibi
+けいやく;keiyaku
+けいゆ;keiyu
+けいようし;keiyoushi
+けいようどうし;keiyoudoushi
+けが;kega
+けがす;kegasu
+けがれる;kegareru
+けがわ;kegawa
+けさ;kesa
+けしき;keshiki
+けしょう;keshou
+けしゴム;keshigomu
+けす;kesu
+けずる;kezuru
+けた;keta
+けち;kechi
+けっか;kekka
+けっかん;kekkan
+けっきょく;kekkyoku
+けっこう;kekkou
+けっこん;kekkon
+けっさく;kessaku
+けっして;kesshite
+けっしん;kesshin
+けっせき;kesseki
+けってん;ketten
+けつあつ;ketsuatsu
+けつえき;ketsueki
+けつだん;ketsudan
+けつろん;ketsuron
+けむい;kemui
+けむり;kemuri
+ける;keru
+けれど;keredo
+けわしい;kewashii
+けん;ken
+けん;ken
+けんか;kenka
+けんかい;kenkai
+けんがく;kengaku
+けんきゅう;kenkyuu
+けんきょ;kenkyo
+けんこう;kenkou
+けんさ;kensa
+けんしゅう;kenshuu
+けんせつ;kensetsu
+けんそん;kenson
+けんちく;kenchiku
+けんちょう;kenchou
+けんとう;kentou
+けんとう;kentou
+けんびきょう;kenbikyou
+けんぶつ;kenbutsu
+けんぽう;kenpou
+けんめい;kenmei
+けんり;kenri
+げいじゅつ;geijutsu
+げいのう;geinou
+げか;geka
+げき;geki
+げき;geki
+げきじょう;gekijou
+げきぞう;gekizou
+げしゃ;gesha
+げしゅく;geshuku
+げじゅん;gejun
+げすい;gesui
+げた;geta
+げっきゅう;gekkyuu
+げつまつ;getsumatsu
+げつよう;getsuyou
+げん;gen
+げんいん;gen_in
+げんかい;genkai
+げんかん;genkan
+げんき;genki
+げんきん;genkin
+げんこう;genkou
+げんご;gengo
+げんさん;gensan
+げんざい;genzai
+げんし;genshi
+げんしょう;genshou
+げんじつ;genjitsu
+げんじゅう;genjuu
+げんじょう;genjou
+げんじょう;genjou
+げんだい;gendai
+げんど;gendo
+げんに;genni
+げんり;genri
+げんりょう;genryou
+こ;ko
+こ;ko
+こ;ko
+こい;koi
+こい;koi
+こいしい;koishii
+こいびと;koibito
+こう;kou
+こう;kou
+こういん;kouin
+こううん;kouun
+こうえん;kouen
+こうえん;kouen
+こうか;kouka
+こうか;kouka
+こうか;kouka
+こうかん;koukan
+こうがい;kougai
+こうがい;kougai
+こうきゅう;koukyuu
+こうきょう;koukyou
+こうぎ;kougi
+こうぎょう;kougyou
+こうくう;koukuu
+こうけい;koukei
+こうけん;kouken
+こうげい;kougei
+こうげき;kougeki
+こうこう;koukou
+こうこう;koukou
+こうこく;koukoku
+こうさ;kousa
+こうさい;kousai
+こうさてん;kousaten
+こうし;koushi
+こうしき;koushiki
+こうしゃ;kousha
+こうしゃ;kousha
+こうしゅう;koushuu
+こうじ;kouji
+こうじつ;koujitsu
+こうじょう;koujou
+こうすい;kousui
+こうせい;kousei
+こうせい;kousei
+こうせき;kouseki
+こうせん;kousen
+こうそう;kousou
+こうそく;kousoku
+こうぞう;kouzou
+こうたい;koutai
+こうち;kouchi
+こうちゃ;koucha
+こうつう;koutsuu
+こうつうきかん;koutsuukikan
+こうてい;koutei
+こうてい;koutei
+こうとう;koutou
+こうとうがっこう;koutougakkou
+こうど;koudo
+こうどう;koudou
+こうどう;koudou
+こうはい;kouhai
+こうばん;kouban
+こうひょう;kouhyou
+こうふく;koufuku
+こうぶつ;koubutsu
+こうへい;kouhei
+こうほ;kouho
+こうむ;koumu
+こうもく;koumoku
+こうよう;kouyou
+こうりゅう;kouryuu
+こうりょ;kouryo
+こうりょく;kouryoku
+こえ;koe
+こえる;koeru
+こえる;koeru
+こおり;koori
+こがす;kogasu
+こきゅう;kokyuu
+こきょう;kokyou
+こくおう;kokuou
+こくご;kokugo
+こくさい;kokusai
+こくせき;kokuseki
+こくばん;kokuban
+こくふく;kokufuku
+こくみん;kokumin
+こくもつ;kokumotsu
+こくりつ;kokuritsu
+こぐ;kogu
+こげる;kogeru
+ここ;koko
+ここのか;kokonoka
+ここのつ;kokonotsu
+こころ;kokoro
+こころあたり;kokoroatari
+こころえる;kokoroeru
+こごえる;kogoeru
+こごる;kogoru
+こし;koshi
+こしかけ;koshikake
+こしかける;koshikakeru
+こしょう;koshou
+こしょう;koshou
+こしらえる;koshiraeru
+こじん;kojin
+こす;kosu
+こす;kosu
+こたい;kotai
+こたえ;kotae
+こたえる;kotaeru
+こちら;kochira
+こちらこそ;kochirakoso
+こっか;kokka
+こっかい;kokkai
+こっせつ;kossetsu
+こっそり;kossori
+こつ;kotsu
+こづかい;kodukai
+こづつみ;kodutsumi
+こてん;koten
+こと;koto
+こと;koto
+ことし;kotoshi
+ことづける;kotodukeru
+ことなる;kotonaru
+ことば;kotoba
+ことばづかい;kotobadukai
+ことり;kotori
+ことわざ;kotowaza
+ことわる;kotowaru
+こども;kodomo
+こな;kona
+こないだ;konaida
+この;kono
+このあいだ;konoaida
+このごろ;konogoro
+このみ;konomi
+このむ;konomu
+こぼす;kobosu
+こぼれる;koboreru
+こまかい;komakai
+こまる;komaru
+こむ;komu
+こむ;komu
+こむぎ;komugi
+こめ;kome
+こや;koya
+こゆび;koyubi
+こらえる;koraeru
+これ;kore
+これら;korera
+ころがす;korogasu
+ころがる;korogaru
+ころす;korosu
+ころぶ;korobu
+こわい;kowai
+こわす;kowasu
+こわれる;kowareru
+こん;kon
+こんかい;konkai
+こんご;kongo
+こんごう;kongou
+こんざつ;konzatsu
+こんだて;kondate
+こんど;kondo
+こんな;konna
+こんなに;konnani
+こんなん;konnan
+こんにちは;konnichiha
+こんばんは;konbanha
+こんやく;kon_yaku
+こんらん;konran
+ご;go
+ご;go
+ご;go
+ご;go
+ごう;gou
+ごう;gou
+ごう;gou
+ごういん;gouin
+ごうか;gouka
+ごうかく;goukaku
+ごうぎ;gougi
+ごうけい;goukei
+ごうとう;goutou
+ごうどう;goudou
+ごうり;gouri
+ごうりゅう;gouryuu
+ごかい;gokai
+ごがく;gogaku
+ごく;goku
+ごくろうさま;gokurousama
+ごご;gogo
+ごじゅうおん;gojuuon
+ごぜん;gozen
+ごちそう;gochisou
+ごちそうさま;gochisousama
+ごと;goto
+ごはん;gohan
+ごぶさた;gobusata
+ごみ;gomi
+ごめん;gomen
+ごめんください;gomenkudasai
+ごめんなさい;gomennasai
+ごらく;goraku
+ごらん;goran
+さ;sa
+さあ;saa
+さい;sai
+さい;sai
+さい;sai
+さいきん;saikin
+さいこう;saikou
+さいご;saigo
+さいさん;saisan
+さいしゅう;saishuu
+さいしょ;saisho
+さいじつ;saijitsu
+さいそく;saisoku
+さいちゅう;saichuu
+さいてい;saitei
+さいてん;saiten
+さいなん;sainan
+さいのう;sainou
+さいばん;saiban
+さいふ;saifu
+さいほう;saihou
+さいわい;saiwai
+さか;saka
+さかい;sakai
+さかさ;sakasa
+さかさま;sakasama
+さかずき;sakazuki
+さかのぼる;sakanoboru
+さかば;sakaba
+さからう;sakarau
+さかり;sakari
+さかる;sakaru
+さかん;sakan
+さが;saga
+さがす;sagasu
+さがす;sagasu
+さがる;sagaru
+さき;saki
+さきおととい;sakiototoi
+さきほど;sakihodo
+さぎょう;sagyou
+さく;saku
+さく;saku
+さく;saku
+さくいん;sakuin
+さくしゃ;sakusha
+さくじょ;sakujo
+さくせい;sakusei
+さくひん;sakuhin
+さくぶつ;sakubutsu
+さくぶん;sakubun
+さくら;sakura
+さぐる;saguru
+さけ;sake
+さけぶ;sakebu
+さける;sakeru
+さげる;sageru
+ささえる;sasaeru
+ささやく;sasayaku
+ささる;sasaru
+さしあげる;sashiageru
+さしつかえ;sashitsukae
+さしひく;sashihiku
+さしみ;sashimi
+さじ;saji
+さす;sasu
+さす;sasu
+さす;sasu
+さす;sasu
+さす;sasu
+さすが;sasuga
+さそう;sasou
+さっか;sakka
+さっき;sakki
+さっきょく;sakkyoku
+さっさと;sassato
+さっそく;sassoku
+さっぱり;sappari
+さつ;satsu
+さつ;satsu
+さつえい;satsuei
+さて;sate
+さとう;satou
+さばく;sabaku
+さび;sabi
+さびしい;sabishii
+さびる;sabiru
+さべつ;sabetsu
+さほう;sahou
+さま;sama
+さまざま;samazama
+さます;samasu
+さます;samasu
+さまたげる;samatageru
+さむい;samui
+さめる;sameru
+さめる;sameru
+さゆう;sayuu
+さようなら;sayounara
+さら;sara
+さらいげつ;saraigetsu
+さらいしゅう;saraishuu
+さらいねん;sarainen
+さらに;sarani
+さる;saru
+さる;saru
+さわがしい;sawagashii
+さわぎ;sawagi
+さわやか;sawayaka
+さわる;sawaru
+さん;san
+さん;san
+さんか;sanka
+さんかく;sankaku
+さんぎょう;sangyou
+さんこう;sankou
+さんすう;sansuu
+さんせい;sansei
+さんせい;sansei
+さんそ;sanso
+さんち;sanchi
+さんぽ;sanpo
+さんりん;sanrin
+ざいがく;zaigaku
+ざいさん;zaisan
+ざいもく;zaimoku
+ざいりょう;zairyou
+ざしき;zashiki
+ざせき;zaseki
+ざっし;zasshi
+ざっと;zatto
+ざつおん;zatsuon
+ざぶとん;zabuton
+ざんねん;zannen
+し;shi
+し;shi
+し;shi
+しあい;shiai
+しあがる;shiagaru
+しあさって;shiasatte
+しあわせ;shiawase
+しいんと;shiinto
+しおからい;shiokarai
+しかい;shikai
+しかく;shikaku
+しかくい;shikakui
+しかし;shikashi
+しかた;shikata
+しかたがない;shikataganai
+しかも;shikamo
+しかる;shikaru
+しき;shiki
+しき;shiki
+しきち;shikichi
+しきゅう;shikyuu
+しきゅう;shikyuu
+しきりに;shikirini
+しく;shiku
+しけん;shiken
+しげき;shigeki
+しげる;shigeru
+しげん;shigen
+しごと;shigoto
+ししゃごにゅう;shishagonyuu
+ししゅつ;shishutsu
+しじ;shiji
+しじゅう;shijuu
+しじん;shijin
+しずか;shizuka
+しずまる;shizumaru
+しずむ;shizumu
+しせい;shisei
+しぜん;shizen
+しぜんかがく;shizenkagaku
+しそう;shisou
+しそん;shison
+した;shita
+した;shita
+したい;shitai
+したがう;shitagau
+したがき;shitagaki
+したがって;shitagatte
+したぎ;shitagi
+したく;shitaku
+したしい;shitashii
+したためる;shitatameru
+したまち;shitamachi
+しだい;shidai
+しち;shichi
+しっかり;shikkari
+しっき;shikki
+しっぱい;shippai
+しっぴつ;shippitsu
+しっぽ;shippo
+しつ;shitsu
+しつ;shitsu
+しつぎょう;shitsugyou
+しつこい;shitsukoi
+しつど;shitsudo
+しつぼう;shitsubou
+しつもん;shitsumon
+しつれい;shitsurei
+しつれいしました;shitsureishimashita
+しつれん;shitsuren
+してい;shitei
+してつ;shitetsu
+してん;shiten
+しどう;shidou
+しな;shina
+しなもの;shinamono
+しぬ;shinu
+しはい;shihai
+しはらい;shiharai
+しはらう;shiharau
+しばい;shibai
+しばしば;shibashiba
+しばふ;shibafu
+しばらく;shibaraku
+しばる;shibaru
+しゃべる;shaberu
+しゃらく;sharaku
+しゃりん;sharin
+しゅ;shu
+しゅう;shuu
+しゅう;shuu
+しゅう;shuu
+しゅうい;shuui
+しゅうかい;shuukai
+しゅうかく;shuukaku
+しゅうかん;shuukan
+しゅうかん;shuukan
+しゅうきょう;shuukyou
+しゅうきん;shuukin
+しゅうごう;shuugou
+しゅうしょく;shuushoku
+しゅうじ;shuuji
+しゅうせい;shuusei
+しゅうぜん;shuuzen
+しゅうだん;shuudan
+しゅうちゅう;shuuchuu
+しゅうてん;shuuten
+しゅうにゅう;shuunyuu
+しゅうにん;shuunin
+しゅうへん;shuuhen
+しゅうり;shuuri
+しゅうりょう;shuuryou
+しゅぎ;shugi
+しゅくしょう;shukushou
+しゅくじつ;shukujitsu
+しゅくだい;shukudai
+しゅくはく;shukuhaku
+しゅご;shugo
+しゅしょう;shushou
+しゅじゅつ;shujutsu
+しゅだん;shudan
+しゅちょう;shuchou
+しゅっきん;shukkin
+しゅっしん;shusshin
+しゅっせき;shusseki
+しゅっちょう;shucchou
+しゅっぱつ;shuppatsu
+しゅっぱん;shuppan
+しゅつじょう;shutsujou
+しゅと;shuto
+しゅふ;shufu
+しゅみ;shumi
+しゅやく;shuyaku
+しゅよう;shuyou
+しゅるい;shurui
+しゅんかん;shunkan
+しょ;sho
+しょい;shoi
+しょう;shou
+しょう;shou
+しょう;shou
+しょう;shou
+しょう;shou
+しょう;shou
+しょうか;shouka
+しょうかい;shoukai
+しょうがい;shougai
+しょうがくきん;shougakukin
+しょうがくせい;shougakusei
+しょうがっこう;shougakkou
+しょうがつ;shougatsu
+しょうきょくてき;shoukyokuteki
+しょうきん;shoukin
+しょうぎ;shougi
+しょうぎょう;shougyou
+しょうこう;shoukou
+しょうご;shougo
+しょうしゃ;shousha
+しょうしょう;shoushou
+しょうじ;shouji
+しょうじき;shoujiki
+しょうじょう;shoujou
+しょうじる;shoujiru
+しょうすう;shousuu
+しょうせつ;shousetsu
+しょうたい;shoutai
+しょうち;shouchi
+しょうてん;shouten
+しょうてん;shouten
+しょうとつ;shoutotsu
+しょうどく;shoudoku
+しょうにん;shounin
+しょうねん;shounen
+しょうはい;shouhai
+しょうばい;shoubai
+しょうひ;shouhi
+しょうひん;shouhin
+しょうひん;shouhin
+しょうぶ;shoubu
+しょうべん;shouben
+しょうぼう;shoubou
+しょうぼうしょ;shoubousho
+しょうみ;shoumi
+しょうめい;shoumei
+しょうめん;shoumen
+しょうゆ;shouyu
+しょうらい;shourai
+しょうりゃく;shouryaku
+しょきゅう;shokyuu
+しょく;shoku
+しょくえん;shokuen
+しょくぎょう;shokugyou
+しょくじ;shokuji
+しょくたく;shokutaku
+しょくどう;shokudou
+しょくにん;shokunin
+しょくば;shokuba
+しょくひん;shokuhin
+しょくぶつ;shokubutsu
+しょくもつ;shokumotsu
+しょくよく;shokuyoku
+しょくりょう;shokuryou
+しょさい;shosai
+しょしょ;shosho
+しょじゅん;shojun
+しょせき;shoseki
+しょっき;shokki
+しょてん;shoten
+しょどう;shodou
+しょほ;shoho
+しょめい;shomei
+しょもつ;shomotsu
+しょり;shori
+しょるい;shorui
+しよう;shiyou
+しらが;shiraga
+しらせ;shirase
+しらせる;shiraseru
+しらべる;shiraberu
+しり;shiri
+しりあい;shiriai
+しりぞく;shirizoku
+しりぞける;shirizokeru
+しりつ;shiritsu
+しりょう;shiryou
+しる;shiru
+しる;shiru
+しろ;shiro
+しろ;shiro
+しろ;shiro
+しろい;shiroi
+しろうと;shirouto
+しわ;shiwa
+しん;shin
+しん;shin
+しんかんせん;shinkansen
+しんがく;shingaku
+しんがり;shingari
+しんくう;shinkuu
+しんけい;shinkei
+しんけん;shinken
+しんこう;shinkou
+しんこく;shinkoku
+しんごう;shingou
+しんさつ;shinsatsu
+しんしん;shinshin
+しんじゅう;shinjuu
+しんじる;shinjiru
+しんずる;shinzuru
+しんせき;shinseki
+しんせつ;shinsetsu
+しんせん;shinsen
+しんぞう;shinzou
+しんだい;shindai
+しんだん;shindan
+しんちょう;shinchou
+しんにゅう;shinnyuu
+しんばん;shinban
+しんぱい;shinpai
+しんぶん;shinbun
+しんぽ;shinpo
+しんめんもく;shinmenmoku
+しんや;shin_ya
+しんゆう;shin_yuu
+しんよう;shin_you
+しんらい;shinrai
+しんり;shinri
+しんりん;shinrin
+しんるい;shinrui
+しんろ;shinro
+しんわ;shinwa
+じいん;jiin
+じえい;jiei
+じかた;jikata
+じかに;jikani
+じかん;jikan
+じかんわり;jikanwari
+じき;jiki
+じき;jiki
+じけん;jiken
+じこ;jiko
+じこく;jikoku
+じさつ;jisatsu
+じさん;jisan
+じしゃく;jishaku
+じしゅう;jishuu
+じしょ;jisho
+じしん;jishin
+じしん;jishin
+じしん;jishin
+じじつ;jijitsu
+じじょう;jijou
+じそく;jisoku
+じたい;jitai
+じたく;jitaku
+じだい;jidai
+じち;jichi
+じっかん;jikkan
+じっけん;jikken
+じっこう;jikkou
+じっさい;jissai
+じっし;jisshi
+じっしゅう;jisshuu
+じっせき;jisseki
+じっと;jitto
+じっぷん;jippun
+じつ;jitsu
+じつげん;jitsugen
+じつに;jitsuni
+じつは;jitsuha
+じつぶつ;jitsubutsu
+じつよう;jitsuyou
+じつりょく;jitsuryoku
+じつれい;jitsurei
+じてん;jiten
+じてんしゃ;jitensha
+じどう;jidou
+じどう;jidou
+じどうしゃ;jidousha
+じばん;jiban
+じびき;jibiki
+じぶん;jibun
+じまん;jiman
+じみ;jimi
+じむ;jimu
+じめん;jimen
+じゃくてん;jakuten
+じゃぐち;jaguchi
+じゃま;jama
+じゃんけん;janken
+じゅう;juu
+じゅうきょ;juukyo
+じゅうし;juushi
+じゅうしょ;juusho
+じゅうたい;juutai
+じゅうたい;juutai
+じゅうたく;juutaku
+じゅうたん;juutan
+じゅうだい;juudai
+じゅうてん;juuten
+じゅうみん;juumin
+じゅうよう;juuyou
+じゅうりょう;juuryou
+じゅうりょく;juuryoku
+じゅぎょう;jugyou
+じゅくご;jukugo
+じゅけん;juken
+じゅつご;jutsugo
+じゅみょう;jumyou
+じゅよう;juyou
+じゅわき;juwaki
+じゅん;jun
+じゅんかん;junkan
+じゅんさ;junsa
+じゅんじゅん;junjun
+じゅんじょ;junjo
+じゅんじょう;junjou
+じゅんすい;junsui
+じゅんちょう;junchou
+じゅんばん;junban
+じゆう;jiyuu
+じょ;jo
+じょう;jou
+じょう;jou
+じょうかく;joukaku
+じょうき;jouki
+じょうきゅう;joukyuu
+じょうきょう;joukyou
+じょうきょう;joukyou
+じょうぎ;jougi
+じょうけん;jouken
+じょうしき;joushiki
+じょうしゃ;jousha
+じょうじゅん;joujun
+じょうたい;joutai
+じょうたつ;joutatsu
+じょうだん;joudan
+じょうとう;joutou
+すいぶん;suibun
+すいへい;suihei
+すいへいせん;suiheisen
+すいみん;suimin
+すいめん;suimen
+すいよう;suiyou
+すう;suu
+すうがく;suugaku
+すうじ;suuji
+すえっこ;suekko
+すがた;sugata
+すき;suki
+すききらい;sukikirai
+すきずき;sukizuki
+すきとおる;sukitooru
+すきま;sukima
+すぎ;sugi
+すぎ;sugi
+すぎる;sugiru
+すくう;sukuu
+すくない;sukunai
+すくなくとも;sukunakutomo
+すぐ;sugu
+すぐれる;sugureru
+すこし;sukoshi
+すこしも;sukoshimo
+すごい;sugoi
+すごす;sugosu
+すじ;suji
+すすむ;susumu
+すすめる;susumeru
+すすめる;susumeru
+すず;suzu
+すずしい;suzushii
+すずむ;suzumu
+すっかり;sukkari
+すっきり;sukkiri
+すっと;sutto
+すっぱい;suppai
+すてき;suteki
+すてる;suteru
+すでに;sudeni
+すな;suna
+すなお;sunao
+すなわち;sunawachi
+すばらしい;subarashii
+すべて;subete
+すべる;suberu
+すまい;sumai
+すませる;sumaseru
+すまない;sumanai
+すみ;sumi
+すみ;sumi
+すみません;sumimasen
+すむ;sumu
+すむ;sumu
+すむ;sumu
+すめらぎ;sumeragi
+すもう;sumou
+すり;suri
+する;suru
+する;suru
+する;suru
+すると;suruto
+するどい;surudoi
+すれちがう;surechigau
+すわる;suwaru
+すんぽう;sunpou
+ず;zu
+ずいひつ;zuihitsu
+ずいぶん;zuibun
+ずうずうしい;zuuzuushii
+ずかん;zukan
+ずけい;zukei
+ずっと;zutto
+ずつう;zutsuu
+ずのう;zunou
+ずひょう;zuhyou
+ずらす;zurasu
+ずるい;zurui
+ずれる;zureru
+せい;sei
+せい;sei
+せい;sei
+せい;sei
+せいかく;seikaku
+せいかく;seikaku
+せいかつ;seikatsu
+せいき;seiki
+せいきゅう;seikyuu
+せいけつ;seiketsu
+せいげん;seigen
+せいこう;seikou
+せいさく;seisaku
+せいさん;seisan
+せいしき;seishiki
+せいしつ;seishitsu
+せいしょ;seisho
+せいしょうねん;seishounen
+せいしん;seishin
+せいじ;seiji
+せいじん;seijin
+せいすう;seisuu
+せいせき;seiseki
+せいぜい;seizei
+せいそう;seisou
+せいぞう;seizou
+せいぞん;seizon
+せいちょう;seichou
+せいと;seito
+せいとう;seitou
+せいど;seido
+せいねん;seinen
+せいねんがっぴ;seinengappi
+せいのう;seinou
+せいひん;seihin
+せいび;seibi
+せいふ;seifu
+せいぶつ;seibutsu
+せいぶん;seibun
+せいべつ;seibetsu
+せいほうけい;seihoukei
+せいめい;seimei
+せいもん;seimon
+せいよう;seiyou
+せいり;seiri
+せいりつ;seiritsu
+せいれき;seireki
+せかい;sekai
+せき;seki
+せき;seki
+せきたん;sekitan
+せきどう;sekidou
+せきにん;sekinin
+せきゆ;sekiyu
+せけん;seken
+せっかく;sekkaku
+せっきょくてき;sekkyokuteki
+せっきん;sekkin
+せっけい;sekkei
+せっけん;sekken
+せっする;sessuru
+せつ;setsu
+せつ;setsu
+せつぞく;setsuzoku
+せつび;setsubi
+せつめい;setsumei
+せつやく;setsuyaku
+せともの;setomono
+せなか;senaka
+せびろ;sebiro
+せまい;semai
+せまる;semaru
+せめ;seme
+せめる;semeru
+せめる;semeru
+せりふ;serifu
+せわ;sewa
+せん;sen
+せん;sen
+せん;sen
+せん;sen
+せんこう;senkou
+せんざい;senzai
+せんしゅ;senshu
+せんじつ;senjitsu
+せんす;sensu
+せんすい;sensui
+せんせい;sensei
+せんせい;sensei
+せんせんげつ;sensengetsu
+せんせんしゅう;sensenshuu
+せんそう;sensou
+せんぞ;senzo
+せんたく;sentaku
+せんたく;sentaku
+せんたん;sentan
+せんでん;senden
+せんとう;sentou
+せんぱい;senpai
+せんぷうき;senpuuki
+せんめん;senmen
+せんろ;senro
+ぜいかん;zeikan
+ぜいきん;zeikin
+ぜいたく;zeitaku
+ぜったい;zettai
+ぜつめつ;zetsumetsu
+ぜひ;zehi
+ぜひとも;zehitomo
+ぜん;zen
+ぜん;zen
+ぜんいん;zen_in
+ぜんこく;zenkoku
+ぜんご;zengo
+ぜんしゃ;zensha
+ぜんしゅう;zenshuu
+ぜんしん;zenshin
+ぜんしん;zenshin
+ぜんぜん;zenzen
+ぜんたい;zentai
+ぜんぱん;zenpan
+ぜんぶ;zenbu
+ぜんりょく;zenryoku
+そう;sou
+そう;sou
+そうい;soui
+そうおん;souon
+そうこ;souko
+そうご;sougo
+そうさ;sousa
+そうさく;sousaku
+そうしき;soushiki
+そうして;soushite
+そうじ;souji
+そうぞう;souzou
+そうぞうしい;souzoushii
+そうぞく;souzoku
+そうだん;soudan
+そうち;souchi
+そうとう;soutou
+そうべつ;soubetsu
+そうりだいじん;souridaijin
+そうりょう;souryou
+そくたつ;sokutatsu
+そくてい;sokutei
+そくど;sokudo
+そくりょう;sokuryou
+そくりょく;sokuryoku
+そこ;soko
+そこ;soko
+そこで;sokode
+そしき;soshiki
+そしつ;soshitsu
+そして;soshite
+そせん;sosen
+そそぐ;sosogu
+そそっかしい;sosokkashii
+そだつ;sodatsu
+そだてる;sodateru
+そちら;sochira
+そっくり;sokkuri
+そっちょく;socchoku
+そっと;sotto
+そつぎょう;sotsugyou
+そで;sode
+そと;soto
+そなえる;sonaeru
+その;sono
+そのうえ;sonoue
+そのうち;sonouchi
+そのため;sonotame
+そのほか;sonohoka
+そのまま;sonomama
+そば;soba
+そふ;sofu
+そぼ;sobo
+そぼく;soboku
+そまつ;somatsu
+それ;sore
+それから;sorekara
+それぞれ;sorezore
+それで;sorede
+それでは;soredeha
+それでも;soredemo
+それとも;soretomo
+それなら;sorenara
+それに;soreni
+それほど;sorehodo
+それる;soreru
+そろう;sorou
+そろえる;soroeru
+そろそろ;sorosoro
+そろばん;soroban
+そんがい;songai
+そんけい;sonkei
+そんざい;sonzai
+そんしつ;sonshitsu
+そんぞく;sonzoku
+そんちょう;sonchou
+そんとく;sontoku
+そんな;sonna
+ぞい;zoi
+ぞうか;zouka
+ぞうきん;zoukin
+ぞうげん;zougen
+ぞうせん;zousen
+ぞうだい;zoudai
+ぞうり;zouri
+ぞくする;zokusuru
+ぞくぞく;zokuzoku
+ぞんじる;zonjiru
+た;ta
+たい;tai
+たいいく;taiiku
+たいいん;taiin
+たいおん;taion
+たいかい;taikai
+たいきん;taikin
+たいくつ;taikutsu
+たいけい;taikei
+たいこ;taiko
+たいさく;taisaku
+たいざい;taizai
+たいし;taishi
+たいした;taishita
+たいして;taishite
+たいしょう;taishou
+たいしょう;taishou
+たいじゅう;taijuu
+たいする;taisuru
+たいせい;taisei
+たいせき;taiseki
+たいせつ;taisetsu
+たいせん;taisen
+たいそう;taisou
+たいてい;taitei
+たいど;taido
+たいはん;taihan
+たいふう;taifuu
+たいへん;taihen
+たいほ;taiho
+たいぼく;taiboku
+たいよう;taiyou
+たいら;taira
+たいりく;tairiku
+たいりつ;tairitsu
+たうえ;taue
+たえず;taezu
+たおす;taosu
+たおれる;taoreru
+たか;taka
+たかい;takai
+たかめる;takameru
+たから;takara
+たがい;tagai
+たがやす;tagayasu
+たき;taki
+たく;taku
+たく;taku
+たくさん;takusan
+たくわえる;takuwaeru
+たけ;take
+たしか;tashika
+たしか;tashika
+たしかめる;tashikameru
+たしょう;tashou
+たす;tasu
+たすかる;tasukaru
+たすける;tasukeru
+たずねる;tazuneru
+たずねる;tazuneru
+たたかい;tatakai
+たたかう;tatakau
+たたく;tataku
+たたむ;tatamu
+ただ;tada
+ただ;tada
+ただいま;tadaima
+ただし;tadashi
+ただしい;tadashii
+ただちに;tadachini
+たち;tachi
+たちあがる;tachiagaru
+たちどまる;tachidomaru
+たちば;tachiba
+たちまち;tachimachi
+たっする;tassuru
+たった;tatta
+たっぷり;tappuri
+たつ;tatsu
+たつ;tatsu
+たつ;tatsu
+たつ;tatsu
+たて;tate
+たてもの;tatemono
+たてる;tateru
+たてる;tateru
+たとえ;tatoe
+たとえば;tatoeba
+たとえる;tatoeru
+たな;tana
+たに;tani
+たのしい;tanoshii
+たのしみ;tanoshimi
+たのしむ;tanoshimu
+たのみ;tanomi
+たのむ;tanomu
+たのもしい;tanomoshii
+たば;taba
+たばこ;tabako
+たび;tabi
+たび;tabi
+たび;tabi
+たびたび;tabitabi
+たぶん;tabun
+たべる;taberu
+たま;tama
+たま;tama
+たまご;tamago
+たまたま;tamatama
+たまに;tamani
+たまらない;tamaranai
+たまる;tamaru
+ため;tame
+ためいき;tameiki
+ためし;tameshi
+ためし;tameshi
+ためす;tamesu
+ためらう;tamerau
+たより;tayori
+たよる;tayoru
+たりる;tariru
+たる;taru
+たれ;tare
+たん;tan
+たん;tan
+たんい;tan_i
+たんき;tanki
+たんこう;tankou
+たんご;tango
+たんしょ;tansho
+たんじゅん;tanjun
+たんじょう;tanjou
+たんす;tansu
+たんすい;tansui
+たんすう;tansuu
+たんとう;tantou
+たんなる;tannaru
+たんに;tanni
+たんぺん;tanpen
+だい;dai
+だい;dai
+だい;dai
+だいいち;daiichi
+だいがく;daigaku
+だいがくいん;daigakuin
+だいきん;daikin
+だいく;daiku
+だいしょう;daishou
+だいじょうぶ;daijoubu
+だいじん;daijin
+だいたい;daitai
+だいとうりょう;daitouryou
+だいどころ;daidokoro
+だいひょう;daihyou
+だいぶ;daibu
+だいぶぶん;daibubun
+だいめい;daimei
+だいめいし;daimeishi
+だいり;dairi
+だえん;daen
+だから;dakara
+だけど;dakedo
+だす;dasu
+だっせん;dassen
+だって;datte
+だとう;datou
+だます;damasu
+だまる;damaru
+だめ;dame
+だらけ;darake
+だらしない;darashinai
+だれか;dareka
+だん;dan
+だん;dan
+だんかい;dankai
+だんし;danshi
+だんすい;dansui
+だんせい;dansei
+だんたい;dantai
+だんだん;dandan
+だんち;danchi
+だんてい;dantei
+だんぼう;danbou
+ち;chi
+ち;chi
+ちい;chii
+ちいき;chiiki
+ちいさい;chiisai
+ちえ;chie
+ちか;chika
+ちかい;chikai
+ちかう;chikau
+ちかく;chikaku
+ちかごろ;chikagoro
+ちかすい;chikasui
+ちかづく;chikaduku
+ちかづける;chikadukeru
+ちかてつ;chikatetsu
+ちかよる;chikayoru
+ちから;chikara
+ちからづよい;chikaraduyoi
+ちがい;chigai
+ちがいない;chigainai
+ちがう;chigau
+ちきゅう;chikyuu
+ちぎる;chigiru
+ちく;chiku
+ちこく;chikoku
+ちしき;chishiki
+ちしつ;chishitsu
+ちじ;chiji
+ちじん;chijin
+ちず;chizu
+ちたい;chitai
+ちち;chichi
+ちちおや;chichioya
+ちちはは;chichihaha
+ちぢむ;chidimu
+ちぢめる;chidimeru
+ちぢれる;chidireru
+ちっとも;chittomo
+ちてん;chiten
+ちのう;chinou
+ちへいせん;chiheisen
+ちめい;chimei
+ちゃ;cha
+ちゃいろ;chairo
+ちゃく;chaku
+ちゃくちゃく;chakuchaku
+ちゃわん;chawan
+ちゃん;chan
+ちゃんと;chanto
+ちゅう;chuu
+ちゅう;chuu
+ちゅうい;chuui
+ちゅうおう;chuuou
+ちゅうかん;chuukan
+ちゅうかん;chuukan
+ちょきん;chokin
+ちょくご;chokugo
+ちょくせつ;chokusetsu
+ちょくせん;chokusen
+ちょくぜん;chokuzen
+ちょくつう;chokutsuu
+ちょくりゅう;chokuryuu
+ちょしゃ;chosha
+ちょぞう;chozou
+ちょっかく;chokkaku
+ちょっけい;chokkei
+ちょっと;chotto
+ちらかす;chirakasu
+ちらかる;chirakaru
+ちらす;chirasu
+ちり;chiri
+ちりがみ;chirigami
+ちる;chiru
+つい;tsui
+ついか;tsuika
+ついで;tsuide
+ついに;tsuini
+つう;tsuu
+つうか;tsuuka
+つうか;tsuuka
+つうがく;tsuugaku
+つうきん;tsuukin
+つうこう;tsuukou
+つうしん;tsuushin
+つうじる;tsuujiru
+つうち;tsuuchi
+つうちょう;tsuuchou
+つうやく;tsuuyaku
+つうよう;tsuuyou
+つうろ;tsuuro
+つかい;tsukai
+つかう;tsukau
+つかまえる;tsukamaeru
+つかまる;tsukamaru
+つかむ;tsukamu
+つかれ;tsukare
+つかれる;tsukareru
+つき;tsuki
+つき;tsuki
+つきあい;tsukiai
+つきあう;tsukiau
+つきあたり;tsukiatari
+つきあたる;tsukiataru
+つぎつぎ;tsugitsugi
+つく;tsuku
+つく;tsuku
+つく;tsuku
+つく;tsuku
+つく;tsuku
+つく;tsuku
+つくえ;tsukue
+つくる;tsukuru
+つくる;tsukuru
+つぐ;tsugu
+つけくわえる;tsukekuwaeru
+つける;tsukeru
+つける;tsukeru
+つける;tsukeru
+つける;tsukeru
+つける;tsukeru
+つごう;tsugou
+つたえる;tsutaeru
+つたわる;tsutawaru
+つち;tsuchi
+つちゅう;tsuchuu
+つっこむ;tsukkomu
+つつ;tsutsu
+つつみ;tsutsumi
+つづき;tsuduki
+つづく;tsuduku
+つづける;tsudukeru
+つとめ;tsutome
+つとめる;tsutomeru
+つとめる;tsutomeru
+つとめる;tsutomeru
+つな;tsuna
+つながり;tsunagari
+つながる;tsunagaru
+つなぐ;tsunagu
+つなげる;tsunageru
+つねに;tsuneni
+つばさ;tsubasa
+つぶ;tsubu
+つぶす;tsubusu
+つぶれる;tsubureru
+つま;tsuma
+つまずく;tsumazuku
+つまらない;tsumaranai
+つまり;tsumari
+つまる;tsumaru
+つみ;tsumi
+つむ;tsumu
+つめ;tsume
+つめたい;tsumetai
+つめる;tsumeru
+つもり;tsumori
+つもる;tsumoru
+つゆ;tsuyu
+つよい;tsuyoi
+つり;tsuri
+つりあう;tsuriau
+つる;tsuru
+つる;tsuru
+つるす;tsurusu
+つれ;tsure
+つれる;tsureru
+て;te
+てあらい;tearai
+てい;tei
+ていあん;teian
+ていいん;teiin
+ていか;teika
+ていか;teika
+ていき;teiki
+ていきけん;teikiken
+ていきゅうび;teikyuubi
+ていこう;teikou
+ていし;teishi
+ていし;teishi
+ていし;teishi
+ていしゃ;teisha
+ていしゅつ;teishutsu
+ていでん;teiden
+ていど;teido
+ていねい;teinei
+ていりゅうじょ;teiryuujo
+ていれ;teire
+てがみ;tegami
+てき;teki
+てきかく;tekikaku
+てきかく;tekikaku
+てきする;tekisuru
+てきせつ;tekisetsu
+てきとう;tekitou
+てきど;tekido
+てきよう;tekiyou
+てくび;tekubi
+てごろ;tegoro
+てじな;tejina
+てちょう;techou
+てっきょう;tekkyou
+てっきり;tekkiri
+てっこう;tekkou
+てっする;tessuru
+てってい;tettei
+てっぽう;teppou
+てつ;tetsu
+てつがく;tetsugaku
+てつだい;tetsudai
+てつだう;tetsudau
+てつづき;tetsuduki
+てつどう;tetsudou
+てつや;tetsuya
+てぬぐい;tenugui
+てぶくろ;tebukuro
+てま;tema
+てまえ;temae
+てら;tera
+てらす;terasu
+てる;teru
+てん;ten
+てん;ten
+てんいん;ten_in
+てんかい;tenkai
+てんき;tenki
+てんけい;tenkei
+てんこう;tenkou
+てんじょう;tenjou
+てんすう;tensuu
+てんてん;tenten
+てんてん;tenten
+てんねん;tennen
+てんらんかい;tenrankai
+で;de
+であい;deai
+であう;deau
+であう;deau
+でいり;deiri
+でいりぐち;deiriguchi
+でかける;dekakeru
+できあがり;dekiagari
+できあがる;dekiagaru
+できごと;dekigoto
+できる;dekiru
+できるだけ;dekirudake
+でぐち;deguchi
+でこぼこ;dekoboko
+ですから;desukara
+でたらめ;detarame
+では(でわ);deha(dewa)
+でむかえ;demukae
+でむかえる;demukaeru
+でも;demo
+でる;deru
+でんき;denki
+でんき;denki
+でんきゅう;denkyuu
+でんし;denshi
+でんしゃ;densha
+でんせん;densen
+でんせん;densen
+でんち;denchi
+でんちゅう;denchuu
+でんとう;dentou
+でんとう;dentou
+でんぱ;denpa
+でんぽう;denpou
+でんりゅう;denryuu
+でんりょく;denryoku
+でんわ;denwa
+と;to
+とい;toi
+といあわせ;toiawase
+とう;tou
+とう;tou
+とう;tou
+とうあん;touan
+とういつ;touitsu
+とうけい;toukei
+とうげ;touge
+とうざい;touzai
+とうしょ;tousho
+とうじ;touji
+とうじつ;toujitsu
+とうじょう;toujou
+とうだい;toudai
+とうちゃく;touchaku
+とうとう;toutou
+とうなん;tounan
+とうばん;touban
+とうひょう;touhyou
+とうぶん;toubun
+とうめい;toumei
+とうゆ;touyu
+とうよう;touyou
+とおい;tooi
+とおか;tooka
+とおく;tooku
+とおす;toosu
+とおり;toori
+とおりかかる;toorikakaru
+とおりすぎる;toorisugiru
+とおる;tooru
+とかい;tokai
+とかす;tokasu
+とがる;togaru
+とき;toki
+ときどき;tokidoki
+とく;toku
+とく;toku
+とくい;tokui
+とくしゅ;tokushu
+とくしょく;tokushoku
+とくちょう;tokuchou
+とくてい;tokutei
+とくばい;tokubai
+とくべつ;tokubetsu
+とけい;tokei
+とけこむ;tokekomu
+とける;tokeru
+とける;tokeru
+とこ;toko
+とこのま;tokonoma
+とこや;tokoya
+ところ;tokoro
+ところが;tokoroga
+ところで;tokorode
+とざん;tozan
+とし;toshi
+とし;toshi
+としつき;toshitsuki
+としょ;tosho
+としより;toshiyori
+としん;toshin
+とじょう;tojou
+とじる;tojiru
+とたん;totan
+とだな;todana
+とち;tochi
+とっきゅう;tokkyuu
+とっくに;tokkuni
+とつぜん;totsuzen
+とても;totemo
+ととのう;totonou
+とどく;todoku
+とどける;todokeru
+とどまる;todomaru
+とどまる;todomaru
+とどめる;todomeru
+とどめる;todomeru
+となり;tonari
+とにかく;tonikaku
+とばす;tobasu
+とばり;tobari
+とばり;tobari
+とびこむ;tobikomu
+とびだす;tobidasu
+とぶ;tobu
+とぶ;tobu
+とまる;tomaru
+とめる;tomeru
+とも;tomo
+ともかく;tomokaku
+ともしび;tomoshibi
+ともだち;tomodachi
+ともに;tomoni
+とら;tora
+とらえる;toraeru
+とり;tori
+とりあげる;toriageru
+とりいれる;toriireru
+とりかえる;torikaeru
+とりけす;torikesu
+とりだす;toridasu
+とりわけ;toriwake
+とる;toru
+とる;toru
+とる;toru
+とる;toru
+とれる;toreru
+とんでもない;tondemonai
+どう;dou
+どう;dou
+どういたしまして;douitashimashite
+どういつ;douitsu
+どうか;douka
+どうかく;doukaku
+どうぐ;dougu
+どうさ;dousa
+どうし;doushi
+どうして;doushite
+どうしても;doushitemo
+どうじ;douji
+どうせ;douse
+どうぞ;douzo
+どうぞよろしく;douzoyoroshiku
+どうとく;doutoku
+どうぶつ;doubutsu
+どうも;doumo
+どうよう;douyou
+どうよう;douyou
+どうりょう;douryou
+どうろ;douro
+どうわ;douwa
+どきどき;dokidoki
+どく;doku
+どくしょ;dokusho
+どくしん;dokushin
+どくとく;dokutoku
+どくりつ;dokuritsu
+どこ;doko
+どこか;dokoka
+どさん;dosan
+どちら;dochira
+どっと;dotto
+どなた;donata
+どなる;donaru
+どの;dono
+どよう;doyou
+どりょく;doryoku
+どれ;dore
+どれどれ;doredore
+どろ;doro
+どろぼう;dorobou
+どんどん;dondon
+どんな;donna
+どんなに;donnani
+どんぶり;donburi
+な;na
+ない;nai
+ないか;naika
+ないせん;naisen
+ないよう;naiyou
+なお;nao
+なおす;naosu
+なおす;naosu
+なおる;naoru
+なおる;naoru
+なか;naka
+なかなおり;nakanaori
+なかなか;nakanaka
+なかば;nakaba
+なかみ;nakami
+なかみ;nakami
+なかよし;nakayoshi
+ながい;nagai
+ながい;nagai
+ながす;nagasu
+ながびく;nagabiku
+ながめ;nagame
+ながめる;nagameru
+ながれ;nagare
+ながれる;nagareru
+なく;naku
+なく;naku
+なくす;nakusu
+なくす;nakusu
+なくなる;nakunaru
+なぐさめる;nagusameru
+なぐる;naguru
+なげる;nageru
+なさる;nasaru
+なし;nashi
+なす;nasu
+なぜ;naze
+なぜなら;nazenara
+なぞ;nazo
+なぞなぞ;nazonazo
+なっとく;nattoku
+なつ;natsu
+なつかしい;natsukashii
+なでる;naderu
+ななつ;nanatsu
+ななめ;naname
+なに;nani
+なにしろ;nanishiro
+なにぶん;nanibun
+なにも;nanimo
+なぬか;nanuka
+なべ;nabe
+なまいき;namaiki
+なまえ;namae
+なまける;namakeru
+なみ;nami
+なみき;namiki
+なみだ;namida
+なやむ;nayamu
+ならう;narau
+ならう;narau
+ならし;narashi
+ならす;narasu
+ならぶ;narabu
+ならべる;naraberu
+なる;naru
+なる;naru
+なる;naru
+なるべく;narubeku
+なるほど;naruhodo
+なれる;nareru
+なれる;nareru
+なわ;nawa
+なん;nan
+なんきょく;nankyoku
+なんて;nante
+なんで;nande
+なんでも;nandemo
+なんとか;nantoka
+なんとなく;nantonaku
+なんとも;nantomo
+なんべい;nanbei
+なんぼく;nanboku
+に;ni
+に;ni
+にあう;niau
+におい;nioi
+におう;niou
+にがい;nigai
+にがす;nigasu
+にがて;nigate
+にぎやか;nigiyaka
+にぎる;nigiru
+にく;niku
+にくい;nikui
+にくい;nikui
+にくむ;nikumu
+にくらしい;nikurashii
+にげる;nigeru
+にごる;nigoru
+にし;nishi
+にじ;niji
+にちじ;nichiji
+にちじょう;nichijou
+にちや;nichiya
+にちようひん;nichiyouhin
+にっか;nikka
+にっき;nikki
+にっこう;nikkou
+にっこり;nikkori
+にっちゅう;nicchuu
+にってい;nittei
+にっとう;nittou
+にっぽん;nippon
+ににん;ninin
+にぶい;nibui
+にもつ;nimotsu
+にゅういん;nyuuin
+にゅうがく;nyuugaku
+にゅうしゃ;nyuusha
+にゅうじょう;nyuujou
+にょうぼう;nyoubou
+にらむ;niramu
+にる;niru
+にる;niru
+にわ;niwa
+にわか;niwaka
+ねんれい;nenrei
+の;no
+のう;nou
+のうか;nouka
+のうぎょう;nougyou
+のうさんぶつ;nousanbutsu
+のうそん;nouson
+のうど;noudo
+のうみん;noumin
+のうやく;nouyaku
+のうりつ;nouritsu
+のうりょく;nouryoku
+のき;noki
+のこぎり;nokogiri
+のこす;nokosu
+のこらず;nokorazu
+のこり;nokori
+のこる;nokoru
+のせる;noseru
+のせる;noseru
+のぞく;nozoku
+のぞく;nozoku
+のぞみ;nozomi
+のぞむ;nozomu
+のど;nodo
+のばす;nobasu
+のばす;nobasu
+のびる;nobiru
+のびる;nobiru
+のべる;noberu
+のぼり;nobori
+のぼる;noboru
+のぼる;noboru
+のぼる;noboru
+のむ;nomu
+のり;nori
+のりかえ;norikae
+のりかえる;norikaeru
+のりこし;norikoshi
+のる;noru
+のる;noru
+のろのろ;noronoro
+のんき;nonki
+のんびり;nonbiri
+は;ha
+は;ha
+はい;hai
+はいいろ;haiiro
+はいく;haiku
+はいけん;haiken
+はいさら;haisara
+はいたつ;haitatsu
+はいゆう;haiyuu
+はう;hau
+はえる;haeru
+はか;haka
+はかせ;hakase
+はかり;hakari
+はかる;hakaru
+はかる;hakaru
+はかる;hakaru
+はがき;hagaki
+はがす;hagasu
+はきけ;hakike
+はきはき;hakihaki
+はく;haku
+はく;haku
+はく;haku
+はくしゅ;hakushu
+はくぶつかん;hakubutsukan
+はぐるま;haguruma
+はげしい;hageshii
+はこ;hako
+はこぶ;hakobu
+はさまる;hasamaru
+はさみ;hasami
+はさん;hasan
+はし;hashi
+はし;hashi
+はし;hashi
+はしら;hashira
+はしる;hashiru
+はじく;hajiku
+はじまり;hajimari
+はじまる;hajimaru
+はじめ;hajime
+はじめて;hajimete
+はじめまして;hajimemashite
+はじめる;hajimeru
+はす;hasu
+はず;hazu
+はずかしい;hazukashii
+はずす;hazusu
+はずれる;hazureru
+はた;hata
+はた;hata
+はたけ;hatake
+はたして;hatashite
+はたち;hatachi
+はたらき;hataraki
+はたらく;hataraku
+はだ;hada
+はだか;hadaka
+はだぎ;hadagi
+はち;hachi
+はち;hachi
+はっき;hakki
+はっきり;hakkiri
+はっけん;hakken
+はっこう;hakkou
+はっしゃ;hassha
+はっしゃ;hassha
+はっそう;hassou
+はったつ;hattatsu
+はってん;hatten
+はっぴょう;happyou
+はつ;hatsu
+はつ;hatsu
+はついく;hatsuiku
+はつおん;hatsuon
+はつか;hatsuka
+はつでん;hatsuden
+はつばい;hatsubai
+はつめい;hatsumei
+はで;hade
+はな;hana
+はな;hana
+はなし;hanashi
+はなしあい;hanashiai
+はなしあう;hanashiau
+はなしかける;hanashikakeru
+はなしちゅう;hanashichuu
+はなす;hanasu
+はなす;hanasu
+はなす;hanasu
+はなはだしい;hanahadashii
+はなばなしい;hanabanashii
+はなび;hanabi
+はなみ;hanami
+はなやか;hanayaka
+はなよめ;hanayome
+はなれる;hanareru
+はなれる;hanareru
+はね;hane
+はねる;haneru
+はは;haha
+ははおや;hahaoya
+はば;haba
+はぶく;habuku
+はへん;hahen
+はみがき;hamigaki
+はめる;hameru
+はやい;hayai
+はやい;hayai
+はやくち;hayakuchi
+はやし;hayashi
+はやり;hayari
+はやる;hayaru
+はら;hara
+はらいこむ;haraikomu
+はらいもどす;haraimodosu
+はらう;harau
+はり;hari
+はりがね;harigane
+はりきる;harikiru
+はる;haru
+はる;haru
+はる;haru
+はれ;hare
+はれる;hareru
+はん;han
+はんい;han_i
+はんえい;han_ei
+はんけい;hankei
+はんこ;hanko
+はんこう;hankou
+はんざい;hanzai
+はんじ;hanji
+はんせい;hansei
+はんたい;hantai
+はんだん;handan
+はんとう;hantou
+はんにん;hannin
+はんばい;hanbai
+はんぶん;hanbun
+ば;ba
+ばあい;baai
+ばい;bai
+ばいてん;baiten
+ばいばい;baibai
+ばか;baka
+ばからしい;bakarashii
+ばくだい;bakudai
+ばくはつ;bakuhatsu
+ばしょ;basho
+ばち;bachi
+ばっする;bassuru
+ばったり;battari
+ばね;bane
+ばめん;bamen
+ばん;ban
+ばん;ban
+ばん;ban
+ばんぐみ;bangumi
+ばんごう;bangou
+ばんざい;banzai
+ばんち;banchi
+ばんめ;banme
+ひ;hi
+ひ;hi
+ひ;hi
+ひ;hi
+ひえる;hieru
+ひかく;hikaku
+ひかくてき;hikakuteki
+ひかげ;hikage
+ひかり;hikari
+ひかる;hikaru
+ひがい;higai
+ひがえり;higaeri
+ひき;hiki
+ひきうける;hikiukeru
+ひきかえす;hikikaesu
+ひきざん;hikizan
+ひきだし;hikidashi
+ひきだす;hikidasu
+ひきとめる;hikitomeru
+ひきょう;hikyou
+ひきわけ;hikiwake
+ひく;hiku
+ひく;hiku
+ひくい;hikui
+ひけつ;hiketsu
+ひげ;hige
+ひげき;higeki
+ひこう;hikou
+ひこうじょう;hikoujou
+ひさしぶり;hisashiburi
+ひざ;hiza
+ひざし;hizashi
+ひじ;hiji
+ひじょう;hijou
+ひだり;hidari
+ひっかかる;hikkakaru
+ひっかける;hikkakeru
+ひっき;hikki
+ひっくりかえす;hikkurikaesu
+ひっくりかえる;hikkurikaeru
+ひっこし;hikkoshi
+ひっこす;hikkosu
+ひっこむ;hikkomu
+ひっし;hisshi
+ひっしゃ;hissha
+ひっぱる;hipparu
+ひつじ;hitsuji
+ひつじゅひん;hitsujuhin
+ひつよう;hitsuyou
+ひてい;hitei
+ひとごみ;hitogomi
+ひとさしゆび;hitosashiyubi
+ひとしい;hitoshii
+ひとすき;hitosuki
+ひとつ;hitotsu
+ひととおり;hitotoori
+ひとどおり;hitodoori
+ひとまず;hitomazu
+ひとみ;hitomi
+ひとやすみ;hitoyasumi
+ひとり;hitori
+ひとりごと;hitorigoto
+ひとりでに;hitorideni
+ひとりひとり;hitorihitori
+ひどい;hidoi
+ひにく;hiniku
+ひにち;hinichi
+ひねる;hineru
+ひのいり;hinoiri
+ひので;hinode
+ひはん;hihan
+ひひょう;hihyou
+ひび;hibi
+ひびき;hibiki
+ひびく;hibiku
+ひふ;hifu
+ひみつ;himitsu
+ひも;himo
+ひゃく;hyaku
+ひゃっかじてん;hyakkajiten
+ひゃっかじてん;hyakkajiten
+ひやす;hiyasu
+ひょうか;hyouka
+ひょうげん;hyougen
+ひょうご;hyougo
+ひょうし;hyoushi
+ひょうしき;hyoushiki
+ひょうじゅん;hyoujun
+ひょうじょう;hyoujou
+ひょうばん;hyouban
+ひょうほん;hyouhon
+ひょうめん;hyoumen
+ひょうろん;hyouron
+ひよう;hiyou
+ひらがな;hiragana
+ひらく;hiraku
+ひる;hiru
+ひるね;hirune
+ひろい;hiroi
+ひろう;hirou
+ひろがる;hirogaru
+ひろげる;hirogeru
+ひろさ;hirosa
+ひろば;hiroba
+ひろびろ;hirobiro
+ひろめる;hiromeru
+びじん;bijin
+びっくり;bikkuri
+びみょう;bimyou
+びょう;byou
+びょういん;byouin
+びょうき;byouki
+びょうどう;byoudou
+びよう;biyou
+びん;bin
+びんせん;binsen
+びんづめ;bindume
+ぴかぴか;pikapika
+ぴったり;pittari
+ふ;fu
+ふあん;fuan
+ふうけい;fuukei
+ふうせん;fuusen
+ふうぞく;fuuzoku
+ふうとう;fuutou
+ふうふ;fuufu
+ふうん;fuun
+ふえ;fue
+ふえる;fueru
+ふえる;fueru
+ふか;fuka
+ふかい;fukai
+ふかまる;fukamaru
+ふきそく;fukisoku
+ふきゅう;fukyuu
+ふきん;fukin
+ふく;fuku
+ふく;fuku
+ふく;fuku
+ふくざつ;fukuzatsu
+ふくし;fukushi
+ふくしゃ;fukusha
+ふくしゅう;fukushuu
+ふくすう;fukusuu
+ふくそう;fukusou
+ふくむ;fukumu
+ふくめる;fukumeru
+ふくらます;fukuramasu
+ふくらむ;fukuramu
+ふくろ;fukuro
+ふけつ;fuketsu
+ふける;fukeru
+ふける;fukeru
+ふこう;fukou
+ふごう;fugou
+ふさい;fusai
+ふさがる;fusagaru
+ふさぐ;fusagu
+ふざける;fuzakeru
+ふしぎ;fushigi
+ふじゆう;fujiyuu
+ふじん;fujin
+ふじん;fujin
+ふすま;fusuma
+ふせい;fusei
+ふせぐ;fusegu
+ふそく;fusoku
+ふぞく;fuzoku
+ふたご;futago
+ふたたび;futatabi
+ふたつ;futatsu
+ふだん;fudan
+ふつ;futsu
+ふつう;futsuu
+ふつう;futsuu
+ふつか;futsuka
+ふで;fude
+ふと;futo
+ふとい;futoi
+ふとう;futou
+ふとる;futoru
+ふとん;futon
+ふなびん;funabin
+ふね;fune
+ふね;fune
+ふびん;fubin
+ふぶき;fubuki
+ふへい;fuhei
+ふまん;fuman
+ふみ;fumi
+ふみきり;fumikiri
+ふむ;fumu
+ふもと;fumoto
+ふやす;fuyasu
+ふやす;fuyasu
+ふゆ;fuyu
+ふり;furi
+ふり;furi
+ふりがな;furigana
+ふりむく;furimuku
+ふりょう;furyou
+ふる;furu
+ふる;furu
+ふるい;furui
+ふるえる;furueru
+ふるまう;furumau
+ふれる;fureru
+ふろ;furo
+ふろしき;furoshiki
+ふん;fun
+ふんいき;fun_iki
+ふんか;funka
+ふんすい;funsui
+ぶ;bu
+ぶき;buki
+ぶさた;busata
+ぶし;bushi
+ぶしゅ;bushu
+ぶじ;buji
+ぶたい;butai
+ぶっか;bukka
+ぶっしつ;busshitsu
+ぶっそう;bussou
+ぶつ;butsu
+ぶつかる;butsukaru
+ぶつける;butsukeru
+ぶつぶつ;butsubutsu
+ぶつり;butsuri
+ぶひん;buhin
+ぶぶん;bubun
+ぶらさげる;burasageru
+ぶんか;bunka
+ぶんかい;bunkai
+ぶんがく;bungaku
+ぶんけん;bunken
+ぶんげい;bungei
+ぶんしょう;bunshou
+ぶんすう;bunsuu
+ぶんせき;bunseki
+ぶんたい;buntai
+ぶんたん;buntan
+ぶんぷ;bunpu
+ぶんぼうぐ;bunbougu
+ぶんぽう;bunpou
+ぶんみゃく;bunmyaku
+ぶんめい;bunmei
+ぶんや;bun_ya
+ぶんりょう;bunryou
+ぶんるい;bunrui
+へい;hei
+へいかい;heikai
+へいき;heiki
+へいこう;heikou
+へいじつ;heijitsu
+へいたい;heitai
+へいぼん;heibon
+へいや;heiya
+へいわ;heiwa
+へこむ;hekomu
+へそ;heso
+へた;heta
+へだたる;hedataru
+へだてる;hedateru
+へや;heya
+へらす;herasu
+へる;heru
+へる;heru
+へん;hen
+へん;hen
+へん;hen
+へん;hen
+へんか;henka
+へんこう;henkou
+へんしゅう;henshuu
+へんじ;henji
+べっそう;bessou
+べつ;betsu
+べつに;betsuni
+べつべつ;betsubetsu
+べんきょう;benkyou
+べんじょ;benjo
+べんとう;bentou
+べんり;benri
+ほう;hou
+ほう;hou
+ほうがく;hougaku
+ほうき;houki
+ほうげん;hougen
+ほうこう;houkou
+ほうこく;houkoku
+ほうしん;houshin
+ほうせき;houseki
+ほうそう;housou
+ほうそう;housou
+ほんとう;hontou
+ほんにん;honnin
+ほんの;honno
+ほんぶ;honbu
+ほんもの;honmono
+ほんやく;hon_yaku
+ほんらい;honrai
+ぼう;bou
+ぼう;bou
+ぼうえんきょう;bouenkyou
+ぼうけん;bouken
+ぼうさん;bousan
+ぼうし;boushi
+ぼうし;boushi
+ぼうだい;boudai
+ぼうはん;bouhan
+ぼうや;bouya
+ぼうりょく;bouryoku
+ぼくじょう;bokujou
+ぼくちく;bokuchiku
+ぼしゅう;boshuu
+ぼっちゃん;bocchan
+ぼろ;boro
+ぼん;bon
+ぼんち;bonchi
+まあ;maa
+まあまあ;maamaa
+まい;mai
+まいご;maigo
+まいすう;maisuu
+まいる;mairu
+まう;mau
+まかせる;makaseru
+まかなう;makanau
+まがる;magaru
+まき;maki
+まく;maku
+まく;maku
+まく;maku
+まくら;makura
+まけ;make
+まける;makeru
+まげる;mageru
+まご;mago
+まごまご;magomago
+まさか;masaka
+まさつ;masatsu
+まさに;masani
+まざる;mazaru
+まざる;mazaru
+まし;mashi
+まじる;majiru
+まじる;majiru
+ます;masu
+ますます;masumasu
+まず;mazu
+まずい;mazui
+まずしい;mazushii
+まぜる;mazeru
+まぜる;mazeru
+また;mata
+またぐ;matagu
+または;mataha
+まだ;mada
+まち;machi
+まちあいしつ;machiaishitsu
+まちあわせる;machiawaseru
+まちかど;machikado
+まちがい;machigai
+まちがう;machigau
+まちがえる;machigaeru
+まっか;makka
+まっくら;makkura
+まっくろ;makkuro
+まっさお;massao
+まっさき;massaki
+まっしろ;masshiro
+まっすぐ;massugu
+まったく;mattaku
+まつ;matsu
+まつ;matsu
+まつり;matsuri
+まつる;matsuru
+まとまる;matomaru
+まとめる;matomeru
+まど;mado
+まどぐち;madoguchi
+まなぶ;manabu
+まにあう;maniau
+まね;mane
+まねく;maneku
+まねる;maneru
+まぶしい;mabushii
+まぶた;mabuta
+まま;mama
+まめ;mame
+まもなく;mamonaku
+まもる;mamoru
+まよう;mayou
+まる;maru
+まるい;marui
+まるで;marude
+まれ;mare
+まわす;mawasu
+まわり;mawari
+まわりみち;mawarimichi
+まわる;mawaru
+まんいん;man_in
+まんが;manga
+まんぞく;manzoku
+まんてん;manten
+まんなか;mannaka
+まんねんひつ;mannenhitsu
+まんまえ;manmae
+まんまるい;manmarui
+み;mi
+み;mi
+みあげる;miageru
+みえる;mieru
+みおくり;miokuri
+みおくる;miokuru
+みおろす;miorosu
+みかけ;mikake
+みかずき;mikazuki
+みかた;mikata
+みかた;mikata
+みがく;migaku
+みぎ;migi
+みごと;migoto
+みさき;misaki
+みじかい;mijikai
+みじめ;mijime
+みず;mizu
+みずうみ;mizuumi
+みずから;mizukara
+みずぎ;mizugi
+みせや;miseya
+みせる;miseru
+みそ;miso
+みだし;midashi
+みち;michi
+みちじゅん;michijun
+みちる;michiru
+みっか;mikka
+みっつ;mittsu
+みっともない;mittomonai
+みつ;mitsu
+みつかる;mitsukaru
+みつける;mitsukeru
+みつめる;mitsumeru
+みどり;midori
+みな;mina
+みなおす;minaosu
+みなと;minato
+みなれる;minareru
+みにくい;minikui
+みのる;minoru
+みぶん;mibun
+みほん;mihon
+みまい;mimai
+みまう;mimau
+みまん;miman
+みみ;mimi
+みょう;myou
+みょうじ;myouji
+みらい;mirai
+みりょく;miryoku
+みる;miru
+みる;miru
+みんかん;minkan
+みんしゅ;minshu
+みんよう;min_you
+む;mu
+むいか;muika
+むかい;mukai
+むかう;mukau
+むかえ;mukae
+むかえる;mukaeru
+むかし;mukashi
+むき;muki
+むく;muku
+むく;muku
+むけ;muke
+むける;mukeru
+むげん;mugen
+むこう;mukou
+むし;mushi
+むし;mushi
+むしあつい;mushiatsui
+むしば;mushiba
+むしろ;mushiro
+むじ;muji
+むじゅん;mujun
+むす;musu
+むすう;musuu
+むすこ;musuko
+むすぶ;musubu
+むすめ;musume
+むずかしい;muzukashii
+むだ;muda
+むちゅう;muchuu
+むっつ;muttsu
+むね;mune
+むら;mura
+むらさき;murasaki
+むり;muri
+むりょう;muryou
+め;me
+め;me
+めい;mei
+めいかく;meikaku
+めいさく;meisaku
+めいし;meishi
+めいし;meishi
+めいしょ;meisho
+めいしん;meishin
+めいじる;meijiru
+めいじん;meijin
+めいずる;meizuru
+めいぶつ;meibutsu
+めいめい;meimei
+めいれい;meirei
+めいわく;meiwaku
+めうえ;meue
+めぐまれる;megumareru
+めぐる;meguru
+めざす;mezasu
+めざまし;mezamashi
+めし;meshi
+めしあがる;meshiagaru
+めした;meshita
+めじるし;mejirushi
+めずらしい;mezurashii
+めだつ;medatsu
+めちゃくちゃ;mechakucha
+めっきり;mekkiri
+めったに;mettani
+めでたい;medetai
+めまい;memai
+めやす;meyasu
+めん;men
+めんきょ;menkyo
+めんせき;menseki
+めんせつ;mensetsu
+めんぜい;menzei
+めんどう;mendou
+めんどうくさい;mendoukusai
+もう;mou
+もうかる;moukaru
+もうける;moukeru
+もうける;moukeru
+もうしあげる;moushiageru
+もうしこむ;moushikomu
+もうしわけ;moushiwake
+もうしわけない;moushiwakenai
+もうす;mousu
+もうふ;moufu
+もえる;moeru
+もくざい;mokuzai
+もくじ;mokuji
+もくてき;mokuteki
+もくひょう;mokuhyou
+もくよう;mokuyou
+もし;moshi
+もしかしたら;moshikashitara
+もしかすると;moshikasuruto
+もしも;moshimo
+もしもし;moshimoshi
+もじ;moji
+もたれる;motareru
+もち;mochi
+もちあげる;mochiageru
+もちいる;mochiiru
+もちろん;mochiron
+もったいない;mottainai
+もって;motte
+もっと;motto
+もっとも;mottomo
+もっとも;mottomo
+もつ;motsu
+もと;moto
+もとい;motoi
+もとづく;motoduku
+もとめる;motomeru
+もともと;motomoto
+もどす;modosu
+もどる;modoru
+もの;mono
+もの;mono
+ものおき;monooki
+ものおと;monooto
+ものがたり;monogatari
+ものがたる;monogataru
+ものごと;monogoto
+ものさし;monosashi
+ものすごい;monosugoi
+もむ;momu
+もも;momo
+もやす;moyasu
+もよう;moyou
+もよおし;moyooshi
+もらう;morau
+もり;mori
+もん;mon
+もんく;monku
+もんだい;mondai
+もんどう;mondou
+や;ya
+やおや;yaoya
+やかましい;yakamashii
+やかん;yakan
+やがて;yagate
+やぎょう;yagyou
+やく;yaku
+やく;yaku
+やくしゃ;yakusha
+やくしょ;yakusho
+やくす;yakusu
+やくそく;yakusoku
+やくだつ;yakudatsu
+やくにん;yakunin
+やくひん;yakuhin
+やくめ;yakume
+やくわり;yakuwari
+やける;yakeru
+やさい;yasai
+やさしい;yasashii
+やさしい;yasashii
+やしろ;yashiro
+やじるし;yajirushi
+やすい;yasui
+やすい;yasui
+やすみ;yasumi
+やすむ;yasumu
+やせる;yaseru
+やたらに;yatarani
+やちゅう;yachuu
+やちん;yachin
+やっかい;yakkai
+やっきょく;yakkyoku
+やっつ;yattsu
+やっつける;yattsukeru
+やっと;yatto
+やっぱり;yappari
+やとう;yatou
+やど;yado
+やね;yane
+やぶる;yaburu
+やぶれる;yabureru
+やま;yama
+やまい;yamai
+やむ;yamu
+やむ;yamu
+やむをえない;yamuwoenai
+やめる;yameru
+やや;yaya
+やる;yaru
+やわらかい;yawarakai
+やわらかい;yawarakai
+ゆ;yu
+ゆいいつ;yuiitsu
+ゆうえんち;yuuenchi
+ゆうかん;yuukan
+ゆうがた;yuugata
+ゆうき;yuuki
+ゆうこう;yuukou
+ゆうこう;yuukou
+ゆうしゅう;yuushuu
+ゆうしょう;yuushou
+ゆうじょう;yuujou
+ゆうじん;yuujin
+ゆうそう;yuusou
+ゆうだち;yuudachi
+ゆうのう;yuunou
+ゆうひ;yuuhi
+ゆうびん;yuubin
+ゆうべ;yuube
+ゆうめい;yuumei
+ゆうゆう;yuuyuu
+ゆうり;yuuri
+ゆうりょう;yuuryou
+ゆかい;yukai
+ゆかた;yukata
+ゆき;yuki
+ゆくえ;yukue
+ゆけつ;yuketsu
+ゆげ;yuge
+ゆしゅつ;yushutsu
+ゆずる;yuzuru
+ゆそう;yusou
+ゆたか;yutaka
+ゆだん;yudan
+ゆっくり;yukkuri
+ゆでる;yuderu
+ゆにゅう;yunyuu
+ゆのみ;yunomi
+ゆび;yubi
+ゆびわ;yubiwa
+ゆめ;yume
+ゆるい;yurui
+ゆるす;yurusu
+ゆれる;yureru
+よあけ;yoake
+よい;yoi
+よう;you
+よう;you
+ようい;youi
+ようい;youi
+ようか;youka
+ようがん;yougan
+ようき;youki
+ようき;youki
+ようきゅう;youkyuu
+ようご;yougo
+ようし;youshi
+ようじ;youji
+ようじ;youji
+ようじん;youjin
+ようす;yousu
+ようする;yousuru
+ようするに;yousuruni
+ようせき;youseki
+ようそ;youso
+ようち;youchi
+ようちえん;youchien
+ようてん;youten
+ようと;youto
+ようひんてん;youhinten
+ようび;youbi
+ようふく;youfuku
+ようぶん;youbun
+ようもう;youmou
+ようやく;youyaku
+ようりょう;youryou
+よき;yoki
+よく;yoku
+よくばり;yokubari
+よけい;yokei
+よこ;yoko
+よこぎる;yokogiru
+よこす;yokosu
+よさん;yosan
+よしゅう;yoshuu
+よす;yosu
+よせる;yoseru
+よそ;yoso
+よそく;yosoku
+よっか;yokka
+よっつ;yottsu
+よっぱらい;yopparai
+よつかど;yotsukado
+よてい;yotei
+よのなか;yononaka
+よび;yobi
+よびかける;yobikakeru
+よびだす;yobidasu
+よぶ;yobu
+よぶん;yobun
+よほう;yohou
+よぼう;yobou
+よみ;yomi
+よみがえる;yomigaeru
+よむ;yomu
+よめ;yome
+よやく;yoyaku
+よゆう;yoyuu
+より;yori
+よる;yoru
+よる;yoru
+よる;yoru
+よると;yoruto
+よろこび;yorokobi
+よろこぶ;yorokobu
+よろしい;yoroshii
+よろしく;yoroshiku
+よわい;yowai
+らい;rai
+らいにち;rainichi
+らく;raku
+らくだい;rakudai
+らん;ran
+らんぼう;ranbou
+りえき;rieki
+りか;rika
+りかい;rikai
+りがい;rigai
+りく;riku
+りこう;rikou
+りこん;rikon
+りそう;risou
+りっぱ;rippa
+りつ;ritsu
+りゃくす;ryakusu
+りゅう;ryuu
+りゅういき;ryuuiki
+りゅうがく;ryuugaku
+りゆう;riyuu
+りょう;ryou
+りょう;ryou
+りょう;ryou
+りょうがえ;ryougae
+りょうがわ;ryougawa
+りょうきん;ryoukin
+りょうし;ryoushi
+りょうしゅう;ryoushuu
+りょうじ;ryouji
+りょうり;ryouri
+りょかん;ryokan
+りょこう;ryokou
+りよう;riyou
+りん;rin
+りんじ;rinji
+るす;rusu
+るすばん;rusuban
+れい;rei
+れい;rei
+れいがい;reigai
+れいぎ;reigi
+れいせい;reisei
+れいぞうこ;reizouko
+れいてん;reiten
+れいとう;reitou
+れいぼう;reibou
+れきし;rekishi
+れっしゃ;ressha
+れっとう;rettou
+れつ;retsu
+れんが;renga
+れんごう;rengou
+れんしゅう;renshuu
+れんそう;rensou
+れんぞく;renzoku
+れんらく;renraku
+ろうか;rouka
+ろうじん;roujin
+ろうそく;rousoku
+ろうどう;roudou
+ろくおん;rokuon
+ろんじる;ronjiru
+ろんずる;ronzuru
+ろんそう;ronsou
+ろんぶん;ronbun
+わ;wa
+わえい;waei
+わかい;wakai
+わかす;wakasu
+わかる;wakaru
+わかれ;wakare
+わかれる;wakareru
+わかれる;wakareru
+わかわかしい;wakawakashii
+わが;waga
+わがまま;wagamama
+わき;waki
+わく;waku
+わく;waku
+わけ;wake
+わける;wakeru
+わざと;wazato
+わすれもの;wasuremono
+わすれる;wasureru
+わずか;wazuka
+わたす;watasu
+わたる;wataru
+わだい;wadai
+わびる;wabiru
+わふく;wafuku
+わらい;warai
+わらう;warau
+わりあい;wariai
+わりあいに;wariaini
+わりあて;wariate
+わりこむ;warikomu
+わりざん;warizan
+わりびき;waribiki
+わる;waru
+われる;wareru
+われわれ;wareware
+わん;wan
+わん;wan
+わん;wan
+アイスクリーム;aisukuriimu
+アイデア;aidea
+アイロン;airon
+アウト;auto
+アクセサリー;akusesarii
+アクセント;akusento
+アジア;ajia
+アナウンサー;anaunsaa
+アパート;apaato
+アフリカ;afurika
+アメリカ;amerika
+アルバイト;arubaito
+アルバム;arubamu
+アンテナ;antena
+イコール;ikooru
+イメージ;imeeji
+インク;inku
+インタビュー;intabyuu
+ウーマン;uuman
+ウール;uuru
+ウイスキー;uisukii
+ウェートレス;weetoresu
+エスカレーター;esukareetaa
+エチケット;echiketto
+エネルギー;enerugii
+エプロン;epuron
+エレベーター;erebeetaa
+エンジン;enjin
+オーケストラ;ookesutora
+オートバイ;ootobai
+オートメーション;ootomeeshon
+オイル;oiru
+オフィス;ofisu
+オルガン;orugan
+オレンジ;orenji
+カー;kaa
+カーテン;kaaten
+カード;kaado
+カーブ;kaabu
+カセット;kasetto
+カバー;kabaa
+カメラ;kamera
+カラー;karaa
+カレンダー;karendaa
+カロリー;karorii
+ガス;gasu
+ガソリン;gasorin
+ガソリンスタンド;gasorinsutando
+ガム;gamu
+ガラス;garasu
+キャプテン;kyaputen
+キャンパス;kyanpasu
+キャンプ;kyanpu
+キロ;kiro
+ギター;gitaa
+ギャング;gyangu
+クーラー;kuuraa
+クラス;kurasu
+クラブ;kurabu
+クリーニング;kuriiningu
+クリーム;kuriimu
+クリスマス;kurisumasu
+グラス;gurasu
+グラフ;gurafu
+グラム;guramu
+グランド;gurando
+グループ;guruupu
+ケーキ;keeki
+ケース;keesu
+ゲーム;geemu
+コース;koosu
+コーチ;koochi
+コート;kooto
+コード;koodo
+コーヒー;koohii
+コーラス;koorasu
+コック;kokku
+コップ;koppu
+コピー;kopii
+コミュニケーション;komyunikeeshon
+コレクション;korekushon
+コンクール;konkuuru
+コンクリート;konkuriito
+コンサート;konsaato
+コンセント;konsento
+コンピューター;konpyuutaa
+ゴム;gomu
+サークル;saakuru
+サービス;saabisu
+サイレン;sairen
+サイン;sain
+サラダ;sarada
+サラリーマン;sarariiman
+サンダル;sandaru
+サンドイッチ;sandoicchi
+サンプル;sanpuru
+シーズン;shiizun
+シーツ;shiitsu
+シャッター;shattaa
+シャツ;shatsu
+シャワー;shawaa
+ショップ;shoppu
+シリーズ;shiriizu
+ジーンズ;jiinzu
+ジェットき;jettoki
+ジャーナリスト;jaanarisuto
+ジャム;jamu
+ジュース;juusu
+スーツ;suutsu
+スーツケース;suutsukeesu
+スーパー;suupaa
+スープ;suupu
+スイッチ;suicchi
+スカート;sukaato
+スカーフ;sukaafu
+スキー;sukii
+スクール;sukuuru
+スケート;sukeeto
+スケジュール;sukejuuru
+スター;sutaa
+スタート;sutaato
+スタイル;sutairu
+スタンド;sutando
+スチュワーデス;suchuwaadesu
+ステージ;suteeji
+ステレオ;sutereo
+ストーブ;sutoobu
+ストッキング;sutokkingu
+ストップ;sutoppu
+スピーカー;supiikaa
+スピーチ;supiichi
+スピード;supiido
+スプーン;supuun
+スポーツ;supootsu
+スマート;sumaato
+スライド;suraido
+スリッパ;surippa
+ズボン;zubon
+セーター;seetaa
+セット;setto
+セメント;semento
+センター;sentaa
+センチ;senchi
+ゼミ;zemi
+ゼロ;zero
+ソファー;sofaa
+タイプ;taipu
+タイプライター;taipuraitaa
+タイヤ;taiya
+タオル;taoru
+タクシー;takushii
+ダイヤグラム;daiyaguramu
+ダイヤモンド;daiyamondo
+ダイヤル;daiyaru
+ダブる;daburu
+ダム;damu
+ダンス;dansu
+チーズ;chiizu
+チーム;chiimu
+チップ;chippu
+チャンス;chansu
+チョーク;chooku
+テーブル;teeburu
+テープ;teepu
+テープレコーダー;teepurekoodaa
+テーマ;teema
+テキスト;tekisuto
+テスト;tesuto
+テニス;tenisu
+テニスコート;tenisukooto
+テレビ;terebi
+テント;tento
+テンポ;tenpo
+デート;deeto
+デッサン;dessan
+デパート;depaato
+デモ;demo
+トイレ;toire
+トップ;toppu
+トラック;torakku
+トランプ;toranpu
+トレーニング;toreeningu
+トンネル;tonneru
+ドア;doa
+ドライブ;doraibu
+ドラマ;dorama
+ドレス;doresu
+ナイフ;naifu
+ナイロン;nairon
+ナンバー;nanbaa
+ニュース;nyuusu
+ネクタイ;nekutai
+ネックレス;nekkuresu
+ノート;nooto
+ノック;nokku
+ハイキング;haikingu
+ハンサム;hansamu
+ハンドバッグ;handobaggu
+ハンドル;handoru
+バイオリン;baiorin
+バケツ;baketsu
+バス;basu
+バター;bataa
+バック;bakku
+バッグ;baggu
+バランス;baransu
+バン;ban
+バンド;bando
+パーセント;paasento
+パーティー;paatii
+パイプ;paipu
+パイロット;pairotto
+パス;pasu
+パスポート;pasupooto
+パターン;pataan
+パンツ;pantsu
+ビール;biiru
+ビタミン;bitamin
+ビデオ;bideo
+ビニール;biniiru
+ビル;biru
+ピアノ;piano
+ピクニック;pikunikku
+ピストル;pisutoru
+ピン;pin
+ピンク;pinku
+ファスナー;fasunaa
+フィルム;firumu
+フォーク;fooku
+フライパン;furaipan
+フリー;furii
+ブラウス;burausu
+ブラシ;burashi
+ブレーキ;bureeki
+ブローチ;buroochi
+プール;puuru
+プラス;purasu
+プラスチック;purasuchikku
+プラットホーム;purattohoomu
+プラン;puran
+プリント;purinto
+プレゼント;purezento
+プロ;puro
+プログラム;puroguramu
+ヘリコプター;herikoputaa
+ベッド;beddo
+ベテラン;beteran
+ベル;beru
+ベルト;beruto
+ページ;peeji
+ペン;pen
+ペンキ;penki
+ペンチ;penchi
+ホーム;hoomu
+ホテル;hoteru
+ボーイ;booi
+ボート;booto
+ボーナス;boonasu
+ボール;booru
+ボールペン;boorupen
+ボタン;botan
+ポケット;poketto
+ポスター;posutaa
+ポスト;posuto
+マーケット;maaketto
+マイク;maiku
+マイナス;mainasu
+マスク;masuku
+マスター;masutaa
+マッチ;macchi
+マフラー;mafuraa
+ママ;mama
+マラソン;marason
+ミシン;mishin
+ミス;misu
+ミリ;miri
+ミルク;miruku
+メーター;meetaa
+メートル;meetoru
+メニュー;menyuu
+メモ;memo
+メンバー;menbaa
+モーター;mootaa
+モダン;modan
+モデル;moderu
+モノレール;monoreeru
+ユーモア;yuumoa
+ヨーロッパ;yooroppa
+ヨット;yotto
+ライター;raitaa
+ラケット;raketto
+ラジオ;rajio
+ラッシュアワー;rasshuawaa
+ランチ;ranchi
+リズム;rizumu
+リットル;rittoru
+リボン;ribon
+レインコート;reinkooto
+レクリエーション;rekurieeshon
+レコード;rekoodo
+レジャー;rejaa
+レストラン;resutoran
+レベル;reberu
+レポート;repooto
+レンズ;renzu
+ローマじ;roomaji
+ロケット;roketto
+ロッカー;rokkaa
+ロビー;robii
+ワイシャツ;waishatsu
+ワイン;wain
+ワンピース;wanpiisu
+だい;dai
+か;ka
+はやく;hayaku
+いく;iku
+わかる;wakaru
+へ(え);he(e)
+あつい;atsui
+ね;ne
+そう;sou
+れんしゅう;renshuu
+てん;ten
+か;ka
+みる;miru
+なん;nan
+を(お);wo(o)
+まだない;madanai
+いい;ii
+よ;yo
+ちょうしょく;choushoku
+おはようございます;ohayougozaimasu
+たべる;taberu
+パン;pan
+コーヒー;koohii
+のむ;nomu
+ビール;biiru
+りんご;ringo
+それでは(それでわ);soredeha(soredewa)
+たまご;tamago
+ぜいかん;zeikan
+カメラ;kamera
+もつ;motsu
+はい;hai
+ある;aru
+トランク;toranku
+なか;naka
+が;ga
+と;to
+ほん;hon
+ようふく;youfuku
+それ;sore
+だけ;dake
+さけ;sake
+けっこう;kekkou
+かいもの;kaimono
+デパート;depaato
+いっしょに;isshoni
+かう;kau
+くつした;kutsushita
+はいる;hairu
+ここ;koko
+でも;demo
+やめる;yameru
+しる;shiru
+タワー;tawaa
+から;kara
+どう;dou
+あるく;aruku
+えき;eki
+まで;made
+めぐろ;meguro
+しぶや;shibuya
+そこ;soko
+で;de
+とうきょう;toukyou
+それから;sorekara
+バス;basu
+すいぞくかん;suizokukan
+みせ;mise
+みやげ;miyage
+も;mo
+えいが;eiga
+きのう;kinou
+する;suru
+くる;kuru
+ともだち;tomodachi
+アメリカ;amerika
+めがね;megane
+わすれる;wasureru
+よく;yoku
+ちゅうかりょうり;chuukaryouri
+こんばん;konban
+だいすき;daisuki
+わたし;watashi
+さかな;sakana
+スープ;suupu
+とる;toru
+にく;niku
+はし;hashi
+いいえ;iie
+フォーク;fooku
+おねがいします;onegaishimasu
+ください;kudasai
+ありがとうございます;arigatougozaimasu
+とても;totemo
+テレビ;terebi
+すもう;sumou
+シーズン;shiizun
+よく;yoku
+ときどき;tokidoki
+ニュース;nyuusu
+ホーム・ドラマ;hoomu_dorama
+どちらも;dochiramo
+あさ;asa
+おきる;okiru
+じ;ji
+いち;ichi
+じゅう;juu
+おそい;osoi
+ねる;neru
+よる;yoru
+さん;san
+よなか;yonaka
+きょう;kyou
+それでも;soredemo
+バー;baa
+はたらく;hataraku
+たいへん;taihen
+こんにちは;konnichiha
+きっさてん;kissaten
+やまだ;yamada
+さん;san
+おかし;okashi
+ほんとう;hontou
+いま;ima
+ええ;ee
+ダイエット;daietto
+やくそく;yakusoku
+けさ;kesa
+フランス;furansu
+まえ;mae
+まつ;matsu
+どうしたのでしょう;doushitanodeshou
+こまる;komaru
+ドイツ;doitsu
+しょうかい;shoukai
+こばやし;kobayashi
+みちこ;michiko
+と;to
+すむ;sumu
+けっこん;kekkon
+ねん;nen
+いる;iru
+こども;kodomo
+ふたり;futari
+おとこのこ;otokonoko
+おんなのこ;onnanoko
+は(わ);ha(wa)
+ご;go
+さい;sai
+さいこん;saikon
+じつは(わ);jitsuha(wa)
+おぼっちゃん;obocchan
+にちようび;nichiyoubi
+ピクニック;pikunikku
+たなか;tanaka
+やまもと;yamamoto
+さそう;sasou
+かんがえ;kangae
+えのしま;enoshima
+サンドウイッチ;sandouicchi
+すし;sushi
+に;ni
+みかん;mikan
+ジュース;juusu
+ため;tame
+でんわをかける;denwawokakeru
+すぐ;sugu
+のみのいち;nominoichi
+その;sono
+はこ;hako
+みぎ;migi
+ひだり;hidari
+えん;en
+まん;man
+ごめんなさい;gomennasai
+ちょっと;chotto
+みせる;miseru
+ふるい;furui
+えど;edo
+もの;mono
+うら;ura
+ほんや;hon_ya
+せんそう;sensou
+へいわ;heiwa
+しょうしょう;shoushou
+にほん;nihon
+るす;rusu
+じぶん;jibun
+この;kono
+すすめる;susumeru
+つくる;tsukuru
+かんたん;kantan
+まいどありがとうございます;maidoarigatougozaimasu
+コンサート;konsaato
+だれ;dare
+ひと;hito
+しゃしん;shashin
+やまぐち;yamaguchi
+ふみこ;fumiko
+じょゆう;joyuu
+でわありません;dewaarimasen
+かしゅ;kashu
+うた;uta
+うたう;utau
+どんな;donna
+ジャズ;jazu
+こんど;kondo
+どようび;doyoubi
+が;ga
+つごう;tsugou
+わるい;warui
+もっと;motto
+より;yori
+むり;muri
+な;na
+つぎ;tsugi
+きかい;kikai
+きんえん;kin_en
+たばこや;tabakoya
+へん;hen
+とおい;tooi
+そんなに;sonnani
+みち;michi
+まがる;magaru
+おおきい;ookii
+かわ;kawa
+たすかる;tasukaru
+みっか;mikka
+すう;suu
+タバコ;tabako
+つらい;tsurai
+ぼく;boku
+ゆうびんきょく;yuubinkyoku
+うしろ;ushiro
+こうくう;koukuu
+はがき;hagaki
+ゆうびん;yuubin
+りょうきん;ryoukin
+イギリス;igirisu
+ギリシャ;girisha
+しらべる;shiraberu
+ひゃく;hyaku
+まい;mai
+しごと;shigoto
+うえ;ue
+げんき;genki
+むすこさん;musukosan
+ことし;kotoshi
+だいがく;daigaku
+そつぎょう;sotsugyou
+とうだい;toudai
+おめでとうございます;omedetougozaimasu
+つとめ;tsutome
+かいしゃ;kaisha
+かんけい;kankei
+しがつ;shigatsu
+じどうしゃ;jidousha
+にゅういんする;nyuuinsuru
+あう;au
+ごがつ;gogatsu
+おきのどくに;okinodokuni
+そのご;sonogo
+たいいんする;taiinsuru
+らいしゅう;raishuu
+あんしん;anshin
+アパート;apaato
+みつかる;mitsukaru
+せまい;semai
+けれども;keredomo
+ふん;fun
+おと;oto
+きこえる;kikoeru
+ぜんぜんない;zenzennai
+ようちえん;youchien
+かい;kai
+よん;yon
+ながめ;nagame
+から;kara
+ちょうど;choudo
+なにもない;nanimonai
+に;ni
+ビル;biru
+むかい;mukai
+きにいる;kiniiru
+やちん;yachin
+しょうせつ;shousetsu
+すいりしょうせつ;suirishousetsu
+しゅっぱん;shuppan
+はなし;hanashi
+しゅじんこう;shujinkou
+ファッション・モデル;fasshon_moderu
+スパイ;supai
+ページ;peeji
+おもう;omou
+ながい;nagai
+どのぐらい;donogurai
+もう;mou
+ちゅうごく;chuugoku
+らいねん;rainen
+ご;go
+むすこ;musuko
+かんこう;kankou
+おともする;otomosuru
+すこし;sukoshi
+それに;soreni
+ひま;hima
+げつようび;getsuyoubi
+しょくじ;shokuji
+ばん;ban
+まさこ;masako
+ひこうき;hikouki
+くうこう;kuukou
+ごぜん;gozen
+しあさって;shiasatte
+しち;shichi
+なりた;narita
+にっこう;nikkou
+びん;bin
+ひこうじょう;hikoujou
+むかえる;mukaeru
+エア・ターミナル;ea_taaminaru
+はこざき;hakozaki
+はやい;hayai
+リムジン・バス;rimujin_basu
+だいじょうぶ;daijoubu
+かならず;kanarazu
+わ;wa
+にもつ;nimotsu
+ちいさい;chiisai
+バッグ;baggu
+ふたつ;futatsu
+しんぱい;shinpai
+あに;ani
+でる;deru
+ところ;tokoro
+えいご;eigo
+あなた;anata
+かようび;kayoubi
+たんじょうび;tanjoubi
+どこか;dokoka
+おんがっかい;ongakkai
+しばい;shibai
+てんぷら;tenpura
+うえはら;uehara
+おしえる;oshieru
+ピアノ;piano
+きく;kiku
+なら;nara
+かぶき;kabuki
+それとも;soretomo
+ごさぶろう;gosaburou
+よつや;yotsuya
+かいだん;kaidan
+どっち;docchi
+の;no
+えんそう;ensou
+あたし;atashi
+きっぷ;kippu
+おく;oku
+たのむ;tanomu
+せんしゅう;senshuu
+なつ;natsu
+いろ;iro
+おひさしぶりです;ohisashiburidesu
+きれい;kirei
+こむぎ;komugi
+やける;yakeru
+おおしま;ooshima
+しま;shima
+せとないかい;setonaikai
+にし;nishi
+めいぶつ;meibutsu
+たいよう;taiyou
+つよい;tsuyoi
+ひかり;hikari
+いちにちじゅう;ichinichijuu
+しかない;shikanai
+ですから;desukara
+ひるね;hirune
+うみ;umi
+そして;soshite
+はん;han
+まいあさ;maiasa
+ろく;roku
+かいがん;kaigan
+だれもない;daremonai
+あさひ;asahi
+すいへいせん;suiheisen
+にっちゅう;nicchuu
+むら;mura
+かいるい;kairui
+しんせん;shinsen
+つる;tsuru
+うらやましい;urayamashii
+バーゲン;baagen
+てさげかばん;tesagekaban
+こうすい;kousui
+じん;jin
+タオル;taoru
+りょこう;ryokou
+みつこし;mitsukoshi
+がてら;gatera
+かね;kane
+あめ;ame
+ちかてつ;chikatetsu
+あおい;aoi
+あかい;akai
+かかる;kakaru
+ペア;pea
+しろい;shiroi
+め;me
+よこ;yoko
+やすい;yasui
+あね;ane
+しゅじん;shujin
+ガウン;gaun
+ご;go
+ふち;fuchi
+みず;mizu
+ぎんこう;ginkou
+よる;yoru
+ぜんぶ;zenbu
+ので;node
+おじ;oji
+かす;kasu
+かんさい;kansai
+しゅうまつ;shuumatsu
+しゅっぱつ;shuppatsu
+どうりょう;douryou
+こうそくどうろ;kousokudouro
+こくどう;kokudou
+はしる;hashiru
+キロ;kiro
+すすむ;susumu
+スピード;supiido
+せいげん;seigen
+はち;hachi
+トラック;torakku
+おいこす;oikosu
+いはん;ihan
+かかる;kakaru
+とき;toki
+はやい;hayai
+ほう;hou
+ゆうりょう;yuuryou
+あたり;atari
+しずおか;shizuoka
+つかまる;tsukamaru
+ばっきん;bakkin
+パト・カー;pato_kaa
+はらう;harau
+そのまま;sonomama
+たりる;tariru
+もどる;modoru
+よさん;yosan
+はちこう;hachikou
+いぬ;inu
+どうぞう;douzou
+いう;iu
+など;nado
+はなす;hanasu
+かんしん;kanshin
+うえの;ueno
+えいさぶろう;eisaburou
+かう;kau
+おくる;okuru
+ふどうさんや;fudousan_ya
+あおやま;aoyama
+さがす;sagasu
+なにか;nanika
+けん;ken
+にわ;niwa
+ダイニング;dainingu
+リビング;ribingu
+わかれる;wakareru
+いけばな;ikebana
+じょう;jou
+ちゃ;cha
+つま;tsuma
+ほしい;hoshii
+わしつ;washitsu
+ガレージ;gareeji
+くるま;kuruma
+だい;dai
+ひつよう;hitsuyou
+おおい;ooi
+きゃく;kyaku
+げつ;getsu
+しききん;shikikin
+ぶん;bun
+れいきん;reikin
+にゅうきょする;nyuukyosuru
+あきらめる;akirameru
+みょうじ;myouji
+しぜん;shizen
+あらわす;arawasu
+おなじ;onaji
+でんわちょう;denwachou
+すずき;suzuki
+しんせき;shinseki
+みんな;minna
+パンダ;panda
+えはがき;ehagaki
+かわり;kawari
+こんなに;konnani
+ずつ;zutsu
+いちにち;ichinichi
+たのしい;tanoshii
+むこう;mukou
+けんがく;kengaku
+こうじょう;koujou
+うごかす;ugokasu
+ようこそいらっしゃいました;youkosoirasshaimashita
+あんないする;annaisuru
+これから;korekara
+わたくしども;watakushidomo
+おもに;omoni
+せいひん;seihin
+でんき;denki
+あし;ashi
+きをつける;kiwotsukeru
+もと;moto
+そうこ;souko
+できあがる;dekiagaru
+できる;dekiru
+ねんだい;nendai
+じむしょ;jimusho
+せいぞう;seizou
+たてもの;tatemono
+しつもん;shitsumon
+すみません;sumimasen
+こういん;kouin
+ロボット;robotto
+コンピューター;konpyuutaa
+しつぎょうしゃ;shitsugyousha
+くみたてる;kumitateru
+アルゼンチン;aruzenchin
+おんな;onna
+さっきょくか;sakkyokuka
+オペラ;opera
+いそがしい;isogashii
+ことわる;kotowaru
+のに;noni
+ほか;hoka
+マージャン;maajan
+たのしみにする;tanoshiminisuru
+しょくご;shokugo
+びょうき;byouki
+あたたかい;atatakai
+ちょうし;choushi
+エス・エフ;esu_efu
+うちゅう;uchuu
+ちきゅう;chikyuu
+ぼうけん;bouken
+おこる;okoru
+ものがたり;monogatari
+てん;ten
+ロケット;roketto
+ほし;hoshi
+わくせい;wakusei
+しんりゃく;shinryaku
+はて;hate
+わるもの;warumono
+あんぜん;anzen
+かなた;kanata
+ヒーロー;hiiroo
+まもる;mamoru
+こい;koi
+さいご;saigo
+てきこく;tekikoku
+ハッピ・エンド;happi_endo
+きがする;kigasuru
+きょうみ;kyoumi
+ないよう;naiyou
+なんて;nante
+ホテル;hoteru
+でございます;degozaimasu
+よやく;yoyaku
+さま;sama
+ひとり;hitori
+おとな;otona
+めい;mei
+らいげつ;raigetsu
+はなれる;hanareru
+しょうご;shougo
+チェック・イン;chekku_in
+けど;kedo
+だって;datte
+フロア;furoa
+しかたがない;shikataganai
+こうざ;kouza
+たびたび;tabitabi
+ひらく;hiraku
+ふつう;futsuu
+カナダ;kanada
+ふつか;futsuka
+あずける;azukeru
+きこく;kikoku
+あそぶ;asobu
+ふえる;fueru
+ふゆ;fuyu
+りし;rishi
+よくじつ;yokujitsu
+からっぽ;karappo
+さいふ;saifu
+よてい;yotei
+しようりょう;shiyouryou
+がいこくじん;gaikokujin
+ねがい;negai
+い;i
+いかいよう;ikaiyou
+ちりょう;chiryou
+すいようび;suiyoubi
+おかけください;okakekudasai
+びょういん;byouin
+じんと;jinto
+だす;dasu
+ベッド;beddo
+おす;osu
+と;to
+ただ;tada
+たべすぎ;tabesugi
+たべもの;tabemono
+ひかえる;hikaeru
+いわい;iwai
+しょうしん;shoushin
+レストラン;resutoran
+カクテル・パーティー;kakuteru_paatii
+シャンペン;shanpen
+クラシック;kurashikku
+とくに;tokuni
+がっき;gakki
+オーボエ;ooboe
+しゅみ;shumi
+かつどう;katsudou
+きっかけ;kikkake
+こうとうがっこう;koutougakkou
+はじめる;hajimeru
+なかなかない;nakanakanai
+ふく;fuku
+カセット;kasetto
+さいきん;saikin
+もっぱら;moppara
+ラジオ;rajio
+つけっぱなし;tsukeppanashi
+あつまる;atsumaru
+かくしゅう;kakushuu
+なかま;nakama
+にん;nin
+いれる;ireru
+ひとりで;hitoride
+あき;aki
+おわる;owaru
+あしおと;ashioto
+みたい;mitai
+いわしぐも;iwashigumo
+うかぶ;ukabu
+そら;sora
+むなしい;munashii
+ゆうやけ;yuuyake
+よ;yo
+おちる;ochiru
+かなしい;kanashii
+かれは;kareha
+し;shi
+ためいき;tameiki
+ビオロン;bioron
+まったく;mattaku
+よう;you
+おわり;owari
+かがやく;kagayaku
+かき;kaki
+は;ha
+ひぐれ;higure
+あまりにも;amarinimo
+きもち;kimochi
+さびしい;sabishii
+いのち;inochi
+はかない;hakanai
+ロマンチック;romanchikku
+ふう;fuu
+よっぱらう;yopparau
+うる;uru
+しょうばい;shoubai
+しょくひん;shokuhin
+れいとう;reitou
+かとう;katou
+げんじつてき;genjitsuteki
+びじゅつかん;bijutsukan
+げんだい;gendai
+ところで;tokorode
+さっそく;sassoku
+え;e
+みどりいろ;midoriiro
+ひじょうに;hijouni
+ふしぎ;fushigi
+かお;kao
+あ;a
+ねこ;neko
+あたま;atama
+はな;hana
+だい;dai
+もり;mori
+ゆめ;yume
+タクシー;takushii
+どの;dono
+サントリー;santorii
+そば;soba
+く;ku
+みなと;minato
+くわしい;kuwashii
+こうしゅうでんわ;koushuudenwa
+こまかい;komakai
+たま;tama
+おりる;oriru
+あの;ano
+あみ;ami
+きょだい;kyodai
+ああ;aa
+ゴルフ;gorufu
+れんしゅうじょう;renshuujou
+サラリーマン;sarariiman
+ばしょ;basho
+おくじょう;okujou
+ひろい;hiroi
+スポーツ;supootsu
+やきゅう;yakyuu
+みまい;mimai
+にっせき;nisseki
+なんようび;nan_youbi
+きんようび;kin_youbi
+みょうごにち;myougonichi
+くだもの;kudamono
+はな;hana
+しゅじゅつ;shujutsu
+ちょう;chou
+きいろい;kiiroi
+ほん;hon
+うち;uchi
+おだいじに;odaijini
+わざわざ;wazawaza
+チュウリップ;chuurippu
+きがえる;kigaeru
+さあ;saa
+みずぎ;mizugi
+すいちゅうめがね;suichuumegane
+ぼうし;boushi
+つめたい;tsumetai
+わあ;waa
+いわ;iwa
+きょうそう;kyousou
+かつ;katsu
+あぶない;abunai
+おとなしい;otonashii
+アイス・クリーム;aisu_kuriimu
+あら;ara
+じゃ;ja
+すな;suna
+すわる;suwaru
+せなか;senaka
+たまらない;tamaranai
+ひやけ;hiyake
+きる;kiru
+バカンス;bakansu
+きょねん;kyonen
+まいとし;maitoshi
+けいゆ;keiyu
+シベリア;shiberia
+パリ;pari
+モスクワ;mosukuwa
+ウラジオストック;urajiosutokku
+のりかえる;norikaeru
+ふね;fune
+かんかく;kankaku
+たいくつ;taikutsu
+きめる;kimeru
+ごろ;goro
+しちがつ;shichigatsu
+はじめ;hajime
+れきし;rekishi
+なら;nara
+とおる;tooru
+まわり;mawari
+そう;sou
+てら;tera
+はたけ;hatake
+とうしょうだいじ;toushoudaiji
+ほうりゅうじ;houryuuji
+やくしじ;yakushiji
+しずか;shizuka
+とまる;tomaru
+いぜん;izen
+そのあと;sonoato
+かきとり;kakitori
+ひらがな;hiragana
+せんきょ;senkyo
+へん;hen
+ええと;eeto
+はた;hata
+スピーカー;supiikaa
+くりかえす;kurikaesu
+おおどおり;oodoori
+ど;do
+ながら;nagara
+りっこうほしゃ;rikkouhosha
+しかた;shikata
+やりかた;yarikata
+ちかづく;chikaduku
+でも;demo
+こんかい;konkai
+とちじ;tochiji
+こしょう;koshou
+でんきやさん;denkiyasan
+せんたくき;sentakuki
+いつつ;itsutsu
+とれる;toreru
+ねじ;neji
+そうじき;soujiki
+ついでに;tsuideni
+みっつ;mittsu
+かしら;kashira
+れいぞうこ;reizouko
+いったい;ittai
+ぬける;nukeru
+いらい;irai
+きぐ;kigu
+じゅう;juu
+たいしょく;taishoku
+ぶんかい;bunkai
+しんかんせん;shinkansen
+きゅうしゅう;kyuushuu
+まご;mago
+くらべる;kuraberu
+しゃない;shanai
+まど;mado
+おかげで;okagede
+さむい;samui
+すずしい;suzushii
+たしか;tashika
+むしあつい;mushiatsui
+れいぼう;reibou
+きょうと;kyouto
+ごこち;gokochi
+ねむる;nemuru
+よこはま;yokohama
+たら;tara
+おおさか;oosaka
+まいしゅう;maishuu
+へんじ;henji
+うけとる;uketoru
+ゆうべ;yuube
+ポスト;posuto
+とお;too
+とおか;tooka
+ところが;tokoroga
+ふうとう;fuutou
+きたく;kitaku
+ちゃんと;chanto
+はら;hara
+ばんち;banchi
+サービス;saabisu
+はいたつ;haitatsu
+せいかく;seikaku
+そくたつ;sokutatsu
+せんとう;sentou
+げしゅく;geshuku
+シャワー;shawaa
+ふべん;fuben
+まいばん;maiban
+ひろびろとする;hirobirotosuru
+ふかい;fukai
+ゆぶね;yubune
+すぎ;sugi
+すく;suku
+つかる;tsukaru
+まんいん;man_in
+せつび;setsubi
+あいだに;aidani
+げんかん;genkan
+だんじょ;danjo
+ても;temo
+はだか;hadaka
+べつべつ;betsubetsu
+はずかしい;hazukashii
+へいき;heiki
+きになる;kininaru
+ならう;narau
+こじん;kojin
+レッスン;ressun
+よむ;yomu
+じき;jiki
+それじゃ;soreja
+きじ;kiji
+こうぎょう;kougyou
+へえ;hee
+まじめ;majime
+ちち;chichi
+のうぎょう;nougyou
+ほうめん;houmen
+どんどん;dondon
+て;te
+あれ;are
+ロック;rokku
+えらぶ;erabu
+しんこんりょこう;shinkonryokou
+ひとつ;hitotsu
+しんじゅく;shinjuku
+ついたち;tsuitachi
+よろしく;yoroshiku
+いくらか;ikuraka
+カメラやさん;kamerayasan
+こがた;kogata
+ごらん;goran
+モデル;moderu
+ぜんじどう;zenjidou
+メーカー;meekaa
+ボディー;bodii
+かるい;karui
+えらびかた;erabikata
+について;nitsuite
+はなしあう;hanashiau
+ふさい;fusai
+コンクリート;konkuriito
+じしん;jishin
+おれ;ore
+じゅん;jun
+しき;shiki
+ていねん;teinen
+ぼんさい;bonsai
+すう;suu
+おうせつま;ousetsuma
+かんがえる;kangaeru
+しき;shiki
+しょくどう;shokudou
+しんしつ;shinshitsu
+ふろば;furoba
+モダン;modan
+じゅんび;junbi
+たち;tachi
+のる;noru
+ふじさん;fujisan
+って;tte
+くさる;kusaru
+じつぶつ;jitsubutsu
+ほど;hodo
+へん;hen
+いず;izu
+でかける;dekakeru
+はんとう;hantou
+くも;kumo
+ほうこう;houkou
+かぞく;kazoku
+そうしき;soushiki
+ちじん;chijin
+れいえん;reien
+はか;haka
+ぶんがくしゃ;bungakusha
+ぼち;bochi
+こそ;koso
+やはり;yahari
+いっしょう;isshou
+じゅういちがつ;juuichigatsu
+こうしつ;koushitsu
+とまる;tomaru
+はらじゅく;harajuku
+やまのてせん;yamanotesen
+よよぎ;yoyogi
+とくべつ;tokubetsu
+ばあい;baai
+てんのう;tennou
+へいか;heika
+おすまい;osumai
+こうきょ;koukyo
+ちよだく;chiyodaku
+れっしゃ;ressha
+こうごう;kougou
+なす;nasu
+おめにかかる;omenikakaru
+こくみん;kokumin
+りょう;ryou
+きゅうちゅうさんが;kyuuchuusanga
+しょうがつ;shougatsu
+すがた;sugata
+しょうぐん;shougun
+しろ;shiro
+まんなか;mannaka
+ジョギング;jogingu
+そんな;sonna
+おみあい;omiai
+おい;oi
+きしゃ;kisha
+けいざい;keizai
+だれか;dareka
+おいごさん;oigosan
+てんきん;tenkin
+ブラジル;burajiru
+しゃこうせい;shakousei
+じょうず;jouzu
+せったい;settai
+りそう;risou
+じょうけん;jouken
+こっかいぎいん;kokkaigiin
+ゆうじん;yuujin
+いたす;itasu
+のちほど;nochihodo
+れんらく;renraku
+かんじ;kanji
+しゃこうてき;shakouteki
+はきはき;hakihaki
+あう;au
+ごがく;gogaku
+し;shi
+ポルトガル;porutogaru
+かのじょ;kanojo
+せ;se
+にあう;niau
+ふとい;futoi
+ふりそで;furisode
+がまん;gaman
+スキー;sukii
+ウィーク・エンド;wiiku_endo
+あいつ;aitsu
+ひどいめにあう;hidoimeniau
+くん;kun
+じまん;jiman
+リフト;rifuto
+ふもと;fumoto
+べそをかく;besowokaku
+カーブ;kaabu
+ころぶ;korobu
+おきあがる;okiagaru
+おこす;okosu
+そのうえ;sonoue
+そのたんびに;sonotanbini
+はんにち;hannichi
+やまごや;yamagoya
+ゆき;yuki
+せっかく;sekkaku
+だいなし;dainashi
+ただいま;tadaima
+あっ;aっ
+おかえりなさい;okaerinasai
+おとす;otosu
+したく;shitaku
+つかれ;tsukare
+ゆうしょく;yuushoku
+うん;un
+いつでも;itsudemo
+かん;kan
+おまえ;omae
+ゆ;yu
+わかす;wakasu
+ひさしぶりに;hisashiburini
+からだ;karada
+じゅうぶん;juubun
+すいみん;suimin
+こんばんわ;konbanwa
+せんげつ;sengetsu
+ヨーロッパ;yooroppa
+しゃべり;shaberi
+ますます;masumasu
+うわさ;uwasa
+おもいちがい;omoichigai
+いっちょうら;icchoura
+じゅうにがつ;juunigatsu
+せびろ;sebiro
+ドア;doa
+ならす;narasu
+ベル;beru
+すてき;suteki
+ひやす;hiyasu
+おおそうじ;oosouji
+せちりょうり;sechiryouri
+ととのう;totonou
+おがむ;ogamu
+としこしそば;toshikoshisoba
+ねんし;nenshi
+ひので;hinode
+おおみそか;oomisoka
+すっかり;sukkari
+レヴェイヨン;reveiyon
+カンパイ;kanpai
+ごくろうさま;gokurousama
+キャンプ;kyanpu
+テント;tento
+すむ;sumu
+ばんめし;banmeshi
+まくら;makura
+かい;kai
+しにん;shinin
+つまり;tsumari
+ねかせる;nekaseru
+きらう;kirau
+むける;mukeru
+みなみ;minami
+しゃめん;shamen
+けんり;kenri
+ごんげん;gongen
+みち;michi
+やくみ;yakumi
+みりょく;miryoku
+ぎまい;gimai
+かじゅう;kajuu
+かちょう;kachou
+らしん;rashin
+せきぜん;sekizen
+せいせき;seiseki
+こうさい;kousai
+れっしゃ;ressha
+そうれつ;souretsu
+ぶんれつ;bunretsu
+れいがい;reigai
+とうほん;touhon
+ふっとう;futtou
+かっとう;kattou
+しょうり;shouri
+ぐうぞう;guuzou
+そうぐう;souguu
+いちぐう;ichiguu
+ぐち;guchi
+ぎょえん;gyoen
+えんせい;ensei
+えんてん;enten
+わんりょく;wanryoku
+がじょう;gajou
+はつが;hatsuga
+ゆうが;yuuga
+かくう;kakuu
+しゅくがかい;shukugakai
+がんこ;ganko
+こじん;kojin
+いっかげつ;ikkagetsu
+こうりょう;kouryou
+こうてつ;koutetsu
+ごうけんな;goukenna
+ほうし;houshi
+ねんぽう;nenpou
+てつぼう;tetsubou
+いっぱん;ippan
+うんぱん;unpan
+えんばん;enban
+しょうもう;shoumou
+びこう;bikou
+ぼうし;boushi
+いんぼう;inbou
+ばいかい;baikai
+がいねん;gainen
+ふんがい;fungai
+きせい;kisei
+こうげん;kougen
+げんせん;gensen
+しがんする;shigansuru
+ようぎ;yougi
+もぎ;mogi
+ぎょうこする;gyoukosuru
+きょうふ;kyoufu
+きぼう;kibou
+えんせん;ensen
+えんかん;enkan
+せんちょう;senchou
+ふじん;fujin
+ふよう;fuyou
+きそく;kisoku
+えいご;eigo
+えいが;eiga
+ちゅうおう;chuuou
+うまい;umai
+あじ;aji
+かもしれない;kamoshirenai
+マッチ;macchi
+みあたる;miataru
+え;e
+こんや;kon_ya
+とちゅう;tochuu
+みんしゅく;minshuku
+すきま;sukima
+セントラリ・ヒーティング;sentorari_hiitingu
+だて;date
+げんこう;genkou
+ひしょ;hisho
+べっそう;bessou
+もし;moshi
+やまなかこ;yamanakako
+コート;kooto
+ダイヤモンド;daiyamondo
+ハンド・バッグ;hando_baggu
+ミンク;minku
+ゆびわ;yubiwa
+わに;wani
+おがたこうりん;ogatakourin
+しゅう;shuu
+けんぶつ;kenbutsu
+しゅと;shuto
+すべて;subete
+すうねん;suunen
+ぜん;zen
+タヒチ;tahichi
+むすめ;musume
+かえす;kaesu
+しゃっきん;shakkin
+せんけつ;senketsu
+しんねんあけましておめでとうございます;shinnen_akemashiteomedetougozaimasu
+おせわになりました;osewaninarimashita
+さくねん;sakunen
+せわ;sewa
+ちゅう;chuu
+ほんねん;honnen
+いや;iya
+きもの;kimono
+じぎ;jigi
+けんきゅう;kenkyuu
+せいふ;seifu
+として;toshite
+りゅうがくせい;ryuugakusei
+がくせい;gakusei
+ウィーン;wiin
+オーストリア;oosutoria
+おもいだす;omoidasu
+ころ;koro
+なつかしい;natsukashii
+みおくる;miokuru
+かたかな;katakana
+おくれる;okureru
+こりごりです;korigoridesu
+めいろ;meiro
+ちか;chika
+つうろ;tsuuro
+ホーム;hoomu
+おおぜい;oozei
+エスカレーター;esukareetaa
+かいさつぐち;kaisatsuguchi
+でぐち;deguchi
+わたす;watasu
+いりぐち;iriguchi
+やっとのおもいで;yattonoomoide
+ひがし;higashi
+ひょうじばん;hyoujiban
+しきもう;shikimou
+おふくろ;ofukuro
+かたづける;katadukeru
+こんしゅう;konshuu
+たたむ;tatamu
+ふとん;futon
+いっぱい;ippai
+たたみ;tatami
+なんか;nanka
+さとう;satou
+したぎ;shitagi
+やさい;yasai
+ワイシャツ;waishatsu
+きたない;kitanai
+ナイフ;naifu
+ひからびる;hikarabiru
+アルバイト;arubaito
+くたくた;kutakuta
+さ;sa
+よゆう;yoyuu
+このまえ;konomae
+じょうきょう;joukyou
+きっきょう;kikkyou
+かぜ;kaze
+ひく;hiku
+くすり;kusuri
+きらい;kirai
+じゃあ;jaa
+いっさい;issai
+かんぽうやく;kanpouyaku
+こうせいぶっしつ;kouseibusshitsu
+しあつ;shiatsu
+はり;hari
+やくひん;yakuhin
+せっかき;sekkaki
+きがつく;kigatsuku
+ペット;petto
+がっこう;gakkou
+ビデオ;bideo
+ぶんか;bunka
+きんし;kinshi
+きんぺん;kinpen
+つうこう;tsuukou
+てんごく;tengoku
+ほこうしゃ;hokousha
+シーソー;shiisoo
+テーブル;teeburu
+ならべる;naraberu
+ブランコ;buranko
+づれ;dure
+くつ;kutsu
+はかす;hakasu
+あさくさ;asakusa
+ずっと;zutto
+まさか;masaka
+よう;you
+きちがい;kichigai
+きんじょ;kinjo
+くびわ;kubiwa
+にせ;nise
+びよういん;biyouin
+ほうせき;houseki
+おたく;otaku
+ぶんがく;bungaku
+わかい;wakai
+いっしょうけんめい;isshoukenmei
+げんじものがたり;genjimonogatari
+こてん;koten
+まくらのそうし;makuranosoushi
+まんが;manga
+かよう;kayou
+としょかん;toshokan
+おも;omo
+さくひん;sakuhin
+はたち;hatachi
+へいあん;heian
+ほぼ;hobo
+あんきする;ankisuru
+せいしょうなごん;seishounagon
+さっか;sakka
+じょりゅう;joryuu
+むらさきしきぶ;murasakishikibu
+ちょうてい;choutei
+だいひょうてき;daihyouteki
+おじゃましました;ojamashimashita
+ごちそうさまでした;gochisousamadeshita
+ばんごはん;bangohan
+どういたしまして;douitashimashite
+ごめんくださいませ;gomenkudasaimase
+きんかくじ;kinkakuji
+ひょうし;hyoushi
+いけ;ike
+きんいろ;kin_iro
+こころ;kokoro
+しずまる;shizumaru
+ふくげん;fukugen
+うつくしさ;utsukushisa
+おぼうさん;obousan
+かんぺき;kanpeki
+たえる;taeru
+ひ;hi
+もとめる;motomeru
+かじ;kaji
+もえる;moeru
+もくぞう;mokuzou
+び;bi
+みしまゆきお;mishimayukio
+あじわう;ajiwau
+かんこうきゃく;kankoukyaku
+じっさい;jissai
+ふうけい;fuukei
+ふんいき;fun_iki
+いんしょう;inshou
+がっかりする;gakkarisuru
+ごめんください;gomenkudasai
+あがる;agaru
+えんりょ;enryo
+おあがりください;oagarikudasai
+とつぎさき;totsugisaki
+はく;haku
+まいる;mairu
+よめ;yome
+こす;kosu
+ごぶさたしたおります;gobusatashitaorimasu
+さようでございます;sayoudegozaimasu
+ござる;gozaru
+たずねる;tazuneru
+とつぜん;totsuzen
+もうしわけありません;moushiwakearimasen
+きらく;kiraku
+じょうたい;joutai
+とこ;toko
+かねもち;kanemochi
+きげん;kigen
+ごらんのとおり;gorannotoori
+かへい;kahei
+かみ;kami
+さつ;satsu
+じょうぶ;joubu
+やぶれる;yabureru
+えがく;egaku
+じんぶつ;jinbutsu
+まちがえる;machigaeru
+けんぽう;kenpou
+しょうとくたいし;shoutokutaishi
+せいき;seiki
+なな;nana
+せいじか;seijika
+いとうひろぶみ;itouhirobumi
+いわくらともみ;iwakuratomomi
+めいじ;meiji
+ぶんかじん;bunkajin
+しそうか;shisouka
+ふくざわゆきち;fukuzawayukichi
+いしん;ishin
+おうべい;oubei
+せいよう;seiyou
+きょういくか;kyouikuka
+しょうわ;shouwa
+たいしょう;taishou
+にとべいなぞう;nitobeinazou
+きんだい;kindai
+なつめそうせき;natsumesouseki
+しつれい;shitsurei
+わがはい;wagahai
+しゃかい;shakai
+にんげん;ningen
+たいせん;taisen
+あつめる;atsumeru
+はなみ;hanami
+さくら;sakura
+まんかい;mankai
+ことわざ;kotowaza
+ちる;chiru
+しゅっちょう;shucchou
+ぜん;zen
+ござ;goza
+しく;shiku
+しんしゅう;shinshuu
+そふ;sofu
+すみ;sumi
+たんか;tanka
+よむ;yomu
+ままごと;mamagoto
+そぼ;sobo
+だんご;dango
+わらう;warau
+なみ;nami
+こくりつ;kokuritsu
+がくひ;gakuhi
+しゅうしょく;shuushoku
+らく;raku
+あずかる;azukaru
+ねえさん;neesan
+ちゅうがっこう;chuugakkou
+ねんせい;nensei
+み;mi
+きょうじゅ;kyouju
+だいがくせい;daigakusei
+たっしゃ;tassha
+こくさいてき;kokusaiteki
+こくご;kokugo
+さんすう;sansuu
+よほど;yohodo
+しょうがっこう;shougakkou
+しりつ;shiritsu
+ここのつ;kokonotsu
+みほん;mihon
+エヌ・エッチ・ケー;enu_ecchi_kee
+こうきょう;koukyou
+しゅるい;shurui
+チャンネル;channeru
+ばんぐみ;bangumi
+ほうそう;housou
+ほうふ;houfu
+みんかん;minkan
+げき;geki
+ほうえい;houei
+クイズ;kuizu
+なんでも;nandemo
+ごらく;goraku
+がいこくご;gaikokugo
+ギター;gitaa
+こうざ;kouza
+さいほう;saihou
+しゃみせん;shamisen
+はじまる;hajimaru
+フルート;furuuto
+しゃかいがく;shakaigaku
+すうがく;suugaku
+きょういく;kyouiku
+きぎょう;kigyou
+スポンサー;suponsaa
+いらいらする;irairasuru
+こうこく;koukoku
+ちゅうだん;chuudan
+トイレ;toire
+りよう;riyou
+おげんきで;ogenkide
+みじかい;mijikai
+とくしゅ;tokushu
+りかい;rikai
+こくさいれんごう;kokusairengou
+えんそく;ensoku
+べんとう;bentou
+おかず;okazu
+おにしめ;onishime
+とり;tori
+ゆでたまご;yudetamago
+くもり;kumori
+よほう;yohou
+おっしゃる;ossharu
+むすび;musubi
+いや;iya
+おもい;omoi
+リュック・サック;ryukku_sakku
+おやつ;oyatsu
+デザート;dezaato
+せんべい;senbei
+あまい;amai
+クッキー;kukkii
+チョコレート;chokoreeto
+おやすみなさい;oyasuminasai
+かいわ;kaiwa
+にちじょう;nichijou
+げいひんかん;geihinkan
+ひとごみ;hitogomi
+オランダ;oranda
+けいさつかん;keisatsukan
+じょおう;joou
+そうりだいじん;souridaijin
+こっかいぎじどう;kokkaigijidou
+むかう;mukau
+こんげつ;kongetsu
+ふけいかい;fukeikai
+しゅっせき;shusseki
+あかるい;akarui
+きびしい;kibishii
+りか;rika
+びだんし;bidanshi
+ファン;fan
+やさしい;yasashii
+きゅうに;kyuuni
+けい;kei
+しょうらい;shourai
+ねんごう;nengou
+こせきしょうほん;kosekishouhon
+せいれき;seireki
+たいしかん;taishikan
+ちゅういがき;chuuigaki
+めんどうくさい;mendoukusai
+やくする;yakusuru
+あたる;ataru
+がんねん;gannen
+たす;tasu
+とし;toshi
+ごぞんじです;gozonjidesu
+どなたか;donataka
+アップライト・ピアノ;appuraito_piano
+グランド・ピアノ;gurando_piano
+がいこくせい;gaikokusei
+こくさん;kokusan
+くろい;kuroi
+ちゃいろ;chairo
+がいかん;gaikan
+ひく;hiku
+ふかみ;fukami
+カタログ;katarogu
+おまわりさん;omawarisan
+ショッピングセンター;shoppingusentaa
+しんせつ;shinsetsu
+はは;haha
+まいご;maigo
+うんてんしゅ;untenshu
+こうば;kouba
+のうじょう;noujou
+ほっかいどう;hokkaidou
+うし;ushi
+うんてんする;untensuru
+くらす;kurasu
+すごす;sugosu
+トラクター;torakutaa
+ひゃくしょう;hyakushou
+オリンピック;orinpikku
+かたち;katachi
+けんちくか;kenchikuka
+しゅうがくりょこう;shuugakuryokou
+スタジアム;sutajiamu
+ちゅうがくせい;chuugakusei
+しょうしゃマン;shoushaman
+ついに;tsuini
+つうやく;tsuuyaku
+はいゆう;haiyuu
+かい;kai
+これら;korera
+しょうじき;shoujiki
+アシミル;ashimiru
+きそく;kisoku
+さつ;satsu
+ただしい;tadashii
+テキスト;tekisuto
+かんじ;kanji
+じ;ji
+かたあし;kataashi
+ぬき;nuki
+えとく;etoku
+り;ri
+ほ;ho
+つづける;tsudukeru
+こうはんりょ;kouhanryo
+さようなら;sayounara
+かまいません;kamaimasen
+あ;a
+ああ;aa
+あいだ;aida
+あう;au
+あがる;agaru
+あかんぼう;akanbou
+あさねぼう;asanebou
+あじ;aji
+あす;asu
+あそび;asobi
+あつまる;atsumaru
+あつめる;atsumeru
+あやまる;ayamaru
+アルバイト;arubaito
+あんしん;anshin
+あんぜん;anzen
+あんない;annai
+いか;ika
+いがい;igai
+いがく;igaku
+いきる;ikiru
+いくらても;ikuratemo
+いけん;iken
+いし;ishi
+いじょう;ijou
+いたす;itasu
+いちど;ichido
+いっしょうけんめい;isshoukenmei
+いと;ito
+いなか;inaka
+いのる;inoru
+いん;in
+うえる;ueru
+うけつけ;uketsuke
+うける;ukeru
+うごく;ugoku
+うつ;utsu
+うつす;utsusu
+うつる;utsuru
+うら;ura
+うりば;uriba
+うん;un
+うんてんしゅ;untenshu
+うんてん;unten
+エスカレーター;esukareetaa
+えだ;eda
+えらぶ;erabu
+えんりょ;enryo
+おいでになる;oideninaru
+おいわい;oiwai
+おうせつま;ousetsuma
+おおい;ooi
+おおきな;ookina
+オートバイ;ootobai
+オーバー;oobaa
+おき;oki
+おくじょう;okujou
+おくりもの;okurimono
+おくる;okuru
+おくれる;okureru
+おこす;okosu
+おこる;okoru
+おしいれ;oshiire
+おちる;ochiru
+おっしゃる;ossharu
+おと;oto
+おとす;otosu
+おどり;odori
+おどろく;odoroku
+おまつり;omatsuri
+おみまい;omimai
+おみやげ;omiyage
+おもいだす;omoidasu
+おもう;omou
+おもて;omote
+おりる;oriru
+おる;oru
+おれい;orei
+おれる;oreru
+おわり;owari
+か;ka
+カーテン;kaaten
+かい;kai
+かいがん;kaigan
+かいぎ;kaigi
+かいじょう;kaijou
+かいわ;kaiwa
+かえり;kaeri
+かがみ;kagami
+がくぶ;gakubu
+かざる;kazaru
+かじ;kaji
+ガソリン;gasorin
+ガソリンスタンド;gasorinsutando
+かたち;katachi
+かたづける;katadukeru
+かつ;katsu
+かなしい;kanashii
+かならず;kanarazu
+かねもち;kanemochi
+かのじょ;kanojo
+かべ;kabe
+かまう;kamau
+かみ;kami
+かむ;kamu
+かよう;kayou
+ガラス;garasu
+かれ;kare
+かれら;karera
+かわく;kawaku
+かわり;kawari
+かんがえる;kangaeru
+かんけい;kankei
+かんごふ;kangofu
+かんたん;kantan
+きかい;kikai
+きかい;kikai
+きけん;kiken
+きこえる;kikoeru
+ぎじゅつ;gijutsu
+きせつ;kisetsu
+きそく;kisoku
+きぬ;kinu
+きびしい;kibishii
+きまる;kimaru
+きめる;kimeru
+きもち;kimochi
+きもの;kimono
+きゃく;kyaku
+きゅう;kyuu
+きゅうこう;kyuukou
+きょういく;kyouiku
+きょうかい;kyoukai
+きょうそう;kyousou
+きょうみ;kyoumi
+きんじょ;kinjo
+ぐあい;guai
+くうこう;kuukou
+くさ;kusa
+くび;kubi
+くも;kumo
+くらべる;kuraberu
+くん;kun
+けいかん;keikan
+けいけん;keiken
+けいざい;keizai
+けいさつ;keisatsu
+げしゅく;geshuku
+けっして;kesshite
+けん;ken
+げんいん;gen_in
+けんきゅう;kenkyuu
+けんきゅうしつ;kenkyuushitsu
+けんぶつ;kenbutsu
+こ;ko
+ご;go
+こうがい;kougai
+こうぎ;kougi
+こうぎょう;kougyou
+こうとうがっこう;koutougakkou
+こうこうせい;koukousei
+こうじょう;koujou
+こうちょう;kouchou
+こうむいん;koumuin
+こころ;kokoro
+ございます;gozaimasu
+こしょう;koshou
+ごぞんじ;gozonji
+こたえ;kotae
+こっち;kocchi
+ことり;kotori
+こまかい;komakai
+こめ;kome
+ごらんになる;goranninaru
+こわす;kowasu
+こわれる;kowareru
+コンサート;konsaato
+こんど;kondo
+こんや;kon_ya
+さいきん;saikin
+さいご;saigo
+さいふ;saifu
+さがす;sagasu
+さがる;sagaru
+さしあげる;sashiageru
+さびしい;sabishii
+さま;sama
+さわぐ;sawagu
+さわる;sawaru
+サンダル;sandaru
+サンドイッチ;sandoicchi
+じ;ji
+しあい;shiai
+しかた;shikata
+しき;shiki
+しけん;shiken
+じしん;jishin
+したぎ;shitagi
+したく;shitaku
+しっぱい;shippai
+しつれい;shitsurei
+じてん;jiten
+しなもの;shinamono
+しま;shima
+じむしょ;jimusho
+しゃかい;shakai
+しゃちょう;shachou
+ジャム;jamu
+じゆう;jiyuu
+じゅうしょ;juusho
+じゅうどう;juudou
+しゅっせき;shusseki
+しゅっぱつ;shuppatsu
+しゅみ;shumi
+じゅんび;junbi
+しょうかい;shoukai
+しょうがつ;shougatsu
+しょうがっこう;shougakkou
+しょうせつ;shousetsu
+しょうたい;shoutai
+しょうち;shouchi
+しょうらい;shourai
+しょくじ;shokuji
+しょくりょうひん;shokuryouhin
+じょせい;josei
+しらせる;shiraseru
+しらべる;shiraberu
+じんじゃ;jinja
+しんせつ;shinsetsu
+しんぱい;shinpai
+しんぶんしゃ;shinbunsha
+すいえい;suiei
+すいどう;suidou
+すうがく;suugaku
+スーツケース;suutsukeesu
+すぎる;sugiru
+すっかり;sukkari
+ステレオ;sutereo
+すてる;suteru
+すな;suna
+すみ;sumi
+すむ;sumu
+すると;suruto
+せい;sei
+せいじ;seiji
+せいよう;seiyou
+せき;seki
+せつめい;setsumei
+せなか;senaka
+せわ;sewa
+せんそう;sensou
+せんぱい;senpai
+せんもん;senmon
+そう;sou
+そうだん;soudan
+そだてる;sodateru
+そつぎょう;sotsugyou
+そふ;sofu
+そぼ;sobo
+それに;soreni
+そんな;sonna
+だい;dai
+たいいん;taiin
+だいがくせい;daigakusei
+だいじ;daiji
+タイプ;taipu
+たいふう;taifuu
+たおれる;taoreru
+たしか;tashika
+たす;tasu
+だす;dasu
+たずねる;tazuneru
+ただしい;tadashii
+たたみ;tatami
+たてる;tateru
+たてる;tateru
+たとえば;tatoeba
+たな;tana
+たのしむ;tanoshimu
+たりる;tariru
+だんせい;dansei
+だんぼう;danbou
+ち;chi
+ちいさな;chiisana
+ちから;chikara
+ちゃん;chan
+ちゅうがっこう;chuugakkou
+ちゅうしゃ;chuusha
+ちゅうしゃじょう;chuushajou
+ちり;chiri
+ついて;tsuite
+つかまえる;tsukamaeru
+つき;tsuki
+つごう;tsugou
+つたえる;tsutaeru
+つづける;tsudukeru
+つつむ;tsutsumu
+つま;tsuma
+つる;tsuru
+ていねい;teinei
+テキスト;tekisuto
+てきとう;tekitou
+テニスコート;tenisukooto
+てぶくろ;tebukuro
+てら;tera
+てん;ten
+てんいん;ten_in
+てんきよほう;tenkiyohou
+でんとう;dentou
+でんぽう;denpou
+てんらんかい;tenrankai
+どうぐ;dougu
+とうとう;toutou
+どうぶつえん;doubutsuen
+とおく;tooku
+とおり;toori
+とおる;tooru
+とき;toki
+とくに;tokuni
+とくべつ;tokubetsu
+とし;toshi
+とちゅう;tochuu
+とっきゅう;tokkyuu
+どっち;docchi
+とどける;todokeru
+とまる;tomaru
+とめる;tomeru
+とりかえる;torikaeru
+どろぼう;dorobou
+ながら;nagara
+なく;naku
+なくす;nakusu
+なげる;nageru
+なるほど;naruhodo
+なれる;nareru
+にがい;nigai
+にくい;nikui
+にっき;nikki
+にゅういん;nyuuin
+にゅうがく;nyuugaku
+ぬすむ;nusumu
+ねむい;nemui
+ねむる;nemuru
+のりかえる;norikaeru
+のりもの;norimono
+は;ha
+ばあい;baai
+ばい;bai
+はいしゃ;haisha
+ばかり;bakari
+はこぶ;hakobu
+はじめる;hajimeru
+はずかしい;hazukashii
+はなみ;hanami
+はらう;harau
+ばんぐみ;bangumi
+ひ;hi
+ひえる;hieru
+ひきだし;hikidashi
+ひこうじょう;hikoujou
+ひさしぶり;hisashiburi
+びじゅつかん;bijutsukan
+びっくりする;bikkurisuru
+ひっこす;hikkosu
+ひつよう;hitsuyou
+ひらく;hiraku
+ビル;biru
+ひるま;hiruma
+ひるやすみ;hiruyasumi
+ひろう;hirou
+ふえる;fueru
+ふかい;fukai
+ふつう;futsuu
+ぶどう;budou
+ふとる;futoru
+ふとん;futon
+ふね;fune
+ふね;fune
+ふべん;fuben
+ふむ;fumu
+プレゼント;purezento
+ぶんか;bunka
+ぶんがく;bungaku
+ベル;beru
+へん;hen
+へんじ;henji
+ぼうえき;boueki
+ほうそう;housou
+ほし;hoshi
+ほんやく;hon_yaku
+まいる;mairu
+まける;makeru
+まちがえる;machigaeru
+まにあう;maniau
+まま;mama
+まわり;mawari
+まわる;mawaru
+まんが;manga
+まんなか;mannaka
+みずうみ;mizuumi
+みつかる;mitsukaru
+みつける;mitsukeru
+みどり;midori
+みな;mina
+みなと;minato
+むかえる;mukaeru
+むし;mushi
+むすこ;musuko
+むすめ;musume
+むら;mura
+むり;muri
+め;me
+めしあがる;meshiagaru
+もうしあげる;moushiageru
+もうすぐ;mousugu
+もし;moshi
+もどる;modoru
+もめん;momen
+やく;yaku
+やくにたつ;yakunitatsu
+やくそく;yakusoku
+やける;yakeru
+やさしい;yasashii
+やすい;yasui
+やはり;yahari
+やわらかい;yawarakai
+ゆ;yu
+ゆうはん;yuuhan
+ゆしゅつ;yushutsu
+ゆび;yubi
+ゆびわ;yubiwa
+ゆめ;yume
+ゆれる;yureru
+よう;you
+ようい;youi
+よごれる;yogoreru
+よしゅう;yoshuu
+よてい;yotei
+よやく;yoyaku
+よる;yoru
+によると;niyoruto
+よろこぶ;yorokobu
+よわい;yowai
+りゆう;riyuu
+りよう;riyou
+りょうほう;ryouhou
+りょかん;ryokan
+るす;rusu
+れきし;rekishi
+れんらく;renraku
+わかす;wakasu
+わかれる;wakareru
+わく;waku
+わけ;wake
+わらう;warau
+わりあい;wariai
+われる;wareru
+ああ;aa
+あう;au
+あおい;aoi
+あかい;akai
+あかるい;akarui
+あき;aki
+あける;akeru
+あさ;asa
+あさごはん;asagohan
+あし;ashi
+あそぶ;asobu
+あたたかい;atatakai
+あたま;atama
+あつい;atsui
+あつい;atsui
+あつい;atsui
+あに;ani
+あね;ane
+あの;ano
+あのう;anou
+アパート;apaato
+あぶない;abunai
+あまい;amai
+あまり;amari
+あめ;ame
+あらう;arau
+ある;aru
+あるく;aruku
+あれ;are
+いい;ii
+よい;yoi
+いいえ;iie
+いう;iu
+いく;iku
+ゆく;yuku
+いけ;ike
+いそがしい;isogashii
+いち;ichi
+いちにち;ichinichi
+いつか;itsuka
+いつつ;itsutsu
+いま;ima
+いみ;imi
+いもうと;imouto
+いや;iya
+いりぐち;iriguchi
+いる;iru
+いる;iru
+いれる;ireru
+いろ;iro
+うえ;ue
+うしろ;ushiro
+うすい;usui
+うた;uta
+うたう;utau
+うまれる;umareru
+うみ;umi
+うる;uru
+うわぎ;uwagi
+え;e
+えいが;eiga
+えいがかん;eigakan
+えいご;eigo
+ええ;ee
+えき;eki
+エレベーター;erebeetaa
+えん;en
+えんぴつ;enpitsu
+お;o
+おおきい;ookii
+おおぜい;oozei
+おかし;okashi
+おかね;okane
+おきる;okiru
+おさけ;osake
+おさら;osara
+おじ;oji
+おじ;oji
+おしえる;oshieru
+おす;osu
+おそい;osoi
+おちゃ;ocha
+おてあらい;otearai
+おとうと;otouto
+おとこ;otoko
+おとこのこ;otokonoko
+おとな;otona
+おなじ;onaji
+おば;oba
+おば;oba
+おべんとう;obentou
+おもい;omoi
+おりる;oriru
+おわる;owaru
+おんな;onna
+おんなのこ;onnanoko
+かい;kai
+かい;kai
+がいこくじん;gaikokujin
+かいしゃ;kaisha
+かいだん;kaidan
+かいもの;kaimono
+かう;kau
+かえす;kaesu
+かお;kao
+かかる;kakaru
+がくせい;gakusei
+かげつ;kagetsu
+かける;kakeru
+かける;kakeru
+かす;kasu
+かぜ;kaze
+かぞく;kazoku
+かたかな;katakana
+がつ;gatsu
+がっこう;gakkou
+かど;kado
+かばん;kaban
+かびん;kabin
+かみ;kami
+カメラ;kamera
+かようび;kayoubi
+からい;karai
+からだ;karada
+がる;garu
+かるい;karui
+カレンダー;karendaa
+かわ;kawa
+かわ;kawa
+がわ;gawa
+かんじ;kanji
+きいろい;kiiroi
+きく;kiku
+ギター;gitaa
+きたない;kitanai
+きって;kitte
+きっぷ;kippu
+きのう;kinou
+ぎゅうにく;gyuuniku
+きょう;kyou
+きょうしつ;kyoushitsu
+きょうだい;kyoudai
+きょねん;kyonen
+きらい;kirai
+きる;kiru
+きる;kiru
+キロ;kiro
+キロ;kiro
+ぎんこう;ginkou
+きんようび;kin_youbi
+く;ku
+くすり;kusuri
+くだもの;kudamono
+くつ;kutsu
+くつした;kutsushita
+くもる;kumoru
+くらい;kurai
+くらい;kurai
+ぐらい;gurai
+クラス;kurasu
+グラム;guramu
+くる;kuru
+くるま;kuruma
+くろい;kuroi
+けさ;kesa
+けす;kesu
+けっこん;kekkon
+げつようび;getsuyoubi
+げんかん;genkan
+げんき;genki
+こ;ko
+ご;go
+ご;go
+こえ;koe
+コート;kooto
+ここ;koko
+ここのつ;kokonotsu
+ごしゅじん;goshujin
+ごぜん;gozen
+こたえる;kotaeru
+コップ;koppu
+ことし;kotoshi
+こども;kodomo
+この;kono
+こまる;komaru
+ころ;koro
+ごろ;goro
+こんげつ;kongetsu
+こんしゅう;konshuu
+こんばん;konban
+さあ;saa
+さい;sai
+さかな;sakana
+さく;saku
+さくぶん;sakubun
+さす;sasu
+さつ;satsu
+さとう;satou
+さむい;samui
+さらいねん;sarainen
+さん;san
+さん;san
+し;shi
+じ;ji
+しお;shio
+じかん;jikan
+しごと;shigoto
+じしょ;jisho
+しずか;shizuka
+しち;shichi
+しつもん;shitsumon
+じどうしゃ;jidousha
+しぬ;shinu
+じびき;jibiki
+じぶん;jibun
+しまる;shimaru
+しめる;shimeru
+しめる;shimeru
+じゃ;ja
+じゃあ;jaa
+しゃしん;shashin
+シャツ;shatsu
+じゅう;juu
+しゅうかん;shuukan
+じゅぎょう;jugyou
+じょうず;jouzu
+しょくどう;shokudou
+しる;shiru
+しろい;shiroi
+じん;jin
+すいようび;suiyoubi
+すう;suu
+スカート;sukaato
+すぎ;sugi
+すぐに;suguni
+すこし;sukoshi
+すずしい;suzushii
+ずつ;zutsu
+ストーブ;sutoobu
+スプーン;supuun
+スポーツ;supootsu
+ズボン;zubon
+すむ;sumu
+スリッパ;surippa
+する;suru
+すわる;suwaru
+セーター;seetaa
+せびろ;sebiro
+せまい;semai
+ゼロ;zero
+せんげつ;sengetsu
+せんしゅう;senshuu
+ぜんぶ;zenbu
+そう;sou
+そうじ;souji
+そして;soshite
+そこ;soko
+その;sono
+そば;soba
+そら;sora
+それ;sore
+それから;sorekara
+だい;dai
+だいがく;daigaku
+たいしかん;taishikan
+だいじょうぶ;daijoubu
+たいへん;taihen
+たいへん;taihen
+たかい;takai
+タクシー;takushii
+だす;dasu
+たち;tachi
+たてもの;tatemono
+たのしい;tanoshii
+たのむ;tanomu
+たばこ;tabako
+たべもの;tabemono
+たべる;taberu
+たまご;tamago
+たんじょうび;tanjoubi
+ちいさい;chiisai
+ちがう;chigau
+ちかてつ;chikatetsu
+ちず;chizu
+ちち;chichi
+ちゃいろ;chairo
+ちゅう;chuu
+ついたち;tsuitachi
+つぎ;tsugi
+つくる;tsukuru
+つめたい;tsumetai
+つよい;tsuyoi
+て;te
+テープ;teepu
+テープレコーダー;teepurekoodaa
+テーブル;teeburu
+でかける;dekakeru
+てがみ;tegami
+でぐち;deguchi
+テスト;tesuto
+デパート;depaato
+でも;demo
+でる;deru
+テレビ;terebi
+でんき;denki
+と;to
+ど;do
+ドア;doa
+トイレ;toire
+どう;dou
+とお;too
+とおい;tooi
+とおか;tooka
+ときどき;tokidoki
+ところ;tokoro
+としょかん;toshokan
+とても;totemo
+どの;dono
+とぶ;tobu
+とまる;tomaru
+ともだち;tomodachi
+どようび;doyoubi
+とり;tori
+とりにく;toriniku
+とる;toru
+とる;toru
+どんな;donna
+ない;nai
+ナイフ;naifu
+ながい;nagai
+なく;naku
+なつ;natsu
+なつやすみ;natsuyasumi
+など;nado
+なのか;nanoka
+ならう;narau
+ならぶ;narabu
+ならべる;naraberu
+に;ni
+にく;niku
+にし;nishi
+にち;nichi
+にちようび;nichiyoubi
+にもつ;nimotsu
+ニュース;nyuusu
+にわ;niwa
+にん;nin
+ぬぐ;nugu
+ネクタイ;nekutai
+ねる;neru
+ねん;nen
+ノート;nooto
+のみもの;nomimono
+のむ;nomu
+は;ha
+パーティー;paatii
+はい;hai
+はい;hai
+はいざら;haizara
+はいる;hairu
+はがき;hagaki
+はく;haku
+はこ;hako
+はし;hashi
+はし;hashi
+はじまる;hajimaru
+はじめに;hajimeni
+はじめて;hajimete
+はしる;hashiru
+バス;basu
+バター;bataa
+はたち;hatachi
+はたらく;hataraku
+はち;hachi
+はつか;hatsuka
+はな;hana
+はな;hana
+はなし;hanashi
+はなす;hanasu
+はは;haha
+はやい;hayai
+はやい;hayai
+はる;haru
+はん;han
+ばん;ban
+ばん;ban
+パン;pan
+ハンカチ;hankachi
+ばんごう;bangou
+ばんごはん;bangohan
+ひがし;higashi
+ひき;hiki
+ひく;hiku
+ひく;hiku
+ひこうき;hikouki
+ひだり;hidari
+ひと;hito
+ひとつ;hitotsu
+ひとつき;hitotsuki
+ひゃく;hyaku
+びょういん;byouin
+びょうき;byouki
+ひらがな;hiragana
+ひる;hiru
+ひるごはん;hirugohan
+ひろい;hiroi
+フィルム;firumu
+ふうとう;fuutou
+プール;puuru
+フォーク;fooku
+ふく;fuku
+ふく;fuku
+ふたつ;futatsu
+ぶたにく;butaniku
+ふたり;futari
+ふつか;futsuka
+ふとい;futoi
+ふゆ;fuyu
+ふるい;furui
+ふん;fun
+パージ;paaji
+ベッド;beddo
+へん;hen
+ペン;pen
+ほう;hou
+ぼうし;boushi
+ボールペン;boorupen
+ほか;hoka
+ポケット;poketto
+ほしい;hoshii
+ほそい;hosoi
+ボタン;botan
+ホテル;hoteru
+ほん;hon
+ほん;hon
+ほんだな;hondana
+まい;mai
+まいあさ;maiasa
+まいげつ;maigetsu
+まいつき;maitsuki
+まいしゅう;maishuu
+まいにち;mainichi
+まいねん;mainen
+まいばん;maiban
+まえ;mae
+まがる;magaru
+まち;machi
+まつ;matsu
+マッチ;macchi
+まど;mado
+まるい;marui
+まるい;marui
+まん;man
+まんねんひつ;mannenhitsu
+みぎ;migi
+みじかい;mijikai
+みず;mizu
+みせ;mise
+みせる;miseru
+みち;michi
+みっか;mikka
+みっつ;mittsu
+みなさん;minasan
+みなみ;minami
+みみ;mimi
+みる;miru
+むいか;muika
+むこう;mukou
+むっつ;muttsu
+め;me
+メートル;meetoru
+めがね;megane
+もう;mou
+もう;mou
+もくようび;mokuyoubi
+もつ;motsu
+もっと;motto
+もの;mono
+もん;mon
+や;ya
+やおや;yaoya
+やさい;yasai
+やさしい;yasashii
+やすい;yasui
+やっつ;yattsu
+やま;yama
+ゆうびんきょく;yuubinkyoku
+ゆうべ;yuube
+ゆうめい;yuumei
+ゆき;yuki
+ゆっくり;yukkuri
+ようか;youka
+ようふく;youfuku
+よく;yoku
+よく;yoku
+よこ;yoko
+よっか;yokka
+よっつ;yottsu
+よぶ;yobu
+よむ;yomu
+よる;yoru
+らいしゅう;raishuu
+らいねん;rainen
+ラジオ;rajio
+りょこう;ryokou
+れい;rei
+れいぞうこ;reizouko
+レストラン;resutoran
+れんしゅう;renshuu
+ろく;roku
+ワイシャツ;waishatsu
+わかい;wakai
+わかる;wakaru
+わすれる;wasureru
+わたくし;watakushi
+わたる;wataru
+にせい;nisei
+みつご;mitsugo
+めがみ;megami
+ちしま;chishima
+さゆう;sayuu
+ふあん;fuan
+たしょう;tashou
+ちじん;chijin
+りようする;riyousuru
+いじょう;ijou
+へいわ;heiwa
+ゆらい;yurai
+るてん;ruten
+ほあん;hoan
+るす;rusu
+でんぱ;denpa
+まるた;maruta
+とまる;tomaru
+ひかく;hikaku
+むしゃ;musha
+えもん;emon
+じこ;jiko
+かにゅう;kanyuu
+こうい;koui
+よとう;yotou
+えど;edo
+うちゅう;uchuu
+ちえ;chie
+におうもん;nioumon
+いたり;itari
+しじけい;shijikei
+きゅうす;kyuusu
+のぎざか;nogizaka
+やすし;yasushi
+おける;okeru
+むた;muta
+ねぎ;negi
+くめ;kume
+いど;ido
+にいみ;niimi
+なら;nara
+ぬだ;nuda
+もうふ;moufu
+しつれい;shitsurei
+すんぽう;sunpou
+てんごく;tengoku
+おんち;onchi
+ちゅうごく;chuugoku
+ちゅうこく;chuukoku
+ちゅうてん;chuuten
+ちゅうかい;chuukai
+てんぽ;tenpo
+ほじょきん;hojokin
+ほき;hoki
+たいほ;taiho
+しゃちょう;shachou
+しゅちょう;shuchou
+つうちょう;tsuuchou
+ぼうちょう;bouchou
+ふよ;fuyo
+ふごう;fugou
+ふきん;fukin
+ぎり;giri
+かいぎ;kaigi
+れいぎ;reigi
+せいねん;seinen
+せいけつ;seiketsu
+せいし;seishi
+しんせい;shinsei
+ふぜい;fuzei
+ごにん;gonin
+ごじん;gojin
+かくご;kakugo
+にほんご;nihongo
+はくじん;hakujin
+いっぱく;ippaku
+せっぱく;seppaku
+はくしゅ;hakushu
+はくらいひん;hakuraihin
+はくちゅう;hakuchuu
+ほうちょう;houchou
+てっぽう;teppou
+すいほう;suihou
+かいほう;kaihou
+どうほう;douhou
+ほうしょく;houshoku
+じょうほ;jouho
+どじょう;dojou
+じょうぞう;jouzou
+かのう;kanou
+きかがく;kikagaku
+しゅっか;shukka
+こうか;kouka
+かせん;kasen
+かだん;kadan
+かもつ;kamotsu
+せいか;seika
+じんこう;jinkou
+せいこう;seikou
+せんこう;senkou
+こうこ;kouko
+こうちゃ;koucha
+こうもく;koumoku
+こうけん;kouken
+ぎこう;gikou
+しかいしゃ;shikaisha
+かし;kashi
+しいく;shiiku
+しこう;shikou
+しし;shishi
+きょうかん;kyoukan
+かんり;kanri
+かんしゃ;kansha
+かんちょう;kanchou
+けんやくする;ken_yakusuru
+ぼうけん;bouken
+けんさ;kensa
+けんどう;kendou
+まやく;mayaku
+けんま;kenma
+まじょ;majo
+しかん;shikan
+しゅっし;shusshi
+すんし;sunshi
+せいしん;seishin
+しんちょう;shinchou
+しんし;shinshi
+そせん;sosen
+そぜい;sozei
+そまつ;somatsu
+そし;soshi
+ていきゅう;teikyuu
+かいてい;kaitei
+してい;shitei
+てきせつ;tekisetsu
+てきち;tekichi
+せいてき;seiteki
+してき;shiteki
+いってき;itteki
+さんばい;sanbai
+ばいよう;baiyou
+ばいしょくする;baishokusuru
+ばいしょう;baishou
+はんてい;hantei
+どうはん;douhan
+こうぎ;kougi
+きこう;kikou
+こうにゅう;kounyuu
+はいすいこう;haisuikou
+ほうそうかい;housoukai
+すいそう;suisou
+かいそう;kaisou
+ゆしゅつ;yushutsu
+ゆらく;yuraku
+きょうゆ;kyouyu
+ゆちゃく;yuchaku
+しゅひつ;shuhitsu
+とくしゅ;tokushu
+しんじゅ;shinju
+きゅうしゅう;kyuushuu
+こうきゅう;koukyuu
+ちかん;chikan
+じょうち;jouchi
+どき;doki
+どりょく;doryoku
+えいえんの;eienno
+すいえい;suiei
+えいか;eika
+ふんすい;funsui
+ぎふん;gifun
+こふん;kofun
+ごふく;gofuku
+ごらく;goraku
+ごかい;gokai
+へんしゅう;henshuu
+へんけん;henken
+ふへん;fuhen
+ひょうはく;hyouhaku
+もくひょう;mokuhyou
+じあい;jiai
+じき;jiki
+じよう;jiyou
+しゅってい;shuttei
+かんてい;kantei
+こうてい;koutei
+つうか;tsuuka
+かちゅう;kachuu
+かふく;kafuku
+きすう;kisuu
+きふ;kifu
+きし;kishi
+こうどう;koudou
+こうかい;koukai
+ていこうする;teikousuru
+きょじん;kyojin
+きょひ;kyohi
+きょり;kyori
+かんそう;kansou
+かいそう;kaisou
+ようきゅう;youkyuu
+きゅうきゅうしゃ;kyuukyuusha
+やきゅう;yakyuu
+じゅうに;juuni
+にまんえん;niman_en
+りよう;riyou
+りえん;rien
+げり;geri
+かんりょう;kanryou
+りょうちょう;ryouchou
+りょうよう;ryouyou
+さいくつ;saikutsu
+やさい;yasai
+さいしょくする;saishokusuru
+せんしゃ;sensha
+せんてつ;sentetsu
+しんすい;shinsui
+しんせつな;shinsetsuna
+しんにゅう;shinnyuu
+しんすい;shinsui
+しんしつ;shinshitsu
+ぶんしょう;bunshou
+ひょうしょう;hyoushou
+しょうじ;shouji
+ほんしゅう;honshuu
+ろくだいしゅう;rokudaishuu
+おうしゅう;oushuu
+そうだい;soudai
+ふくそう;fukusou
+そうだん;soudan
+そうがい;sougai
+はんそく;hansoku
+そくりょう;sokuryou
+そくめん;sokumen
+こうたい;koutai
+たいよ;taiyo
+ゆうたい;yuutai
+おうへい;ouhei
+しっぺい;shippei
+ていえん;teien
+やえん;yaen
+しゅびょう;shubyou
+てんびょう;tenbyou
+あいびょう;aibyou
+かてい;katei
+てんかする;tenkasuru
+かどう;kadou
+そまつな;somatsuna
+ほうまつ;houmatsu
+まっさつ;massatsu
+ようし;youshi
+しどう;shidou
+しぼう;shibou
+かいきょう;kaikyou
+へんきょう;henkyou
+きょうげき;kyougeki
+てっきょう;tekkyou
+きょうせい;kyousei
+あいきょう;aikyou
+きろく;kiroku
+がんじつ;ganjitsu
+きかい;kikai
+たいくつ;taikutsu
+きょうりょく;kyouryoku
+きょうはくする;kyouhakusuru
+そうけい;soukei
+どうそう;dousou
+しょうか;shouka
+すいしょう;suishou
+にんじゃ;ninja
+ひにん;hinin
+ていそう;teisou
+ないてい;naitei
+あんしん;anshin
+あんない;annai
+ばっさい;bassai
+はばつ;habatsu
+ばくろ;bakuro
+ばくはつ;bakuhatsu
+ぼうし;boushi
+ぼくさつ;bokusatsu
+ぶれい;burei
+ぶたい;butai
+かちく;kachiku
+ちくでんち;chikudenchi
+しょうちょう;shouchou
+ちょうばつ;choubatsu
+ちょうしょく;choushoku
+まんちょう;manchou
+じどうしゃ;jidousha
+ろうどう;roudou
+かどう;kadou
+しどうする;shidousuru
+ふそく;fusoku
+そくしんする;sokushinsuru
+じが;jiga
+きが;kiga
+ふきゅう;fukyuu
+がくふ;gakufu
+はんれい;hanrei
+はんせん;hansen
+かへい;kahei
+へいがい;heigai
+ひはん;hihan
+ひくつな;hikutsuna
+ひめい;himei
+ほうごう;hougou
+こうほう;kouhou
+ほうゆう;houyuu
+ひょうそうする;hyousousuru
+どひょう;dohyou
+いかん;ikan
+いあん;ian
+じょうもん;joumon
+じょう;jou
+じょうしゃする;joushasuru
+かじょう;kajou
+じゅけんする;jukensuru
+じゅがく;jugaku
+じゅうじする;juujisuru
+そうじゅうする;soujuusuru
+じゅくちょう;jukuchou
+せいじゅく;seijuku
+ちゅうじゅん;chuujun
+じゅんし;junshi
+むじゅん;mujun
+じょじゅつ;jojutsu
+ぎじゅつ;gijutsu
+かいむ;kaimu
+かいきゅう;kaikyuu
+かいけい;kaikei
+かいが;kaiga
+えしゃく;eshaku
+えほん;ehon
+かいしん;kaishin
+きかい;kikai
+ほうかい;houkai
+じゅっかい;jukkai
+かんつうする;kantsuusuru
+こうかん;koukan
+しょうかんする;shoukansuru
+かんげんする;kangensuru
+じゅんかん;junkan
+しゅのう;shunou
+くのう;kunou
+のうずい;nouzui
+おうごん;ougon
+おうだんする;oudansuru
+けいこく;keikoku
+けいらん;keiran
+けんぎする;kengisuru
+ほけん;hoken
+けんちょう;kenchou
+けんしょう;kenshou
+しゅっきん;shukkin
+きんがしんねん;kingashinnen
+げんこう;genkou
+おうこう;oukou
+こうほ;kouho
+こうや;kouya
+きょうこう;kyoukou
+こんしんかい;konshinkai
+かいこん;kaikon
+こっし;kosshi
+こっけい;kokkei
+しんろう;shinrou
+がろう;garou
+くんこう;kunkou
+くんぷう;kunpuu
+へんきゃくする;henkyakusuru
+きゃくほん;kyakuhon
+こきょう;kokyou
+えいきょう;eikyou
+きょうかい;kyoukai
+きょうだい;kyoudai
+がまん;gaman
+まんが;manga
+せつめい;setsumei
+どうめい;doumei
+こくみん;kokumin
+あんみん;anmin
+てんねん;tennen
+かねんせい;kanensei
+かんれき;kanreki
+れきし;rekishi
+のうがっこう;nougakkou
+のうこう;noukou
+きんし;kinshi
+きんど;kindo
+かっそうろ;kassouro
+ろこつ;rokotsu
+しけい;shikei
+げんけい;genkei
+まさつ;masatsu
+そうほう;souhou
+そうえん;souen
+ちたい;chitai
+たいか;taika
+じたく;jitaku
+いたくする;itakusuru
+そうていする;souteisuru
+ていど;teido
+ていこく;teikoku
+ていけつする;teiketsusuru
+りょうてい;ryoutei
+ていし;teishi
+てっていする;tetteisuru
+てっかい;tekkai
+とこう;tokou
+とうとつな;toutotsuna
+さとう;satou
+そうこ;souko
+そうぞう;souzou
+みんよう;min_you
+どうようする;douyousuru
+じゅよう;juyou
+ようぶ;youbu
+ないよう;naiyou
+ようかい;youkai
+ゆうしゅう;yuushuu
+はいゆう;haiyuu
+しゅうき;shuuki
+かき;kaki
+たか;taka
+じぜん;jizen
+しゅうぜんする;shuuzensuru
+ぞう;zou
+そうぞう;souzou
+ぞうしょ;zousho
+しんぞう;shinzou
+しゅくはく;shukuhaku
+しゅくしょうする;shukushousuru
+りょうしょく;ryoushoku
+りゅうどう;ryuudou
+りゅうあん;ryuuan
+さんか;sanka
+ひさん;hisan
+せいど;seido
+せんすい;sensui
+せんろ;senro
+しんせつ;shinsetsu
+せっしゅ;sesshu
+しゃれい;sharei
+ほうしゃ;housha
+もほうする;mohousuru
+いっしょう;isshou
+じょうしょう;joushou
+しょうそう;shousou
+がんしょう;ganshou
+しょうぐん;shougun
+しょうがくきん;shougakukin
+ほしゅ;hoshu
+かんしゃ;kansha
+いかん;ikan
+こよう;koyou
+こもん;komon
+しがいせん;shigaisen
+しゆう;shiyuu
+そつぎょう;sotsugyou
+そっせん;sossen
+とうてい;toutei
+そっとうする;sottousuru
+せいげん;seigen
+きじょう;kijou
+しさい;shisai
+みつぼう;mitsubou
+きんじとう;kinjitou
+とうじょう;toujou
+あっぱく;appaku
+べいこく;beikoku
+べっそう;bessou
+しゅつぼつする;shutsubotsusuru
+こくびゃく;kokubyaku
+さんがつ;sangatsu
+さんかげつ;sankagetsu
+ほうぎょく;hougyoku
+にひゃく;nihyaku
+きょういき;kyouiki
+しゃじく;shajiku
+きちじつ;kichijitsu
+きく;kiku
+しょくもつ;shokumotsu
+どうみゃく;doumyaku
+ていねい;teinei
+ねったい;nettai
+いちにち;ichinichi
+にくしん;nikushin
+ろうにゃく;rounyaku
+とうにょうびょう;tounyoubyou
+こうおつへい;kouotsuhei
+りちぎ;richigi
+ばりき;bariki
+りくじょう;rikujou
+しゅっきんする;shukkinsuru
+たつじん;tatsujin
+しゅうわいする;shuuwaisuru
+ざせき;zaseki
+ぜいきん;zeikin
+ほぞん;hozon
+めつぼう;metsubou
+しだいに;shidaini
+しせい;shisei
+しほん;shihon
+しもん;shimon
+せっとう;settou
+しゃこう;shakou
+こうりょく;kouryoku
+こうがい;kougai
+こうさつ;kousatsu
+しょうかん;shoukan
+しょうわ;shouwa
+しょうめい;shoumei
+しょうせいする;shouseisuru
+しょうかいする;shoukaisuru
+こしょう;koshou
+しょうしょ;shousho
+ちょうか;chouka
+れいじょう;reijou
+れいきゃく;reikyaku
+れいじ;reiji
+でんれい;denrei
+こうれい;kourei
+りょうど;ryoudo
+さくぶん;sakubun
+さくねん;sakunen
+さくさん;sakusan
+さくしゅ;sakushu
+さぎ;sagi
+ぼち;bochi
+きぼ;kibo
+しぼ;shibo
+まくじょう;makujou
+ばくふ;bakufu
+かいまく;kaimaku
+ばくぜん;bakuzen
+ぎせい;gisei
+ふどうさん;fudousan
+くうふく;kuufuku
+ふくめん;fukumen
+りれき;rireki
+がんたん;gantan
+だいたん;daitan
+たんか;tanka
+どたんば;dotanba
+ちゅうしょく;chuushoku
+けいけん;keiken
+けいしょく;keishoku
+かけい;kakei
+けいろ;keiro
+きかいな;kikaina
+しょうぞうが;shouzouga
+しょうか;shouka
+しょうえん;shouen
+てっしょう;tesshou
+しんしゅく;shinshuku
+しんどう;shindou
+さんしん;sanshin
+こうしん;koushin
+くつじょく;kutsujoku
+けんすい;kensui
+すいみん;suimin
+ぼうすい;bousui
+こうくうゆうびん;koukuuyuubin
+さいほう;saihou
+きさい;kisai
+さいばいする;saibaisuru
+せんい;sen_i
+ふくし;fukushi
+ふくし;fukushi
+ぜんぷく;zenpuku
+そうかん;soukan
+かんちょう;kanchou
+ねんかん;nenkan
+らんようする;ran_yousuru
+かんさつ;kansatsu
+かんしょう;kanshou
+こうかん;koukan
+こうぎ;kougi
+こうざん;kouzan
+かくだい;kakudai
+せいじょう;seijou
+じょうみゃく;joumyaku
+そうぎ;sougi
+こどく;kodoku
+えんこ;enko
+すいか;suika
+せんいん;sen_in
+おんいん;on_in
+そんしつ;sonshitsu
+かんじょう;kanjou
+かんにん;kannin
+じんだい;jindai
+たいぐん;taigun
+ぐんかい;gunkai
+くんしゅ;kunshu
+しちょう;shichou
+しまい;shimai
+はいびょう;haibyou
+へきが;hekiga
+びょうへき;byouheki
+ふかひ;fukahi
+いちおくえん;ichiokuen
+きおく;kioku
+ようい;youi
+ほかくする;hokakusuru
+しゅうかく;shuukaku
+ほご;hogo
+もんぶだいじん;monbudaijin
+しもん;shimon
+いっつい;ittsui
+こうせい;kousei
+こうか;kouka
+ゆうびん;yuubin
+きょうあく;kyouaku
+どきょう;dokyou
+りりく;ririku
+こうこう;koukou
+こうぼ;koubo
+きょうじゅ;kyouju
+けいれつ;keiretsu
+けいそう;keisou
+しそん;shison
+ちゅうけん;chuuken
+けんめい;kenmei
+きんちょう;kinchou
+ふきつ;fukitsu
+きつもん;kitsumon
+けつろん;ketsuron
+かつれい;katsurei
+かんかつ;kankatsu
+そんがい;songai
+けいい;keii
+けいさつ;keisatsu
+きょうい;kyoui
+すいじん;suijin
+でいすい;deisui
+さいせき;saiseki
+ろうどく;roudoku
+るろう;rurou
+りょうしん;ryoushin
+えんりょ;enryo
+ほりょ;horyo
+ひふ;hifu
+ほさ;hosa
+だき;daki
+りんりがく;rinrigaku
+ごりん;gorin
+せきにん;sekinin
+にんしん;ninshin
+うんちん;unchin
+げんいん;gen_in
+こんいん;kon_in
+しゃおん;shaon
+たいし;taishi
+かんり;kanri
+しゅくしゃ;shukusha
+しめい;shimei
+しへい;shihei
+ほじゅう;hojuu
+じゅうほう;juuhou
+だいとうりょう;daitouryou
+ふくつう;fukutsuu
+ぶよう;buyou
+しんじつ;shinjitsu
+きんしんする;kinshinsuru
+ちんあつ;chin_atsu
+ざんこく;zankoku
+こうぞう;kouzou
+へいよう;heiyou
+へい;hei
+かびん;kabin
+ちしき;chishiki
+しょくいん;shokuin
+そしき;soshiki
+しょっき;shokki
+いりょう;iryou
+とうほく;touhoku
+とうきょう;toukyou
+けんがく;kengaku
+けんきゅう;kenkyuu
+かいしゃ;kaisha
+あんないする;annaisuru
+でんわばんごう;denwabangou
+ばんごはん;bangohan
+だんせい;dansei
+じょせい;josei
+べんとう;bentou
+ちず;chizu
+だんち;danchi
+ちかてつ;chikatetsu
+としょかん;toshokan
+だいがく;daigaku
+だいじょうぶ;daijoubu
+がいこくじん;gaikokujin
+しぜん;shizen
+しがつ;shigatsu
+しちがつ;shichigatsu
+きゅうにん;kyuunin
+くじ;kuji
+じゅうろく;juuroku
+せんえん;sen_en
+いちまんえん;ichiman_en
+りょこう;ryokou
+かようび;kayoubi
+ぎゅうにゅう;gyuunyuu
+ぼんさい;bonsai
+すいようび;suiyoubi
+もくようび;mokuyoubi
+いっしょうけんめい;isshoukenmei
+ひじょう;hijou
+きんようび;kin_youbi
+ふじさん;fujisan
+にほん;nihon
+どようび;doyoubi
+えいわじてん;eiwajiten
+かんぜん;kanzen
+でんぽう;denpou
+げんき;genki
+かんじ;kanji
+じょうだん;joudan
+げんかん;genkan
+ひみつ;himitsu
+かいだん;kaidan
+じしん;jishin
+ひこうき;hikouki
+じしん;jishin
+きょねん;kyonen
+しょうてん;shouten
+けいおうだいがく;keioudaigaku
+ごぜん;gozen
+けんぶつ;kenbutsu
+ふきん;fukin
+きんえん;kin_en
+こんしゅう;konshuu
+こんど;kondo
+こうじょう;koujou
+こうこく;koukoku
+こうそくどうろ;kousokudouro
+きょうしつ;kyoushitsu
+えいぎょうちゅう;eigyouchuu
+しゃしん;shashin
+きゅうこう;kyuukou
+きゅうりょう;kyuuryou
+まいにち;mainichi
+らいねん;rainen
+しょうがっこう;shougakkou
+しょうばい;shoubai
+しつもん;shitsumon
+しょっけん;shokken
+せいしょ;seisho
+れいぞうこ;reizouko
+れんしゅう;renshuu
+らんぼう;ranbou
+さいふ;saifu
+せいよう;seiyou
+げきじょう;gekijou
+せいふ;seifu
+せんもんか;senmonka
+せんしゅ;senshu
+しゅうてん;shuuten
+せんきょ;senkyo
+せんそう;sensou
+しけん;shiken
+しっぱい;shippai
+たんじょうび;tanjoubi
+とくべつ;tokubetsu
+ゆうめい;yuumei
+やくそく;yakusoku
+ほんやく;hon_yaku
+たいふう;taifuu
+えきちょう;ekichou
+たいへん;taihen
+つごう;tsugou
+げいしゃ;geisha
+ようふく;youfuku
+やっきょく;yakkyoku
+ふとん;futon
+ぜんぶ;zenbu
+だいぶつ;daibutsu
+さんがく;sangaku
+いっかい;ikkai
+さんだい;sandai
+にまい;nimai
+にさつ;nisatsu
+せんだい;sendai
+じゅうにさい;juunisai
+かわいそう;kawaisou
+おきゃくさん;okyakusan
+めんどうな;mendouna
+めいじじだい;meijijidai
+にっこう;nikkou
+ほっかいどう;hokkaidou
+たいわん;taiwan
+えんぴつ;enpitsu
+とくほん;tokuhon
+かじ;kaji
+そふ;sofu
+そぼ;sobo
+じんじゃ;jinja
+びじん;bijin
+くろう;kurou
+おうじ;ouji
+だいいち;daiichi
+ごめん;gomen
+ざぜん;zazen
+ごらん;goran
+ほうそう;housou
+おんせん;onsen
+むり;muri
+かぐ;kagu
+もんぶしょう;monbushou
+おきのどく;okinodoku
+ほどう;hodou
+ちゅういする;chuuisuru
+もくてき;mokuteki
+いご;igo
+たにん;tanin
+てんきよほう;tenkiyohou
+げんざい;genzai
+ぼうえきかいしゃ;bouekikaisha
+かぞく;kazoku
+ごふんごびょう;gofungobyou
+していせき;shiteiseki
+きょういく;kyouiku
+はいけんする;haikensuru
+ぞくご;zokugo
+ぶし;bushi
+ろうじん;roujin
+けんこう;kenkou
+ちゅうかりょうり;chuukaryouri
+めいし;meishi
+きけん;kiken
+かんぱい;kanpai
+じゅっぽん;juppon
+びょういん;byouin
+しゃくはち;shakuhachi
+しちり;shichiri
+いちりん;ichirin
+どうじ;douji
+せいどう;seidou
+どうたい;doutai
+どうさつ;dousatsu
+すいとう;suitou
+とうゆ;touyu
+ちょうこう;choukou
+ちょうやくばん;chouyakuban
+ちょうせん;chousen
+ちょうぼう;choubou
+とうげんきょう;tougenkyou
+とうそう;tousou
+じょうぶつ;joubutsu
+ぜんせい;zensei
+はんじょう;hanjou
+ちゅうせい;chuusei
+じょうない;jounai
+さいばん;saiban
+しぼう;shibou
+もうじゃ;mouja
+ほんもう;honmou
+ぼうねんかい;bounenkai
+たぼう;tabou
+ほうそうもう;housoumou
+もうもく;moumoku
+ちしきそう;chishikisou
+ぜんそう;zensou
+なかそね;nakasone
+ぞうか;zouka
+ぞうしん;zoushin
+きそうする;kisousuru
+ぞうてい;zoutei
+きょうさんしゅぎ;kyousanshugi
+きょうけい;kyoukei
+きょうきゅうする;kyoukyuusuru
+くよう;kuyou
+くうこう;kuukou
+こうずい;kouzui
+けんにん;kennin
+けんじょう;kenjou
+けんぎ;kengi
+きげん;kigen
+れんばい;renbai
+れんぷ;renpu
+しょうがつ;shougatsu
+せいぎ;seigi
+せっしょう;sesshou
+せいばつ;seibatsu
+ほしょう;hoshou
+びょうしょう;byoushou
+いっかつする;ikkatsusuru
+かっしょく;kasshoku
+かっすい;kassui
+えっけん;ekken
+こご;kogo
+こはん;kohan
+こたん;kotan
+きょじゅう;kyojuu
+そうい;soui
+いだい;idai
+けいい;keii
+かんこく;kankoku
+きしゃ;kisha
+ちき;chiki
+きげん;kigen
+せいき;seiki
+きちゅう;kichuu
+おうひ;ouhi
+しんぱいする;shinpaisuru
+きゅうはん;kyuuhan
+はんかん;hankan
+たんもの;tanmono
+てっぱん;teppan
+けいじばん;keijiban
+はんばい;hanbai
+しゅっぱんしゃ;shuppansha
+はんしん;hanshin
+へんじ;henji
+かめん;kamen
+じむ;jimu
+むさん;musan
+じゅうどう;juudou
+にゅうわ;nyuuwa
+ごふん;gofun
+じぶん;jibun
+ふんまつ;funmatsu
+ふんぎ;fungi
+ふんいき;fun_iki
+びんぼう;binbou
+ひんぷ;hinpu
+はんぷ;hanpu
+こっき;kokki
+しょうぎ;shougi
+きほん;kihon
+がっき;gakki
+せんがく;sengaku
+きんせん;kinsen
+じっせん;jissen
+さんばし;sanbashi
+たいぎょう;taigyou
+ぼたい;botai
+ちあん;chian
+げんしてき;genshiteki
+しんかんせん;shinkansen
+かんちょう;kanchou
+しゅうかん;shuukan
+かんがん;kangan
+かんよう;kan_you
+ごけん;goken
+ふけい;fukei
+けいば;keiba
+きょうそう;kyousou
+がいきょう;gaikyou
+しゅくふく;shukufuku
+しゅうぎ;shuugi
+こっき;kokki
+せいめい;seimei
+ひゃくしょう;hyakushou
+しょうぶん;shoubun
+せいざ;seiza
+みょうじょう;myoujou
+でんち;denchi
+しこうする;shikousuru
+ふせ;fuse
+ひにょう;hinyou
+ぶんぴつ;bunpitsu
+ひつよう;hitsuyou
+しゅくふ;shukufu
+ていしゅく;teishuku
+かんとく;kantoku
+せいじゃく;seijaku
+せきせい;sekisei
+ふくいん;fukuin
+あんき;anki
+かいがん;kaigan
+こうかい;koukai
+ばいか;baika
+ぶじょく;bujoku
+びんそくな;binsokuna
+はんえい;han_ei
+ぼうえい;bouei
+ぼうせき;bouseki
+ぼうず;bouzu
+ぼっちゃん;bocchan
+ぼうがい;bougai
+ぼうせん;bousen
+かんぼうちょう;kanbouchou
+ほうめん;houmen
+ほうし;houshi
+ほうもんする;houmonsuru
+かんげき;kangeki
+ふせつ;fusetsu
+かち;kachi
+ほうちする;houchisuru
+せいしょく;seishoku
+しょくぶつえん;shokubutsuen
+ちょくめん;chokumen
+しょうじき;shoujiki
+とうけつ;touketsu
+れんきんじゅつ;renkinjutsu
+ちんれつ;chinretsu
+ちゅうしゃ;chuusha
+でんちゅう;denchuu
+ちゅうしゃじょう;chuushajou
+ちゅうきする;chuukisuru
+しゅじん;shujin
+じゅうしょ;juusho
+おうふく;oufuku
+いしょう;ishou
+しゃしょう;shashou
+しょくどう;shokudou
+じゆう;jiyuu
+せきゆ;sekiyu
+ちゅうしょう;chuushou
+しゅうしゅ;shuushu
+かくじ;kakuji
+せいかく;seikaku
+ないかく;naikaku
+おきゃくさん;okyakusan
+りょかく;ryokaku
+みゃくらく;myakuraku
+らくご;rakugo
+らくのう;rakunou
+りゃくご;ryakugo
+ぜんがく;zengaku
+しゃふつ;shafutsu
+けいさつしょ;keisatsusho
+ざんしょ;zansho
+しょこく;shokoku
+ちょしゃ;chosha
+ちょゆう;choyuu
+じょうちょ;joucho
+きょうと;kyouto
+たいよう;taiyou
+けいよう;keiyou
+だいちょう;daichou
+ねっとう;nettou
+しょうがい;shougai
+こうてつ;koutetsu
+ちつじょ;chitsujo
+はくぶつかん;hakubutsukan
+とばく;tobaku
+はっか;hakka
+そくばく;sokubaku
+ぼき;boki
+しょうてんがい;shoutengai
+かいどう;kaidou
+しょうがい;shougai
+けいひ;keihi
+けいこ;keiko
+かさく;kasaku
+ふうとう;fuutou
+ほうけん;houken
+えつらんしつ;etsuranshitsu
+まんえつ;man_etsu
+えいびん;eibin
+だつぜい;datsuzei
+だいこん;daikon
+かいこん;kaikon
+むげん;mugen
+がんきゅう;gankyuu
+かいげん;kaigen
+ぎんこう;ginkou
+てったい;tettai
+してん;shiten
+しよう;shiyou
+したい;shitai
+ぎのう;ginou
+きろ;kiro
+しょうねん;shounen
+こうしょう;koushou
+しょうろく;shouroku
+はんせい;hansei
+ごびょう;gobyou
+きみょう;kimyou
+ぶあい;buai
+ふ;fu
+れっとうかん;rettoukan
+でし;deshi
+きょうだい;kyoudai
+ひにく;hiniku
+ひがい;higai
+ひがん;higan
+ひろう;hirou
+はさん;hasan
+ろうば;rouba
+はいく;haiku
+せんぱい;senpai
+はいすいかん;haisuikan
+ひかん;hikan
+もんぴ;monpi
+ゆうざい;yuuzai
+じない;jinai
+しじ;shiji
+じじゅう;jijuu
+しじん;shijin
+しょうたい;shoutai
+れっとう;rettou
+とうふ;toufu
+だいず;daizu
+てんねんとう;tennentou
+せんとう;sentou
+とうろく;touroku
+とざん;tozan
+せんとう;sentou
+おんど;ondo
+ずつう;zutsuu
+ほうねん;hounen
+せいちょうな;seichouna
+たんき;tanki
+ようもう;youmou
+ようそう;yousou
+きゅうよう;kyuuyou
+ようぎょう;yougyou
+はっしょうち;hasshouchi
+しょうさい;shousai
+しんせん;shinsen
+にちょうめ;nichoume
+ちょうにん;chounin
+ちょうてん;chouten
+ちょきん;chokin
+でんとう;dentou
+ていせい;teisei
+だとうする;datousuru
+しゅしゃ;shusha
+しゅみ;shumi
+さいしん;saishin
+さつえい;satsuei
+ちく;chiku
+せんく;senku
+おうしゅう;oushuu
+おうだ;ouda
+すうじく;suujiku
+ちょうせいする;chouseisuru
+しょうちょく;shouchoku
+そがい;sogai
+しんらい;shinrai
+しょうちくばい;shouchikubai
+そしょう;soshou
+ろうおう;rouou
+ていあん;teian
+ていぼう;teibou
+よくぼう;yokubou
+よくしつ;yokushitsu
+ゆうこく;yuukoku
+よゆう;yoyuu
+せきじつ;sekijitsu
+こんじゃく;konjaku
+こせき;koseki
+せきはい;sekihai
+さくご;sakugo
+しゃっきん;shakkin
+そち;sochi
+ほうかつ;houkatsu
+べんぜつ;benzetsu
+じてん;jiten
+きゅうけい;kyuukei
+よやく;yoyaku
+よきん;yokin
+じょぶん;jobun
+じょがい;jogai
+そうじ;souji
+じょじし;jojishi
+じょこう;jokou
+とそう;tosou
+とちゅう;tochuu
+よはく;yohaku
+しゅざいする;shuzaisuru
+ざいさん;zaisan
+てんさい;tensai
+へいてん;heiten
+しきしゃ;shikisha
+こうき;kouki
+かいぐん;kaigun
+ろくしょう;rokushou
+ぶしょう;bushou
+しょうじょう;shoujou
+ふしん;fushin
+せいてん;seiten
+かんじょう;kanjou
+ちょうし;choushi
+ちょうぞう;chouzou
+えんしゅう;enshuu
+がいとうしゃ;gaitousha
+だんがい;dangai
+かくしん;kakushin
+じこくひょう;jikokuhyou
+けいざい;keizai
+しょさい;shosai
+せいしょう;seishou
+せんざい;senzai
+だいく;daiku
+ばいう;baiu
+こうあん;kouan
+けんぽう;kenpou
+かんさい;kansai
+とんカツ;tonkatsu
+めいわく;meiwaku
+ばいしん;baishin
+ばいしゅう;baishuu
+どくりつ;dokuritsu
+はいし;haishi
+とち;tochi
+てんのう;tennou
+えんじょ;enjo
+ごけい;gokei
+はけん;haken
+にゅういん;nyuuin
+みょうにち;myounichi
+けしょうしつ;keshoushitsu
+ふうふ;fuufu
+しゅしょう;shushou
+いるい;irui
+ばんざい;banzai
+しそう;shisou
+じんそく;jinsoku
+へいきん;heikin
+じどう;jidou
+かいしゃく;kaishaku
+もんく;monku
+きゅうじつ;kyuujitsu
+しやくしょ;shiyakusho
+ぼしゅう;boshuu
+ばっきん;bakkin
+ちい;chii
+ちょくせつ;chokusetsu
+せけん;seken
+はんだん;handan
+じむようひん;jimuyouhin
+はんとう;hantou
+しゅんかん;shunkan
+しんこうする;shinkousuru
+けいしき;keishiki
+しゅうきょう;shuukyou
+ちょうさ;chousa
+こうちょうかい;kouchoukai
+ちょうそん;chouson
+ちゅうけい;chuukei
+だいじん;daijin
+だかい;dakai
+えんき;enki
+えんぜつ;enzetsu
+ふっこう;fukkou
+げんめい;genmei
+はんい;han_i
+しゅうりょう;shuuryou
+けっしょう;kesshou
+こくばん;kokuban
+きょうみ;kyoumi
+ふっきゅう;fukkyuu
+ふたん;futan
+さくげん;sakugen
+ごうとう;goutou
+じさつ;jisatsu
+ぎょぎょう;gyogyou
+しゅうのう;shuunou
+じゅりつ;juritsu
+ぎょうせい;gyousei
+はんにん;hannin
+けんせつ;kensetsu
+けんちく;kenchiku
+ひりょう;hiryou
+じげん;jigen
+じしん;jishin
+はってん;hatten
+げか;geka
+しょとく;shotoku
+けいき;keiki
+じゅうよう;juuyou
+ひょうろんか;hyouronka
+いらい;irai
+ひてい;hitei
+じじつ;jijitsu
+めいじいしん;meijiishin
+かいかく;kaikaku
+こうきょ;koukyo
+せっしょう;sesshou
+きそ;kiso
+せんでん;senden
+まんかい;mankai
+ようちえん;youchien
+こうきゅう;koukyuu
+しょくたくえん;shokutakuen
+こうげき;kougeki
+りえき;rieki
+ついきゅう;tsuikyuu
+ひよう;hiyou
+かいたく;kaitaku
+けいたい;keitai
+きしょう;kishou
+こんらん;konran
+じょうやく;jouyaku
+じけん;jiken
+いこう;ikou
+かいとう;kaitou
+けいやく;keiyaku
+きそ;kiso
+きょか;kyoka
+とうぎ;tougi
+しんさつ;shinsatsu
+しゅるい;shurui
+きけん;kiken
+せんぷうき;senpuuki
+にほんしゅ;nihonshu
+しりつ;shiritsu
+すうがく;suugaku
+しゅさい;shusai
+ていか;teika
+きんゆう;kin_yuu
+しき;shiki
+ようさん;yousan
+よさん;yosan
+そうさく;sousaku
+とうちゃく;touchaku
+れんぽう;renpou
+こんなん;konnan
+しんりん;shinrin
+とっぱ;toppa
+おせん;osen
+るいぞう;ruizou
+とうひょう;touhyou
+のうりつ;nouritsu
+ぜんしょう;zenshou
+さいがい;saigai
+さいかい;saikai
+あいけん;aiken
+きんぎょばち;kingyobachi
+せっきょく;sekkyoku
+ぜったい;zettai
+しゅうしょく;shuushoku
+たいど;taido
+りゅうがく;ryuugaku
+おうしゅう;oushuu
+きせつ;kisetsu
+ベース;beesu
+へきえき;hekieki
+ぺこぺこ;pekopeko
+ベスト;besuto
+ベストセラー;besutoseraa
+へだたる;hedataru
+へり;heri
+へりくだる;herikudaru
+へる;heru
+べんかい;benkai
+へんかく;henkaku
+へんかん;henkan
+べんぎ;bengi
+へんけん;henken
+べんご;bengo
+へんさい;hensai
+べんしょう;benshou
+へんせん;hensen
+へんとう;hentou
+へんどう;hendou
+べんろん;benron
+ほ;ho
+ほいく;hoiku
+ボイコット;boikotto
+ポイント;pointo
+ほうあん;houan
+ぼうえい;bouei
+ぼうか;bouka
+ほうかい;houkai
+ぼうがい;bougai
+ほうがく;hougaku
+ほうけん;houken
+ほうさく;housaku
+ほうさく;housaku
+ほうし;houshi
+ほうしき;houshiki
+ほうしゃ;housha
+ほうしゃのう;houshanou
+ほうしゅう;houshuu
+ほうしゅつ;houshutsu
+ほうじる;houjiru
+ほうずる;houzuru
+ぼうせき;bouseki
+ぼうぜん;bouzen
+ほうち;houchi
+ぼうちょう;bouchou
+ほうてい;houtei
+ほうどう;houdou
+ぼうとう;boutou
+いもうと;imouto
+さんにん;sannin
+けいざい;keizai
+がくぶ;gakubu
+けいざいがくぶ;keizaigakubu
+さんねんせい;sannensei
+せんもん;senmon
+し;shi
+ろしあご;roshiago
+アジア;ajia
+いちねんせい;ichinensei
+こうこうせい;koukousei
+らいねん;rainen
+にゅうがく;nyuugaku
+にゅうがくする;nyuugakusuru
+あさごはん;asagohan
+たべる;taberu
+コーヒー;koohii
+すきだ;sukida
+きらいだ;kiraida
+こうちゃ;koucha
+ひるごはん;hirugohan
+しょくどう;shokudou
+ばんごはん;bangohan
+どようび;doyoubi
+よる;yoru
+ときどき;tokidoki
+くる;kuru
+はなしあう;hanashiau
+にちようび;nichiyoubi
+テレビ;terebi
+みる;miru
+ラジオ;rajio
+きく;kiku
+しゅうまつ;shuumatsu
+くがつ;kugatsu
+あさ;asa
+ばん;ban
+いちじはん;ichijihan
+だいさんか;daisanka
+まいあさ;maiasa
+そんな;sonna
+いかなる;ikanaru
+おおきな;ookina
+ちいさな;chiisana
+おえる;oeru
+おみやげ;omiyage
+にほんてきだ;nihontekida
+ほしい;hoshii
+とくちょう;tokuchou
+みんげい;mingei
+ほうふだ;houfuda
+ちかどう;chikadou
+そのまま;sonomama
+ちか;chika
+よう;you
+かていようひん;kateiyouhin
+ふじん;fujin
+いっぱいだ;ippaida
+そこ;soko
+とおりぬける;toorinukeru
+エスカレーター;esukareetaa
+アクセサリー;akusesarii
+ハンドバッグ;handobaggu
+ハンカチ;hankachi
+ベルト;beruto
+そうしんぐ;soushingu
+やくひん;yakuhin
+けしょうひん;keshouhin
+うりば;uriba
+しんじゅ;shinju
+ネックレス;nekkuresu
+そのかわりに;sonokawarini
+じょうひんだ;jouhinda
+すてきだ;sutekida
+きぬ;kinu
+スカーフ;sukaafu
+あか;aka
+きいろ;kiiro
+みどりいろ;midoriiro
+デザイン;dezain
+つつむ;tsutsumu
+に、さんぷん;ni_sanpun
+ブルー;buruu
+おれんじいろ;orenjiiro
+リボン;ribon
+むすぶ;musubu
+はこ;hako
+スカート;sukaato
+ブラウス;burausu
+スーツ;suutsu
+コート;kooto
+パンタロン;pantaron
+サイズ;saizu
+ようふく;youfuku
+きじ;kiji
+さんかい;sankai
+しんし;shinshi
+したぎ;shitagi
+きもの;kimono
+おび;obi
+め;me
+うつる;utsuru
+えんぴつ;enpitsu
+けしごむ;keshigomu
+がくようひん;gakuyouhin
+まんねんひつ;mannenhitsu
+ボールペン;boorupen
+じむようひん;jimuyouhin
+カメラ;kamera
+ちゅうがくせい;chuugakusei
+こんざつ;konzatsu
+こんざつする;konzatsusuru
+ほうせき;houseki
+ききんぞく;kikinzoku
+かく;kaku
+しんるい;shinrui
+おおよろこびだ;ooyorokobida
+とうほく;touhoku
+とうほくちほう;touhokuchihou
+こけしにんぎょう;kokeshiningyou
+かわいらしい;kawairashii
+にする;nisuru
+しょさい;shosai
+かざる;kazaru
+もってくる;mottekuru
+こけし;kokeshi
+でございます;degozaimasu
+ございません;gozaimasen
+すこしおまちください;sukoshiomachikudasai
+コーヒースタンド;koohiisutando
+ひとつ;hitotsu
+ふたつ;futatsu
+みっつ;mittsu
+よっつ;yottsu
+いつつ;itsutsu
+むっつ;muttsu
+やっつ;yattsu
+ここのつ;kokonotsu
+とお;too
+ひき;hiki
+ほん;hon
+けん;ken
+だい;dai
+き;ki
+はい;hai
+つう;tsuu
+こ;ko
+わ;wa
+とう;tou
+そう;sou
+せき;seki
+りょう;ryou
+ちゃく;chaku
+そく;soku
+いつか;itsuka
+にじゅうくにち;nijuukunichi
+てんのう;tennou
+みっか;mikka
+けんぽう;kenpou
+きねん;kinen
+きねんする;kinensuru
+きねんび;kinenbi
+こうきゅうび;koukyuubi
+いのうえ;inoue
+やくしょ;yakusho
+はなや;hanaya
+よる;yoru
+しろ;shiro
+カーネーション;kaaneeshon
+おかしや;okashiya
+チョコレート;chokoreeto
+ひとはこ;hitohako
+とうよこせん;touyokosen
+でんえんちょうふ;den_enchoufu
+みちじゅん;michijun
+みせる;miseru
+みち;michi
+たずねる;tazuneru
+でぐち;deguchi
+みつける;mitsukeru
+あまり;amari
+あし;ashi
+まつ;matsu
+みごとだ;migotoda
+うわる;uwaru
+いりぐち;iriguchi
+もん;mon
+こえ;koe
+こえをかける;koewokakeru
+とつぜん;totsuzen
+いぬ;inu
+げんかん;genkan
+ほえる;hoeru
+とびら;tobira
+あんしん;anshin
+あんしんする;anshinsuru
+ねこ;neko
+とり;tori
+ことり;kotori
+かう;kau
+わらう;warau
+しょくぶつ;shokubutsu
+うえる;ueru
+そだてる;sodateru
+くつ;kutsu
+ぬぐ;nugu
+むすこ;musuko
+むすめ;musume
+おじょうさん;ojousan
+とし;toshi
+うえの;ueno
+どうぶつえん;doubutsuen
+パンダ;panda
+ちょうきてきだ;choukitekida
+こっかけいかくけいざい;kokkakeikakukeizai
+すすめる;susumeru
+きき;kiki
+インフレ;infure
+じつげん;jitsugen
+じつげんする;jitsugensuru
+おいでになる;oideninaru
+こうさくきかい;kousakukikai
+ぼうせききかい;bousekikikai
+ちんぎん;chingin
+おはなしをうかがう;ohanashiwoukagau
+おたずねする;otazunesuru
+つごう;tsugou
+つごうをつける;tsugouwotsukeru
+けいひんちたい;keihinchitai
+じそく;jisoku
+はやさ;hayasa
+げしゃ;gesha
+げしゃする;geshasuru
+おんなのこ;onnanoko
+ひとりむすめ;hitorimusume
+だいきらいだ;daikiraida
+おとこのこ;otokonoko
+あきらめる;akirameru
+こぼす;kobosu
+おば;oba
+けんきゅうじょ;kenkyuujo
+けんきゅういん;kenkyuuin
+ばかりする;bakarisuru
+わ;wa
+の;no
+すると;suruto
+しんゆう;shin_yuu
+だいじ;daiji
+だいじだ;daijida
+ふこう;fukou
+ふこうだ;fukouda
+み;mi
+むらかみ;murakami
+やまがたけん;yamagataken
+まずしい;mazushii
+ちょうなん;chounan
+ぶっしつてきだ;busshitsutekida
+せいさく;seisaku
+こうふく;koufuku
+けってん;ketten
+こうせいしょう;kouseishou
+こうえい;kouei
+りんじ;rinji
+ぎゃくてん;gyakuten
+しさつ;shisatsu
+ぼくし;bokushi
+あくま;akuma
+よういな;youina
+いいんかい;iinkai
+てんじょう;tenjou
+はちじょう;hachijou
+どくせん;dokusen
+かいさつぐち;kaisatsuguchi
+しつれん;shitsuren
+かんごふ;kangofu
+せんこう;senkou
+てつがく;tetsugaku
+かんげい;kangei
+いっせき;isseki
+はいけい;haikei
+かんじゃ;kanja
+そんちょう;sonchou
+じごく;jigoku
+せいれい;seirei
+えんかい;enkai
+こうし;koushi
+ほうしん;houshin
+はくぼく;hakuboku
+ちんもく;chinmoku
+しゅりょう;shuryou
+どれい;dorei
+もうけん;mouken
+いんさつ;insatsu
+がんせき;ganseki
+だんぼう;danbou
+かんぷう;kanpuu
+せきたん;sekitan
+しっけ;shikke
+しんとう;shintou
+かくじつ;kakujitsu
+きぎょう;kigyou
+さんせい;sansei
+せいめい;seimei
+しゃっかん;shakkan
+しじ;shiji
+しっこう;shikkou
+しょぶん;shobun
+しょうにん;shounin
+しょぞく;shozoku
+たいしゅう;taishuu
+はんちょう;hanchou
+すいせん;suisen
+ゆうかい;yuukai
+うよく;uyoku
+れんぞく;renzoku
+けいこう;keikou
+はけん;haken
+しょうかせん;shoukasen
+しょうだく;shoudaku
+はいせき;haiseki
+すてき;suteki
+しゅうげき;shuugeki
+ゆいごん;yuigon
+たんてい;tantei
+こうてい;koutei
+じゅんび;junbi
+しゅうり;shuuri
+さらいねん;sarainen
+くんれん;kunren
+きこく;kikoku
+へいたい;heitai
+ゆうじん;yuujin
+いみん;imin
+だとう;datou
+しんこう;shinkou
+しゅうじん;shuujin
+げいのうかい;geinoukai
+げた;geta
+むだ;muda
+えきたい;ekitai
+じゃくにくきょうしょく;jakunikukyoushoku
+びしょう;bishou
+こくじ;kokuji
+べいこく;beikoku
+ばくしゅ;bakushu
+げんきん;genkin
+りゅうさん;ryuusan
+ひょうざん;hyouzan
+ゆうき;yuuki
+だいいっかん;daiikkan
+こうたんさい;koutansai
+とくがわじだい;tokugawajidai
+ばいしゅん;baishun
+ゆうじょ;yuujo
+しんそう;shinsou
+ごくひ;gokuhi
+きぞく;kizoku
+けっぱく;keppaku
+びおん;bion
+きゅうそく;kyuusoku
+じんけん;jinken
+とうみん;toumin
+どうがん;dougan
+けっきょじん;kekkyojin
+いんりょく;inryoku
+かんこんそうさい;kankonsousai
+こうふん;koufun
+いちょう;ichou
+かいかつ;kaikatsu
+ひめい;himei
+きょくせつ;kyokusetsu
+しゅうい;shuui
+いじょう;ijou
+さべつ;sabetsu
+こうひょう;kouhyou
+よか;yoka
+たいこく;taikoku
+とうあ;toua
+ししょう;shishou
+おくじょうおくをかする;okujouokuwokasuru
+へん;hen
+けいひんせん;keihinsen
+せいかん;seikan
+とにかく;tonikaku
+せきはん;sekihan
+こうはん;kouhan
+らっかんしゅぎ;rakkanshugi
+べんぎしゅぎ;bengishugi
+きょうらくしゅぎ;kyourakushugi
+ゆいぶつろん;yuibutsuron
+つや;tsuya
+にほんとう;nihontou
+せんじょうのたん;senjounotan
+どくしょきょう;dokushokyou
+じもく;jimoku
+さっそく;sassoku
+そうそう;sousou
+そうそう;sousou
+げこ;geko
+じょうご;jougo
+はくちょう;hakuchou
+こうよう;kouyou
+ばか;baka
+いんしょく;inshoku
+なんぼく;nanboku
+うんすい;unsui
+じすい;jisui
+じょさいない;josainai
+こうけつあつ;kouketsuatsu
+ぎし;gishi
+じじょうじばく;jijoujibaku
+かくせいざい;kakuseizai
+ほうおう;houou
+じゅんぽうすと;junpousuto
+ひぎょう;higyou
+ふくだけ;fukudake
+きどうにのる;kidouninoru
+かいぞくばん;kaizokuban
+そんざいりゆう;sonzairiyuu
+こうごうへいか;kougouheika
+がじょう;gajou
+きじゅ;kiju
+はいけい;haikei
+だんがんれっしゃ;danganressha
+すいでん;suiden
+きょうみしんしんする;kyoumishinshinsuru
+せっしょく;sesshoku
+きしょう;kishou
+てんこ;tenko
+ふりょく;furyoku
+しゅういつな;shuuitsuna
+ほうせき;houseki
+いあつてきな;iatsutekina
+めんか;menka
+たいこばん;taikoban
+あくしゅ;akushu
+あくしゅう;akushuu
+ちょうでん;chouden
+はんしょう;hanshou
+まてんろう;matenrou
+めいよきょうじゅ;meiyokyouju
+けっさく;kessaku
+じゅうい;juui
+たんれん;tanren
+じさつみすい;jisatsumisui
+かいはくしょく;kaihakushoku
+ごうゆうする;gouyuusuru
+ふうりん;fuurin
+ちょうちょうふじん;chouchoufujin
+ちち;chichi
+たんたん;tantan
+りゅうりゅう;ryuuryuu
+だくおん;dakuon
+せんりゅう;senryuu
+しつるい;shitsurui
+ろうきゅう;roukyuu
+とろ;toro
+さっきん;sakkin
+しこん;shikon
+らくらい;rakurai
+こうおつへいてい;kouotsuheitei
+いちもうだじん;ichimoudajin
+きんにくろうどう;kinnikuroudou
+いっしょくそくはつ;isshokusokuhatsu
+ひけん;hiken
+けつるい;ketsurui
+きょうさいか;kyousaika
+しちや;shichiya
+たいすい;taisui
+かんこつだったいする;kankotsudattaisuru
+しっこく;shikkoku
+すいとう;suitou
+かんさんしんくかん;kansanshinkukan
+よくよう;yokuyou
+ろうでん;rouden
+ほくとしちせい;hokutoshichisei
+かっこう;kakkou
+こんたん;kontan
+らんそう;ransou
+えん;en
+げいいんばしょく;geiinbashoku
+しゆうをけっする;shiyuuwokessuru
+とうき;touki
+とうすい;tousui
+かんとうしょう;kantoushou
+ぎしんあんき;gishin_anki
+ここう;kokou
+しっぷうじんらいてき;shippuujinraiteki
+りゅうず;ryuuzu
+ばいしゃくけっこん;baishakukekkon
+とうほんせいそう;touhonseisou
+きかん;kikan
+けいこうでんとう;keikoudentou
+ウーロンちゃ;uuroncha
+めんぼく;menboku
+ようき;youki
+いんき;inki
+やくどし;yakudoshi
+かん;kan
+らんがい;rangai
+ひょうり;hyouri
+ゆうよ;yuuyo
+へいこう;heikou
+けんしん;kenshin
+ちんみ;chinmi
+きょぎ;kyogi
+さこく;sakoku
+だんぺん;danpen
+ひんど;hindo
+そうにゅう;sounyuu
+りょうぼ;ryoubo
+しとう;shitou
+じゅんかい;junkai
+そうしょく;soushoku
+せいぎょ;seigyo
+ゆせい;yusei
+もうそう;mousou
+もうらする;mourasuru
+ふにん;funin
+のうこう;noukou
+こうそく;kousoku
+こんきょ;konkyo
+とくしょく;tokushoku
+ゆうぜん;yuuzen
+びょうとう;byoutou
+ひじゅん;hijun
+じゃっかん;jakkan
+しゃだん;shadan
+じょうはつ;jouhatsu
+へいぼん;heibon
+きょくたん;kyokutan
+ねんど;nendo
+せんかい;senkai
+おんわ;onwa
+きんこう;kinkou
+ひんかく;hinkaku
+ちょうえつ;chouetsu
+しっそ;shisso
+じゅうたい;juutai
+びしゅう;bishuu
+こちょう;kochou
+しゅつじん;shutsujin
+すうはい;suuhai
+りんじん;rinjin
+せんせい;sensei
+とうすい;tousui
+ほうよう;houyou
+かくねん;kakunen
+がっしゅく;gasshuku
+けんびきょう;kenbikyou
+かいじょう;kaijou
+こうそ;kouso
+てんぷ;tenpu
+ばんそう;bansou
+じゅんきん;junkin
+きょうかん;kyoukan
+そうどう;soudou
+ごうもん;goumon
+まいぼつ;maibotsu
+せんたく;sentaku
+いっち;icchi
+きがん;kigan
+とうめい;toumei
+けんない;kennai
+かんよう;kan_you
+もはん;mohan
+じゅんしょく;junshoku
+しゃめん;shamen
+ちじょく;chijoku
+しょうこ;shouko
+けいだい;keidai
+きんぱつ;kinpatsu
+ついらく;tsuiraku
+ざんてい;zantei
+ぎゃくさつ;gyakusatsu
+ぶんせき;bunseki
+げっぷ;geppu
+きゅうだん;kyuudan
+せいぼ;seibo
+ついとう;tsuitou
+じしゃく;jishaku
+そぞう;sozou
+なっとう;nattou
+しんまい;shinmai
+こんちゅう;konchuu
+しさ;shisa
+じんぐう;jinguu
+さんがく;sangaku
+ていそう;teisou
+げんしろ;genshiro
+かえん;kaen
+ついせき;tsuiseki
+だらく;daraku
+ようす;yousu
+にょうぼう;nyoubou
+ちょうなん;chounan
+ちくら;chikura
+ぶようじん;buyoujin
+びょうどう;byoudou
+さぎょう;sagyou
+すいとう;suitou
+しょうに;shouni
+ぞうに;zouni
+うもう;umou
+ひょうし;hyoushi
+だんじき;danjiki
+きゅうでん;kyuuden
+かいぼう;kaibou
+いしょく;ishoku
+こんきゅう;konkyuu
+へんせん;hensen
+よくじつ;yokujitsu
+むちゅう;muchuu
+きゅうどう;kyuudou
+ばつぐん;batsugun
+じんぎ;jingi
+ぜんじ;zenji
+じんもん;jinmon
+そうしつ;soushitsu
+かし;kashi
+げんそう;gensou
+かんわ;kanwa
+えきびょう;ekibyou
+なんか;nanka
+ちっそく;chissoku
+しゃめん;shamen
+しょうれいきん;shoureikin
+かんぼつ;kanbotsu
+ちくいち;chikuichi
+きとく;kitoku
+どんぶつ;donbutsu
+やばん;yaban
+ちゅうてつ;chuutetsu
+しゅんさい;shunsai
+がんちく;ganchiku
+ひやく;hiyaku
+ゆうげん;yuugen
+かっせん;kassen
+ひろうえん;hirouen
+あいしょう;aishou
+じゅうまんえん;juuman_en
+ゆうぎ;yuugi
+はあく;haaku
+ざんこく;zankoku
+じしゅく;jishuku
+じょうじゅ;jouju
+むほん;muhon
+さいしょう;saishou
+おせちりょうり;osechiryouri
+あいそ;aiso
+しゅじゅう;shujuu
+たんざく;tanzaku
+せんぼう;senbou
+ねんぐ;nengu
+きょうしゃ;kyousha
+いっさい;issai
+すき;suki
+くでん;kuden
+きんじょう;kinjou
+ちょうもん;choumon
+だいみょう;daimyou
+げし;geshi
+ていさい;teisai
+こんりゅう;konryuu
+ひょうろう;hyourou
+くないちょう;kunaichou
+ゆさん;yusan
+ぞうお;zouo
+だいおんじょう;daionjou
+そうしょう;soushou
+したく;shitaku
+うむ;umu
+しゃくどう;shakudou
+らいさん;raisan
+じゅみょう;jumyou
+そうさい;sousai
+りょうし;ryoushi
+ふってい;futtei
+ばちあたり;bachiatari
+ぶぎょう;bugyou
+けねん;kenen
+やくびょうがみ;yakubyougami
+こんせき;konseki
+かんおうかい;kan_oukai
+かんきゅう;kankyuu
+いっし;isshi
+さきゅう;sakyuu
+すいじょう;suijou
+かんぱん;kanpan
+すいそう;suisou
+しゅうじゃく;shuujaku
+しんおう;shin_ou
+ごうしゃ;gousha
+はっと;hatto
+しりょう;shiryou
+ちん;chin
+こうたい;koutai
+しょうぞく;shouzoku
+じょせい;josei
+しんぼく;shinboku
+きんけい;kinkei
+こうかく;koukaku
+はんざつ;hanzatsu
+こくう;kokuu
+ごてん;goten
+かんきゃく;kankyaku
+けいてき;keiteki
+ぎょうてんする;gyoutensuru
+すいじゃく;suijaku
+きんせん;kinsen
+はいはん;haihan
+どしゃほうかい;doshahoukai
+さんか;sanka
+れいげん;reigen
+ちょうえき;choueki
+くおん;kuon
+さいご;saigo
+こうし;koushi
+けびょう;kebyou
+いんきょ;inkyo
+てんにょ;tennyo
+ゆいしょ;yuisho
+いいだくだく;iidakudaku
+しんしんこうじゃく;shinshinkoujaku
+ばっし;basshi
+いっこん;ikkon
+なや;naya
+たいぼく;taiboku
+なんど;nando
+ひってき;hitteki
+とつめんきょう;totsumenkyou
+おうめんきょう;oumenkyou
+けんし;kenshi
+とうは;touha
+りゅうき;ryuuki
+せいりょうざい;seiryouzai
+どんてん;donten
+ぎょうてん;gyouten
+はいちゃく;haichaku
+じゅんぽう;junpou
+せんぷくする;senpukusuru
+えんぶん;enbun
+かほう;kahou
+しゅうてい;shuutei
+ぼうげん;bougen
+へんれいする;henreisuru
+ちゅうとんする;chuutonsuru
+ちょうてい;choutei
+いんとく;intoku
+しんりょく;shinryoku
+ふうき;fuuki
+くどく;kudoku
+せいきょ;seikyo
+しぎん;shigin
+いっこく;ikkoku
+いっしゃく;isshaku
+いっきん;ikkin
+じじん;jijin
+しんく;shinku
+せきせつ;sekisetsu
+きゅうじ;kyuuji
+こうずか;kouzuka
+げんち;genchi
+くとうてん;kutouten
+しんか;shinka
+しょうよう;shouyou
+いちないしじゅう;ichinaishijuu
+じゅんぼく;junboku
+せつれつ;setsuretsu
+はんも;hanmo
+らくいんきょ;rakuinkyo
+ちゅうしん;chuushin
+いかく;ikaku
+たんせい;tansei
+しょみん;shomin
+だんしゃく;danshaku
+ちゅうよう;chuuyou
+しょうにん;shounin
+えま;ema
+くり;kuri
+ごりやく;goriyaku
+ごんぎょう;gongyou
+せっしょうかい;sesshoukai
+きえ;kie
+ぼんのう;bonnou
+しゅくごう;shukugou
+ろくやおん;rokuyaon
+けごんぎょう;kegongyou
+げだつ;gedatsu
+えしん;eshin
+にそう;nisou
+しゅぎょう;shugyou
+なむあみだぶつ;namuamidabutsu
+おしょう;oshou
+にょらい;nyorai
+あんぎゃ;angya
+しゅじょう;shujou
+えはつ;ehatsu
+ほっしん;hosshin
+せっしゅ;sesshu
+こうぼうだいし;kouboudaishi
+かくりつ;kakuritsu
+がくれき;gakureki
+かけ;kake
+かけ;kake
+かけ;kake
+がけ;gake
+かけあし;kakeashi
+かけい;kakei
+かけっこ;kakekko
+かける;kakeru
+かける;kakeru
+かこう;kakou
+かごう;kagou
+かさばる;kasabaru
+かさむ;kasamu
+かじょうがき;kajougaki
+かしら;kashira
+かすか;kasuka
+かすむ;kasumu
+かする;kasuru
+かせい;kasei
+かせき;kaseki
+かせん;kasen
+かせん;kasen
+かそ;kaso
+かた;kata
+かだい;kadai
+がたい;gatai
+かたこと;katakoto
+かたづけ;kataduke
+かたむける;katamukeru
+かためる;katameru
+かたわら;katawara
+かだん;kadan
+かちく;kachiku
+かつ;katsu
+かっき;kakki
+がっくり;gakkuri
+がっしょう;gasshou
+がっしり;gasshiri
+がっち;gacchi
+がっちり;gacchiri
+かつて;katsute
+かって;katte
+カット;katto
+かっぱつ;kappatsu
+カップ;kappu
+がっぺい;gappei
+カテゴリー;kategorii
+かなう;kanau
+かなえる;kanaeru
+かなづち;kanaduchi
+かなわない;kanawanai
+かにゅう;kanyuu
+かねて;kanete
+かばう;kabau
+かぶしき;kabushiki
+かぶれる;kabureru
+かふん;kafun
+かへい;kahei
+かまえる;kamaeru
+かみ;kami
+かみつ;kamitsu
+かみきる;kamikiru
+カムバック;kamubakku
+カメラマン;kameraman
+かゆ;kayu
+からだつき;karadatsuki
+からむ;karamu
+かり;kari
+かり;kari
+かりに;karini
+カルテ;karute
+カレー;karee
+ガレージ;gareeji
+かろう;karou
+かろうじて;karoujite
+かわす;kawasu
+かわるがわる;kawarugawaru
+かん;kan
+かん;kan
+かん;kan
+がん;gan
+かんい;kan_i
+かんがい;kangai
+がんか;ganka
+がんきゅう;gankyuu
+がんぐ;gangu
+かんけつ;kanketsu
+かんげん;kangen
+かんご;kango
+かんご;kango
+がんこ;ganko
+かんこう;kankou
+かんこう;kankou
+かんこく;kankoku
+かんさん;kansan
+かんし;kanshi
+かんしゅう;kanshuu
+かんしゅう;kanshuu
+がんしょ;gansho
+かんしょう;kanshou
+がんじょう;ganjou
+かんしょく;kanshoku
+かんじん;kanjin
+かんじん;kanjin
+かんせい;kansei
+かんぜい;kanzei
+がんせき;ganseki
+かんせん;kansen
+かんせん;kansen
+かんそ;kanso
+かんてん;kanten
+かんど;kando
+カンニング;kanningu
+がんねん;gannen
+かんぶ;kanbu
+かんぺき;kanpeki
+かんべん;kanben
+かんむりょう;kanmuryou
+かんゆう;kan_yuu
+かんよ;kan_yo
+かんよう;kan_you
+がんらい;ganrai
+かんらん;kanran
+かんりょう;kanryou
+かんれい;kanrei
+かんれき;kanreki
+かんろく;kanroku
+かんわ;kanwa
+ぎあん;gian
+きがい;kigai
+きかく;kikaku
+きかく;kikaku
+きかざる;kikazaru
+きがね;kigane
+きがる;kigaru
+きかん;kikan
+きかん;kikan
+きき;kiki
+ききとり;kikitori
+ききめ;kikime
+ききょう;kikyou
+ぎきょく;gikyoku
+ききん;kikin
+きげき;kigeki
+ぎけつ;giketsu
+きけん;kiken
+きげん;kigen
+きこう;kikou
+きこん;kikon
+きざ;kiza
+きさい;kisai
+きざし;kizashi
+きしつ;kishitsu
+きじつ;kijitsu
+きしむ;kishimu
+ぎじどう;gijidou
+きじゅつ;kijutsu
+きしょう;kishou
+きずく;kizuku
+きずつく;kizutsuku
+きずつける;kizutsukeru
+きせい;kisei
+ぎせい;gisei
+きせん;kisen
+きぞう;kizou
+ぎぞう;gizou
+きぞく;kizoku
+ぎだい;gidai
+きたえる;kitaeru
+きだて;kidate
+あ;a
+あいそう;aisou
+あいだがら;aidagara
+あいま;aima
+あえて;aete
+あおぐ;aogu
+あか;aka
+あかじ;akaji
+あかす;akasu
+あからむ;akaramu
+あがり;agari
+あきらめ;akirame
+あく;aku
+アクセル;akuseru
+あくどい;akudoi
+あご;ago
+あこがれ;akogare
+あさ;asa
+あざ;aza
+あさましい;asamashii
+あざむく;azamuku
+あざやか;azayaka
+あざわらう;azawarau
+あしからず;ashikarazu
+あじわい;ajiwai
+あせる;aseru
+あせる;aseru
+あたい;atai
+あたいする;ataisuru
+あたり;atari
+あっか;akka
+あつかい;atsukai
+あっけない;akkenai
+あっさり;assari
+あっせん;assen
+あっとう;attou
+あっぱく;appaku
+アップ;appu
+あつらえる;atsuraeru
+あつりょく;atsuryoku
+あて;ate
+あて;ate
+あてじ;ateji
+あてる;ateru
+あとつぎ;atotsugi
+あとまわし;atomawashi
+あぶらえ;aburae
+アプローチ;apuroochi
+あべこべ;abekobe
+あまえる;amaeru
+あまぐ;amagu
+あまくち;amakuchi
+アマチュア;amachua
+あみ;ami
+あやつる;ayatsuru
+あやぶむ;ayabumu
+あやふや;ayafuya
+あやまち;ayamachi
+あやまる;ayamaru
+あゆみ;ayumi
+あゆむ;ayumu
+あらかじめ;arakajime
+あらす;arasu
+あらそい;arasoi
+あらたまる;aratamaru
+あらっぽい;arappoi
+アラブ;arabu
+あられ;arare
+ありさま;arisama
+ありのまま;arinomama
+ありふれる;arifureru
+アルカリ;arukari
+アルコール;arukooru
+アルミ;arumi
+アワー;awaa
+あわす;awasu
+あわせ;awase
+アンケート;ankeeto
+アンコール;ankooru
+あんさつ;ansatsu
+あんざん;anzan
+あんじ;anji
+あんじる;anjiru
+あんせい;ansei
+あんのじょう;annojou
+い;i
+い;i
+いいかげん;iikagen
+いいわけ;iiwake
+いいん;iin
+イェス;yesu
+いえで;iede
+いかす;ikasu
+いかに;ikani
+いかにも;ikanimo
+いかり;ikari
+いき;iki
+いぎ;igi
+いきがい;ikigai
+いきちがい;ikichigai
+いきごむ;ikigomu
+いくせい;ikusei
+いくた;ikuta
+いける;ikeru
+いけん;iken
+いこう;ikou
+いこう;ikou
+いざ;iza
+いじ;iji
+いじゅう;ijuu
+いしょう;ishou
+いじる;ijiru
+いせい;isei
+いせき;iseki
+いぜん;izen
+いぞん;izon
+いたく;itaku
+いただき;itadaki
+いたって;itatte
+いためる;itameru
+いためる;itameru
+いたわる;itawaru
+いち;ichi
+いちがいに;ichigaini
+いちじるしい;ichijirushii
+いちどう;ichidou
+いちぶぶん;ichibubun
+いちべつ;ichibetsu
+いちめん;ichimen
+いちもく;ichimoku
+いちよう;ichiyou
+いちりつ;ichiritsu
+いちれん;ichiren
+いっかつ;ikkatsu
+いっき;ikki
+いっきょに;ikkyoni
+いっけん;ikken
+いっさい;issai
+いっしん;isshin
+いっそ;isso
+いったい;ittai
+いっぺん;ippen
+いと;ito
+いどう;idou
+いとなむ;itonamu
+いどむ;idomu
+いなびかり;inabikari
+いのり;inori
+いびき;ibiki
+いまさら;imasara
+いまだ;imada
+いみん;imin
+いやいや;iyaiya
+いやしい;iyashii
+いやに;iyani
+いやらしい;iyarashii
+いよく;iyoku
+いりょう;iryou
+いりょく;iryoku
+いるい;irui
+いろん;iron
+いんかん;inkan
+いんき;inki
+いんきょ;inkyo
+インターチェンジ;intaachenji
+インターナショナル;intaanashonaru
+インターフォン;intaafon
+インテリ;interi
+インフォメーション;infomeeshon
+インフレ;infure
+うかる;ukaru
+うけいれ;ukeire
+うけいれる;ukeireru
+うけつぐ;uketsugu
+うけつける;uketsukeru
+うけとめる;uketomeru
+うけみ;ukemi
+うけもち;ukemochi
+うごき;ugoki
+うず;uzu
+うずめる;uzumeru
+うそつき;usotsuki
+うたたね;utatane
+うちあける;uchiakeru
+うちきる;uchikiru
+うちけし;uchikeshi
+うちこむ;uchikomu
+うちわ;uchiwa
+うちわけ;uchiwake
+うつし;utsushi
+うったえ;uttae
+うっとうしい;uttoushii
+うつむく;utsumuku
+うつろ;utsuro
+うつわ;utsuwa
+うでまえ;udemae
+うてん;uten
+うながす;unagasu
+うぬぼれ;unubore
+うまれつき;umaretsuki
+うまる;umaru
+うむ;umu
+うめこむ;umekomu
+うめぼし;umeboshi
+うらがえし;uragaeshi
+うりだし;uridashi
+うりだす;uridasu
+うるおう;uruou
+うわき;uwaki
+うわまわる;uwamawaru
+うわる;uwaru
+うんえい;un_ei
+うんざり;unzari
+うんそう;unsou
+うんちん;unchin
+うんぬん;unnun
+うんぱん;unpan
+うんめい;unmei
+うんゆ;un_yu
+うんよう;un_you
+え;e
+エアメール;eameeru
+えい;ei
+えいじ;eiji
+えいしゃ;eisha
+えいせい;eisei
+えいぞう;eizou
+えいゆう;eiyuu
+えき;eki
+えつらん;etsuran
+えもの;emono
+えり;eri
+エレガント;ereganto
+えん;en
+えんかつ;enkatsu
+えんがわ;engawa
+えんがん;engan
+えんきょく;enkyoku
+えんしゅつ;enshutsu
+エンジニア;enjinia
+えんじる;enjiru
+えんずる;enzuru
+えんせん;ensen
+えんだん;endan
+えんぽう;enpou
+えんまん;enman
+お;o
+おいこむ;oikomu
+おいだす;oidasu
+おいて;oite
+おいる;oiru
+おう;ou
+おうきゅう;oukyuu
+おうごん;ougon
+おうしん;oushin
+おうぼ;oubo
+おおい;ooi
+おおかた;ookata
+おおがら;oogara
+オーケー;ookee
+おおげさ;oogesa
+おおすじ;oosuji
+おおぞら;oozora
+オートマチック;ootomachikku
+オープン;oopun
+オーバー;oobaa
+おおはば;oohaba
+おおまかな;oomakana
+おおみず;oomizu
+おおやけ;ooyake
+おかす;okasu
+おかす;okasu
+おくびょう;okubyou
+おくらす;okurasu
+おくれ;okure
+おごそか;ogosoka
+おこない;okonai
+おごる;ogoru
+おさまる;osamaru
+おさまる;osamaru
+おさまる;osamaru
+おさん;osan
+おしえ;oshie
+おしきる;oshikiru
+おしこむ;oshikomu
+おしむ;oshimu
+おしよせる;oshiyoseru
+おす;osu
+おせじ;oseji
+おそう;osou
+おそくとも;osokutomo
+おそれ;osore
+おそれいる;osoreiru
+おだてる;odateru
+おちこむ;ochikomu
+おちつき;ochitsuki
+おちば;ochiba
+おつ;otsu
+おつかい;otsukai
+おっかない;okkanai
+おてあげ;oteage
+おどおど;odoodo
+おどす;odosu
+おとずれる;otozureru
+おとも;otomo
+おとろえる;otoroeru
+おどろき;odoroki
+おないどし;onaidoshi
+おのずから;onozukara
+おびえる;obieru
+おびただしい;obitadashii
+おびやかす;obiyakasu
+おびる;obiru
+おふくろ;ofukuro
+おぼえ;oboe
+おまけ;omake
+おみや;omiya
+おむつ;omutsu
+おもいつき;omoitsuki
+おもむき;omomuki
+おもむく;omomuku
+おもんじる;omonjiru
+おもんずる;omonzuru
+おやじ;oyaji
+および;oyobi
+およぶ;oyobu
+おり;ori
+おり;ori
+オリエンテーション;orienteeshon
+おりかえす;orikaesu
+おりもの;orimono
+おる;oru
+おれ;ore
+おろか;oroka
+おろそか;orosoka
+おんぶ;onbu
+オンライン;onrain
+おんわ;onwa
+が;ga
+が;ga
+カーペット;kaapetto
+かい;kai
+かい;kai
+がい;gai
+かいあく;kaiaku
+かいうん;kaiun
+がいか;gaika
+かいかく;kaikaku
+かいがら;kaigara
+がいかん;gaikan
+かいきゅう;kaikyuu
+かいきょう;kaikyou
+かいけん;kaiken
+かいご;kaigo
+かいさい;kaisai
+かいしゅう;kaishuu
+かいしゅう;kaishuu
+かいじゅう;kaijuu
+かいじょ;kaijo
+がいしょう;gaishou
+がいする;gaisuru
+がいせつ;gaisetsu
+かいそう;kaisou
+かいそう;kaisou
+かいたく;kaitaku
+かいだん;kaidan
+かいてい;kaitei
+かいてい;kaitei
+ガイド;gaido
+かいどう;kaidou
+がいとう;gaitou
+がいとう;gaitou
+ガイドブック;gaidobukku
+かいにゅう;kainyuu
+がいねん;gainen
+かいはつ;kaihatsu
+かいばつ;kaibatsu
+かいほう;kaihou
+かいぼう;kaibou
+がいらい;gairai
+かいらん;kairan
+がいりゃく;gairyaku
+かいりゅう;kairyuu
+かいりょう;kairyou
+かいろ;kairo
+かいろ;kairo
+かえりみる;kaerimiru
+かえりみる;kaerimiru
+かおつき;kaotsuki
+かがい;kagai
+かかげる;kakageru
+かかと;kakato
+かきとる;kakitoru
+かきまわす;kakimawasu
+かく;kaku
+かく;kaku
+かく;kaku
+かく;kaku
+かく;kaku
+かく;kaku
+がくげい;gakugei
+かくさ;kakusa
+かくさん;kakusan
+がくし;gakushi
+かくしゅ;kakushu
+かくしゅう;kakushuu
+かくしん;kakushin
+かくしん;kakushin
+がくせつ;gakusetsu
+かくてい;kakutei
+カクテル;kakuteru
+かくとく;kakutoku
+がくふ;gakufu
+かくほ;kakuho
+かくめい;kakumei
+きたる;kitaru
+きちっと;kichitto
+きちょうめん;kichoumen
+きっかり;kikkari
+きっちり;kicchiri
+きっぱり;kippari
+きてい;kitei
+きてん;kiten
+きどう;kidou
+ぎのう;ginou
+きはん;kihan
+きひん;kihin
+きふう;kifuu
+きふく;kifuku
+きぼ;kibo
+きまぐれ;kimagure
+きまじめ;kimajime
+きまつ;kimatsu
+きまりわるい;kimariwarui
+きめい;kimei
+きやく;kiyaku
+きゃくしょく;kyakushoku
+ぎゃくてん;gyakuten
+きゃくほん;kyakuhon
+きゃしゃ;kyasha
+きゃっかん;kyakkan
+キャッチ;kyacchi
+キャリア;kyaria
+きゅうえん;kyuuen
+きゅうがく;kyuugaku
+きゅうきょく;kyuukyoku
+きゅうくつ;kyuukutsu
+きゅうこん;kyuukon
+きゅうさい;kyuusai
+きゅうじ;kyuuji
+きゅうしょく;kyuushoku
+きゅうせん;kyuusen
+きゅうでん;kyuuden
+きゅうち;kyuuchi
+きゅうぼう;kyuubou
+きゅうりょう;kyuuryou
+きよ;kiyo
+きょう;kyou
+きょう;kyou
+きょうい;kyoui
+きょうか;kyouka
+きょうかい;kyoukai
+きょうがく;kyougaku
+きょうかん;kyoukan
+きょうぎ;kyougi
+きょうぐう;kyouguu
+きょうくん;kyoukun
+きょうこう;kyoukou
+きょうこう;kyoukou
+きょうざい;kyouzai
+きょうさく;kyousaku
+ぎょうしゃ;gyousha
+きょうじゅ;kyouju
+きょうしゅう;kyoushuu
+きょうしゅう;kyoushuu
+きょうしょく;kyoushoku
+きょうじる;kyoujiru
+きょうせい;kyousei
+ぎょうせい;gyousei
+ぎょうせき;gyouseki
+きょうぞん;kyouzon
+きょうちょう;kyouchou
+きょうてい;kyoutei
+きょうど;kyoudo
+きょうはく;kyouhaku
+ぎょうむ;gyoumu
+きょうめい;kyoumei
+きょうり;kyouri
+きょうれつ;kyouretsu
+きょうわ;kyouwa
+きょくげん;kyokugen
+きょくたん;kyokutan
+きょじゅう;kyojuu
+きょぜつ;kyozetsu
+ぎょせん;gyosen
+ぎょそん;gyoson
+きょひ;kyohi
+きょよう;kyoyou
+きよらか;kiyoraka
+きらびやか;kirabiyaka
+きり;kiri
+きり;kiri
+ぎり;giri
+きりかえ;kirikae
+きりゅう;kiryuu
+きれめ;kireme
+ぎわく;giwaku
+きわめて;kiwamete
+きん;kin
+きんがん;kingan
+きんきゅう;kinkyuu
+きんこう;kinkou
+きんこう;kinkou
+きんし;kinshi
+きんじる;kinjiru
+きんべん;kinben
+ぎんみ;ginmi
+きんむ;kinmu
+きんもつ;kinmotsu
+きんろう;kinrou
+く;ku
+く;ku
+クイズ;kuizu
+くいちがう;kuichigau
+くうかん;kuukan
+くうふく;kuufuku
+くかく;kukaku
+くかん;kukan
+くき;kuki
+くぎり;kugiri
+くぐる;kuguru
+くじ;kuji
+くじびき;kujibiki
+くすぐったい;kusuguttai
+ぐち;guchi
+くちずさむ;kuchizusamu
+くちばし;kuchibashi
+くちる;kuchiru
+くつがえす;kutsugaesu
+くっきり;kukkiri
+くっせつ;kussetsu
+ぐっと;gutto
+くびかざり;kubikazari
+くびわ;kubiwa
+くみこむ;kumikomu
+くみあわせる;kumiawaseru
+くら;kura
+グレー;guree
+クレーン;kureen
+くろうと;kurouto
+くろじ;kuroji
+ぐん;gun
+ぐんかん;gunkan
+ぐんじ;gunji
+くんしゅ;kunshu
+ぐんしゅう;gunshuu
+ぐんしゅう;gunshuu
+ぐんび;gunbi
+ぐんぷく;gunpuku
+けい;kei
+けい;kei
+げい;gei
+けいい;keii
+けいか;keika
+けいかい;keikai
+けいかい;keikai
+けいき;keiki
+けいき;keiki
+けいぐ;keigu
+けいげん;keigen
+けいさい;keisai
+けいしゃ;keisha
+けいせい;keisei
+けいせい;keisei
+けいそつ;keisotsu
+けいたい;keitai
+けいたい;keitai
+けいばつ;keibatsu
+けいひ;keihi
+けいぶ;keibu
+けいべつ;keibetsu
+けいれき;keireki
+けいろ;keiro
+ケース;keesu
+けがらわしい;kegarawashii
+げきだん;gekidan
+げきれい;gekirei
+ゲスト;gesuto
+けだもの;kedamono
+けつ;ketsu
+けつい;ketsui
+けっかく;kekkaku
+けっかん;kekkan
+けつぎ;ketsugi
+けっこう;kekkou
+けつごう;ketsugou
+けっさん;kessan
+げっしゃ;gessha
+けっしょう;kesshou
+けっしょう;kesshou
+けっせい;kessei
+けっそく;kessoku
+げっそり;gessori
+けつだん;ketsudan
+げっぷ;geppu
+けつぼう;ketsubou
+けとばす;ketobasu
+けなす;kenasu
+けむたい;kemutai
+けむる;kemuru
+けもの;kemono
+けらい;kerai
+げり;geri
+けん;ken
+けん;ken
+けんい;ken_i
+けんぎょう;kengyou
+げんけい;genkei
+げんけい;genkei
+けんげん;kengen
+げんこう;genkou
+けんざい;kenzai
+げんさく;gensaku
+けんじ;kenji
+げんし;genshi
+げんしゅ;genshu
+げんしょ;gensho
+けんしょう;kenshou
+げんしょう;genshou
+けんぜん;kenzen
+げんそ;genso
+げんぞう;genzou
+げんそく;gensoku
+けんち;kenchi
+げんち;genchi
+げんてい;gentei
+げんてん;genten
+げんてん;genten
+げんばく;genbaku
+げんぶん;genbun
+げんみつ;genmitsu
+けんめい;kenmei
+けんやく;ken_yaku
+げんゆ;gen_yu
+けんよう;ken_you
+けんりょく;kenryoku
+げんろん;genron
+こ;ko
+ごい;goi
+こいする;koisuru
+こう;kou
+こう;kou
+こうい;koui
+こうい;koui
+ごうい;goui
+こうえん;kouen
+こうかい;koukai
+こうかい;koukai
+こうがく;kougaku
+こうぎ;kougi
+ごうぎ;gougi
+こうきょ;koukyo
+こうきょう;koukyou
+こうぎょう;kougyou
+こうぎょう;kougyou
+こうげん;kougen
+こうご;kougo
+こうこうと;koukouto
+こうこがく;koukogaku
+こうさく;kousaku
+こうさく;kousaku
+こうざん;kouzan
+こうしゅう;koushuu
+こうじゅつ;koujutsu
+こうじょ;koujo
+こうしょう;koushou
+こうしょう;koushou
+こうじょう;koujou
+こうしん;koushin
+こうしんりょう;koushinryou
+こうすい;kousui
+こうずい;kouzui
+ごうせい;gousei
+こうぜん;kouzen
+こうそう;kousou
+こうそう;kousou
+こうそく;kousoku
+こうたい;koutai
+こうたく;koutaku
+こうだん;koudan
+こうちょう;kouchou
+こうとう;koutou
+こうどく;koudoku
+こうどく;koudoku
+こうにゅう;kounyuu
+こうにん;kounin
+こうねつひ;kounetsuhi
+こうはい;kouhai
+こうばい;koubai
+こうひょう;kouhyou
+こうふ;koufu
+こうふく;koufuku
+こうふん;koufun
+こうぼ;koubo
+こうみょう;koumyou
+こうよう;kouyou
+こうり;kouri
+こうりつ;kouritsu
+こうりつ;kouritsu
+ごえい;goei
+コーナー;koonaa
+こがら;kogara
+こぎって;kogitte
+ごく;goku
+こくさん;kokusan
+こくてい;kokutei
+こくはく;kokuhaku
+こくぼう;kokubou
+こくゆう;kokuyuu
+ごくらく;gokuraku
+こくれん;kokuren
+こげちゃ;kogecha
+ごげん;gogen
+ここ;koko
+ここち;kokochi
+こころえ;kokoroe
+こころがけ;kokorogake
+こころがける;kokorogakeru
+こころざし;kokorozashi
+こころざす;kokorozasu
+こころづよい;kokoroduyoi
+こころぼそい;kokorobosoi
+こころみ;kokoromi
+こころみる;kokoromiru
+こころよい;kokoroyoi
+ごさ;gosa
+ございます;gozaimasu
+こじ;koji
+こじれる;kojireru
+こじん;kojin
+こす;kosu
+こずえ;kozue
+こせい;kosei
+こせき;koseki
+こぜに;kozeni
+こだい;kodai
+こたつ;kotatsu
+こだわる;kodawaru
+こちょう;kochou
+こつ;kotsu
+こっけい;kokkei
+こっこう;kokkou
+こっとうひん;kottouhin
+こてい;kotei
+ことがら;kotogara
+こどく;kodoku
+ことごとく;kotogotoku
+ことづけ;kotoduke
+ことに;kotoni
+ことによると;kotoniyoruto
+こなごな;konagona
+このましい;konomashii
+ごばん;goban
+こべつ;kobetsu
+ごまかす;gomakasu
+こまやか;komayaka
+コマーシャル;komaasharu
+こめる;komeru
+コメント;komento
+こもる;komoru
+こゆう;koyuu
+こよみ;koyomi
+こらす;korasu
+ごらんなさい;gorannasai
+こりつ;koritsu
+こりる;koriru
+こる;koru
+こんき;konki
+こんきょ;konkyo
+こんけつ;konketsu
+コンタクト;kontakuto
+こんちゅう;konchuu
+こんてい;kontei
+コンテスト;kontesuto
+こんどう;kondou
+コントラスト;kontorasuto
+コントロール;kontorooru
+コンパス;konpasu
+こんぽん;konpon
+さ;sa
+ざい;zai
+さいかい;saikai
+さいがい;saigai
+さいきん;saikin
+さいく;saiku
+さいくつ;saikutsu
+サイクル;saikuru
+さいけつ;saiketsu
+さいけん;saiken
+さいげん;saigen
+ざいげん;zaigen
+ざいこ;zaiko
+さいさん;saisan
+さいしゅう;saishuu
+サイズ;saizu
+さいせい;saisei
+ざいせい;zaisei
+さいぜん;saizen
+さいたく;saitaku
+さいばい;saibai
+さいはつ;saihatsu
+さいぼう;saibou
+さいよう;saiyou
+さえぎる;saegiru
+さえずる;saezuru
+さえる;saeru
+さお;sao
+さかえる;sakaeru
+さがく;sagaku
+さかずき;sakazuki
+さかだち;sakadachi
+さきに;sakini
+さぎ;sagi
+さく;saku
+さく;saku
+さく;saku
+さくげん;sakugen
+さくご;sakugo
+さくせん;sakusen
+さけび;sakebi
+さける;sakeru
+ささげる;sasageru
+さしかかる;sashikakaru
+さしず;sashizu
+さしだす;sashidasu
+さしつかえる;sashitsukaeru
+さしひき;sashihiki
+さずける;sazukeru
+さする;sasuru
+さぞ;sazo
+さだまる;sadamaru
+さだめる;sadameru
+ざだんかい;zadankai
+ざつ;zatsu
+ざっか;zakka
+さつじん;satsujin
+さっする;sassuru
+ざつだん;zatsudan
+さっと;satto
+さっぱりする;sapparisuru
+さとる;satoru
+さなか;sanaka
+さばく;sabaku
+ざひょう;zahyou
+さほど;sahodo
+サボる;saboru
+さま;sama
+さむけ;samuke
+さむらい;samurai
+さも;samo
+さよう;sayou
+さらう;sarau
+さわる;sawaru
+さん;san
+さんか;sanka
+さんがく;sangaku
+さんぎいん;sangiin
+さんきゅう;sankyuu
+サンキュー;sankyuu
+ざんきん;zankin
+さんご;sango
+ざんこく;zankoku
+さんしゅつ;sanshutsu
+さんしょう;sanshou
+さんじょう;sanjou
+ざんだか;zandaka
+サンタクロース;santakuroosu
+さんばし;sanbashi
+さんび;sanbi
+さんぷく;sanpuku
+さんふじんか;sanfujinka
+さんぶつ;sanbutsu
+さんみゃく;sanmyaku
+し;shi
+し;shi
+し;shi
+じ;ji
+しあがり;shiagari
+しあげ;shiage
+しあげる;shiageru
+しいく;shiiku
+しいて;shiite
+シート;shiito
+ジーパン;jiipan
+しいれる;shiireru
+しいる;shiiru
+しお;shio
+しか;shika
+じが;jiga
+しかく;shikaku
+しかく;shikaku
+じかく;jikaku
+しかけ;shikake
+しかける;shikakeru
+しかしながら;shikashinagara
+しき;shiki
+じき;jiki
+じき;jiki
+しきさい;shikisai
+しきじょう;shikijou
+しきたり;shikitari
+じぎょう;jigyou
+しきる;shikiru
+しきん;shikin
+じく;jiku
+しくじる;shikujiru
+しくみ;shikumi
+しけい;shikei
+しける;shikeru
+じこ;jiko
+しこう;shikou
+しこう;shikou
+しこう;shikou
+しこう;shikou
+じこう;jikou
+じこくひょう;jikokuhyou
+じごく;jigoku
+じさ;jisa
+じざい;jizai
+しさつ;shisatsu
+しさん;shisan
+しじ;shiji
+じしゅ;jishu
+じしゅ;jishu
+ししゅう;shishuu
+しじょう;shijou
+じしょく;jishoku
+しずく;shizuku
+システム;shisutemu
+しずめる;shizumeru
+しせつ;shisetsu
+じぜん;jizen
+しそく;shisoku
+じぞく;jizoku
+じそんしん;jisonshin
+じたい;jitai
+じたい;jitai
+したう;shitau
+したごころ;shitagokoro
+したじ;shitaji
+したしむ;shitashimu
+したしらべ;shitashirabe
+したてる;shitateru
+したどり;shitadori
+したび;shitabi
+じつ;jitsu
+じっか;jikka
+しっかく;shikkaku
+しつぎ;shitsugi
+しっきゃく;shikkyaku
+じつぎょうか;jitsugyouka
+シック;shikku
+じっくり;jikkuri
+しつけ;shitsuke
+しつける;shitsukeru
+じっせん;jissen
+しっそ;shisso
+じったい;jittai
+しっちょう;shicchou
+しっと;shitto
+じっぴ;jippi
+してき;shiteki
+してん;shiten
+じてん;jiten
+しとやか;shitoyaka
+しなびる;shinabiru
+シナリオ;shinario
+しなやか;shinayaka
+しにょう;shinyou
+じぬし;jinushi
+しのぐ;shinogu
+しば;shiba
+しはつ;shihatsu
+じびか;jibika
+しぶつ;shibutsu
+しぶとい;shibutoi
+しほう;shihou
+しぼう;shibou
+しぼう;shibou
+しまつ;shimatsu
+しみる;shimiru
+しめい;shimei
+じもと;jimoto
+しや;shiya
+じゃく;jaku
+しゃこう;shakou
+ジャズ;jazu
+しゃぜつ;shazetsu
+しゃたく;shataku
+じゃっかん;jakkan
+しゃみせん;shamisen
+しゃめん;shamen
+じゃり;jari
+しゃれる;shareru
+ジャンパー;janpaa
+ジャンプ;janpu
+ジャンボ;janbo
+ジャンル;janru
+しゅ;shu
+しゅ;shu
+しゆう;shiyuu
+しゅう;shuu
+しゅう;shuu
+じゅう;juu
+しゅうえき;shuueki
+しゅうがく;shuugaku
+しゅうき;shuuki
+しゅうぎいん;shuugiin
+しゅうぎょう;shuugyou
+じゅうぎょういん;juugyouin
+しゅうけい;shuukei
+しゅうげき;shuugeki
+しゅうし;shuushi
+しゅうし;shuushi
+しゅうし;shuushi
+じゅうじ;juuji
+しゅうじつ;shuujitsu
+じゅうじつ;juujitsu
+しゅうしゅう;shuushuu
+しゅうしょく;shuushoku
+じゅうじろ;juujiro
+しゅうじゃく;shuujaku
+しゅうちゃく;shuuchaku
+じゅうなん;juunan
+じゅうふく;juufuku
+しゅうよう;shuuyou
+じゅうらい;juurai
+しゅうりょう;shuuryou
+しゅえい;shuei
+しゅえん;shuen
+しゅかん;shukan
+しゅぎょう;shugyou
+じゅく;juku
+しゅくが;shukuga
+しゅくめい;shukumei
+しゅげい;shugei
+しゅけん;shuken
+しゅさい;shusai
+しゅざい;shuzai
+しゅし;shushi
+しゅじゅ;shuju
+しゅしょく;shushoku
+しゅじんこう;shujinkou
+しゅたい;shutai
+しゅだい;shudai
+しゅつえん;shutsuen
+しゅっけつ;shukketsu
+しゅつげん;shutsugen
+しゅっさん;shussan
+しゅっしゃ;shussha
+しゅっしょう;shusshou
+しゅっせい;shussei
+しゅっせ;shusse
+しゅつだい;shutsudai
+しゅつどう;shutsudou
+しゅっぴ;shuppi
+しゅっぴん;shuppin
+しゅどう;shudou
+しゅにん;shunin
+しゅのう;shunou
+しゅび;shubi
+じんかく;jinkaku
+しんぎ;shingi
+しんこう;shinkou
+しんこう;shinkou
+しんこう;shinkou
+しんこく;shinkoku
+しんこん;shinkon
+しんさ;shinsa
+じんざい;jinzai
+しんし;shinshi
+しんじつ;shinjitsu
+しんじゃ;shinja
+しんじゅ;shinju
+しんしゅつ;shinshutsu
+しんじん;shinjin
+しんせい;shinsei
+しんぜん;shinzen
+しんそう;shinsou
+じんそく;jinsoku
+じんたい;jintai
+しんちく;shinchiku
+しんじゅう;shinjuu
+しんてい;shintei
+しんてん;shinten
+しんでん;shinden
+しんど;shindo
+しんどう;shindou
+しんにゅうせい;shinnyuusei
+しんにん;shinnin
+しんぴ;shinpi
+しんぼう;shinbou
+じんみん;jinmin
+しんり;shinri
+しんりゃく;shinryaku
+しんりょう;shinryou
+すい;sui
+すいげん;suigen
+すいしん;suishin
+すいせん;suisen
+すいそう;suisou
+すいそく;suisoku
+すいでん;suiden
+すいり;suiri
+すうし;suushi
+すうはい;suuhai
+すえつける;suetsukeru
+すえる;sueru
+すがすがしい;sugasugashii
+すくい;sukui
+すくう;sukuu
+すこやか;sukoyaka
+すすぐ;susugu
+すすみ;susumi
+すそ;suso
+スタジオ;sutajio
+スチーム;suchiimu
+ストライキ;sutoraiki
+スト;suto
+ストレス;sutoresu
+ストロー;sutoroo
+ストロボ;sutorobo
+すばしこい;subashikoi
+すばやい;subayai
+ずばり;zubari
+スプリング;supuringu
+スペース;supeesu
+ずぶぬれ;zubunure
+スポーツカー;supootsukaa
+すます;sumasu
+すます;sumasu
+すます;sumasu
+すみやか;sumiyaka
+スラックス;surakkusu
+ずらっと;zuratto
+する;suru
+ずるずる;zuruzuru
+ずれ;zure
+すれちがい;surechigai
+すれる;sureru
+すんなり;sunnari
+せい;sei
+せいいく;seiiku
+せいいく;seiiku
+せいか;seika
+せいかい;seikai
+せいき;seiki
+せいぎ;seigi
+せいけい;seikei
+せいけん;seiken
+せいこう;seikou
+せいざ;seiza
+せいさい;seisai
+せいさく;seisaku
+せいさん;seisan
+せいし;seishi
+せいし;seishi
+せいじつ;seijitsu
+せいじゅく;seijuku
+せいしゅん;seishun
+せいじゅん;seijun
+せいしょ;seisho
+せいじょう;seijou
+せいする;seisuru
+せいぜん;seizen
+せいそう;seisou
+せいだい;seidai
+せいだく;seidaku
+せいてい;seitei
+せいてき;seiteki
+せいてつ;seitetsu
+せいてん;seiten
+せいとう;seitou
+せいねん;seinen
+せいふく;seifuku
+せいふく;seifuku
+せいほう;seihou
+せいみつ;seimitsu
+ぜいむしょ;zeimusho
+せいめい;seimei
+せいめい;seimei
+せいやく;seiyaku
+せいり;seiri
+せいりょく;seiryoku
+せいれつ;seiretsu
+セール;seeru
+せかす;sekasu
+せがれ;segare
+せきむ;sekimu
+セクション;sekushon
+せじ;seji
+せたい;setai
+ぜせい;zesei
+せだい;sedai
+せつ;setsu
+せっかい;sekkai
+セックス;sekkusu
+せつじつ;setsujitsu
+せっしょく;sesshoku
+せつぞくし;setsuzokushi
+せっち;secchi
+せっちゅう;secchuu
+せってい;settei
+せっとく;settoku
+せつない;setsunai
+ぜっぱん;zeppan
+せつりつ;setsuritsu
+せめ;seme
+ゼリー;zerii
+セレモニー;seremonii
+せん;sen
+ぜん;zen
+ぜん;zen
+せんい;sen_i
+ぜんかい;zenkai
+せんきょ;senkyo
+せんきょう;senkyou
+せんげん;sengen
+せんこう;senkou
+せんこう;senkou
+せんさい;sensai
+せんしゅう;senshuu
+せんじゅつ;senjutsu
+センス;sensu
+せんすい;sensui
+ぜんせい;zensei
+せんだい;sendai
+せんだって;sendatte
+せんちゃく;senchaku
+ぜんてい;zentei
+せんてんてき;sententeki
+ぜんと;zento
+せんとう;sentou
+せんにゅう;sennyuu
+せんぱく;senpaku
+ぜんめつ;zenmetsu
+せんよう;sen_you
+せんりょう;senryou
+ぜんりょう;zenryou
+せんりょく;senryoku
+ぜんれい;zenrei
+そう;sou
+そう;sou
+そう;sou
+そう;sou
+ぞう;zou
+そうおう;souou
+そうかい;soukai
+そうかん;soukan
+ぞうき;zouki
+そうきゅう;soukyuu
+さっきゅう;sakkyuu
+ぞうきょう;zoukyou
+そうきん;soukin
+そうこう;soukou
+そうごう;sougou
+そうさ;sousa
+そうさく;sousaku
+そうじゅう;soujuu
+ぞうしょう;zoushou
+そうしょく;soushoku
+ぞうしん;zoushin
+そうぞう;souzou
+そうたい;soutai
+そうだい;soudai
+そうどう;soudou
+そうなん;sounan
+そうば;souba
+そうび;soubi
+そうりつ;souritsu
+そえる;soeru
+ソース;soosu
+そくざに;sokuzani
+そくしん;sokushin
+そくする;sokusuru
+そくばく;sokubaku
+そくめん;sokumen
+そこなう;sokonau
+そこら;sokora
+そざい;sozai
+そし;soshi
+そしょう;soshou
+そだち;sodachi
+そち;sochi
+ソックス;sokkusu
+そっけない;sokkenai
+そっぽ;soppo
+そなえつける;sonaetsukeru
+そなわる;sonawaru
+そなわる;sonawaru
+そびえる;sobieru
+ソフト;sofuto
+そぼく;soboku
+そむく;somuku
+そまる;somaru
+そめる;someru
+そらす;sorasu
+そり;sori
+そる;soru
+それゆえ;soreyue
+ソロ;soro
+そろい;soroi
+ぞんざい;zonzai
+そんしつ;sonshitsu
+そんぞく;sonzoku
+ダース;daasu
+たい;tai
+たい;tai
+たいおう;taiou
+たいか;taika
+たいか;taika
+たいがい;taigai
+たいかく;taikaku
+たいがく;taigaku
+たいきん;taikin
+たいぐう;taiguu
+たいけつ;taiketsu
+たいけん;taiken
+たいこう;taikou
+たいじ;taiji
+たいしゅう;taishuu
+たいしょ;taisho
+たいしょく;taishoku
+だいする;daisuru
+たいせい;taisei
+たいだん;taidan
+だいたん;daitan
+たいとう;taitou
+タイトル;taitoru
+だいなし;dainashi
+たいのう;tainou
+たいひ;taihi
+タイピスト;taipisuto
+たいぶ;taibu
+だいべん;daiben
+だいべん;daiben
+たいぼう;taibou
+だいほん;daihon
+タイマー;taimaa
+たいまん;taiman
+タイミング;taimingu
+タイム;taimu
+タイムリー;taimurii
+たいめん;taimen
+だいよう;daiyou
+たいりょく;tairyoku
+タイル;tairu
+たいわ;taiwa
+ダウン;daun
+たえる;taeru
+たえる;taeru
+たえる;taeru
+たえる;taeru
+だかい;dakai
+たかまる;takamaru
+たきび;takibi
+だきょう;dakyou
+たくましい;takumashii
+たくみ;takumi
+たけ;take
+だけ;dake
+だげき;dageki
+だけつ;daketsu
+ださく;dasaku
+たしざん;tashizan
+たすうけつ;tasuuketsu
+たすけ;tasuke
+たずさわる;tazusawaru
+ただよう;tadayou
+たちさる;tachisaru
+たちよる;tachiyoru
+たつ;tatsu
+だっこ;dakko
+たっしゃ;tassha
+だっしゅつ;dasshutsu
+だっする;dassuru
+たっせい;tassei
+だったい;dattai
+だったら;dattara
+たて;tate
+たてかえる;tatekaeru
+たてまえ;tatemae
+たてまつる;tatematsuru
+だと;dato
+たどうし;tadoushi
+たとえ;tatoe
+たどりつく;tadoritsuku
+たどる;tadoru
+たばねる;tabaneru
+だぶだぶ;dabudabu
+ダブル;daburu
+たほう;tahou
+たぼう;tabou
+たまう;tamau
+たましい;tamashii
+たまり;tamari
+たまわる;tamawaru
+たもつ;tamotsu
+たやすい;tayasui
+たよう;tayou
+だるい;darui
+たるみ;tarumi
+たるむ;tarumu
+たれる;tareru
+タレント;tarento
+タワー;tawaa
+たん;tan
+たんいつ;tan_itsu
+たんか;tanka
+たんか;tanka
+たんき;tanki
+だんけつ;danketsu
+たんけん;tanken
+だんげん;dangen
+たんしゅく;tanshuku
+だんぜん;danzen
+たんそ;tanso
+たんだい;tandai
+たんちょう;tanchou
+たんどく;tandoku
+だんな;danna
+たんぱ;tanpa
+たんぱくしつ;tanpakushitsu
+ダンプ;danpu
+だんめん;danmen
+だんりょく;danryoku
+ちあん;chian
+チームワーク;chiimuwaaku
+チェンジ;chenji
+ちがえる;chigaeru
+ちくさん;chikusan
+ちくしょう;chikushou
+ちくせき;chikuseki
+ちけい;chikei
+ちせい;chisei
+ちち;chichi
+ちぢまる;chidimaru
+ちつじょ;chitsujo
+ちっそく;chissoku
+ちてき;chiteki
+チャイム;chaimu
+ちゃくしゅ;chakushu
+ちゃくしょく;chakushoku
+ちゃくせき;chakuseki
+ちゃくもく;chakumoku
+ちゃくりく;chakuriku
+ちゃっこう;chakkou
+ちゃのま;chanoma
+ちゃのゆ;chanoyu
+ちやほや;chiyahoya
+チャンネル;channeru
+ちゅうがえり;chuugaeri
+ちゅうけい;chuukei
+ちゅうこく;chuukoku
+ちゅうしょう;chuushou
+ちゅうすう;chuusuu
+ちゅうせん;chuusen
+ちゅうだん;chuudan
+ちゅうどく;chuudoku
+ちゅうふく;chuufuku
+ちゅうりつ;chuuritsu
+ちゅうわ;chuuwa
+ちょ;cho
+ちょう;chou
+ちょう;chou
+ちょう;chou
+ちょういん;chouin
+ちょうかく;choukaku
+ちょうかん;choukan
+ちょうこう;choukou
+ちょうしゅう;choushuu
+しゅほう;shuhou
+じゅもく;jumoku
+じゅりつ;juritsu
+じゅんきゅう;junkyuu
+じゅんじる;junjiru
+しょ;sho
+しよう;shiyou
+しよう;shiyou
+しょう;shou
+しょう;shou
+じょう;jou
+じょう;jou
+じょう;jou
+じょうい;joui
+じょうえん;jouen
+じょうか;jouka
+しょうがい;shougai
+しょうきょ;shoukyo
+じょうくう;joukuu
+しょうげき;shougeki
+しょうげん;shougen
+しょうこ;shouko
+しょうごう;shougou
+しょうさい;shousai
+じょうし;joushi
+じょうしょう;joushou
+しょうしん;shoushin
+しょうする;shousuru
+じょうせい;jousei
+しょうそく;shousoku
+しょうたい;shoutai
+しょうだく;shoudaku
+じょうちょ;joucho
+じょうしょ;jousho
+しょうちょう;shouchou
+しょうにか;shounika
+しようにん;shiyounin
+じょうねつ;jounetsu
+じょうほ;jouho
+しょうめい;shoumei
+じょうやく;jouyaku
+しょうり;shouri
+じょうりく;jouriku
+じょうりゅう;jouryuu
+しょうれい;shourei
+ショー;shoo
+じょがい;jogai
+しょくいん;shokuin
+しょくみんち;shokuminchi
+しょくむ;shokumu
+しょくん;shokun
+じょげん;jogen
+じょこう;jokou
+しょざい;shozai
+しょじ;shoji
+じょし;joshi
+じょし;joshi
+しょぞく;shozoku
+しょち;shochi
+ショック;shokku
+しょっちゅう;shocchuu
+しょてい;shotei
+じょどうし;jodoushi
+しょとく;shotoku
+しょばつ;shobatsu
+しょはん;shohan
+しょひょう;shohyou
+しょぶん;shobun
+しょみん;shomin
+しょむ;shomu
+しょゆう;shoyuu
+しらべ;shirabe
+じりつ;jiritsu
+しるす;shirusu
+しれい;shirei
+しん;shin
+じん;jin
+しんか;shinka
+はたす;hatasu
+はちみつ;hachimitsu
+パチンコ;pachinko
+ばつ;batsu
+はついく;hatsuiku
+はつが;hatsuga
+はっくつ;hakkutsu
+はつげん;hatsugen
+バッジ;bajji
+はっせい;hassei
+バッテリー;batterii
+バット;batto
+はつびょう;hatsubyou
+はつみみ;hatsumimi
+はて;hate
+はてる;hateru
+ばてる;bateru
+パトカー;patokaa
+はなはだ;hanahada
+はなばなしい;hanabanashii
+はなびら;hanabira
+はなやか;hanayaka
+パパ;papa
+はばむ;habamu
+はま;hama
+はまべ;hamabe
+はまる;hamaru
+はやす;hayasu
+はやめる;hayameru
+はらだち;haradachi
+はらっぱ;harappa
+はらはら;harahara
+ばらまく;baramaku
+はりがみ;harigami
+はるか;haruka
+はれつ;haretsu
+はれる;hareru
+はん;han
+はん;han
+はん;han
+はんえい;han_ei
+はんが;hanga
+ハンガー;hangaa
+はんかん;hankan
+はんきょう;hankyou
+パンク;panku
+はんげき;hangeki
+はんけつ;hanketsu
+はんしゃ;hansha
+はんじょう;hanjou
+はんしょく;hanshoku
+はんする;hansuru
+はんてい;hantei
+ばんにん;bannin
+ばんねん;bannen
+はんのう;hannou
+ばんのう;bannou
+はんぱ;hanpa
+はんぱつ;hanpatsu
+はんらん;hanran
+はんらん;hanran
+ひ;hi
+ひ;hi
+び;bi
+ひいては;hiiteha
+ビールス;biirusu
+ひかえしつ;hikaeshitsu
+ひかえる;hikaeru
+ひかん;hikan
+ひきあげる;hikiageru
+ひきいる;hikiiru
+ひきおこす;hikiokosu
+ひきさげる;hikisageru
+ひきずる;hikizuru
+ひきとる;hikitoru
+ひけつ;hiketsu
+ひこう;hikou
+ひごろ;higoro
+ひさしい;hisashii
+ひさん;hisan
+ビジネス;bijinesu
+ひじゅう;hijuu
+びじゅつ;bijutsu
+ひしょ;hisho
+びしょう;bishou
+ちょうしんき;choushinki
+ちょうせん;chousen
+ちょうてい;choutei
+ちょうふく;choufuku
+ちょうへん;chouhen
+ちょうほう;chouhou
+ちょうり;chouri
+ちょうわ;chouwa
+ちょくちょく;chokuchoku
+ちょくめん;chokumen
+ちょしょ;chosho
+ちょちく;chochiku
+ちょっかん;chokkan
+ちょめい;chomei
+ちらっと;chiratto
+ちり;chiri
+ちりとり;chiritori
+ちりょう;chiryou
+ちんぎん;chingin
+ちんでん;chinden
+ちんぼつ;chinbotsu
+ちんもく;chinmoku
+ちんれつ;chinretsu
+つい;tsui
+ついきゅう;tsuikyuu
+ついせき;tsuiseki
+ついほう;tsuihou
+ついやす;tsuiyasu
+ついらく;tsuiraku
+つうかん;tsuukan
+つうじょう;tsuujou
+つうせつ;tsuusetsu
+つえ;tsue
+つかいみち;tsukaimichi
+つかえる;tsukaeru
+つかさどる;tsukasadoru
+つかのま;tsukanoma
+つきなみ;tsukinami
+つぎめ;tsugime
+つきる;tsukiru
+つぐ;tsugu
+つぐ;tsugu
+つくす;tsukusu
+つくづく;tsukuduku
+つくり;tsukuri
+つくり;tsukuri
+つくろう;tsukurou
+つけくわえる;tsukekuwaeru
+つげる;tsugeru
+つじつま;tsujitsuma
+つつ;tsutsu
+つつく;tsutsuku
+つっつく;tsuttsuku
+つつしむ;tsutsushimu
+つっぱる;tsupparu
+つとまる;tsutomaru
+つとめさき;tsutomesaki
+つとめて;tsutomete
+つなみ;tsunami
+つねる;tsuneru
+つの;tsuno
+つのる;tsunoru
+つば;tsuba
+つぶやく;tsubuyaku
+つぶら;tsubura
+つぶる;tsuburu
+つぼ;tsubo
+つぼみ;tsubomi
+つむ;tsumu
+つゆ;tsuyu
+つよまる;tsuyomaru
+つよめる;tsuyomeru
+つらなる;tsuranaru
+つらぬく;tsuranuku
+つらねる;tsuraneru
+つりがね;tsurigane
+つりかわ;tsurikawa
+てあて;teate
+ていぎ;teigi
+ていきょう;teikyou
+ていけい;teikei
+ていさい;teisai
+ていじ;teiji
+ティシュペーパー;tishupeepaa
+ていしょく;teishoku
+ていせい;teisei
+ていたい;teitai
+ていたく;teitaku
+ていねん;teinen
+ていぼう;teibou
+データ;deeta
+ておくれ;teokure
+でかい;dekai
+てがかり;tegakari
+てがける;tegakeru
+てかず;tekazu
+てがる;tegaru
+てきおう;tekiou
+てきぎ;tekigi
+てきせい;tekisei
+できもの;dekimono
+てぎわ;tegiwa
+でくわす;dekuwasu
+デザイン;dezain
+てじゅん;tejun
+てじょう;tejou
+てすう;tesuu
+デコレーション;dekoreeshon
+デザート;dezaato
+てぢか;tedika
+てっきり;tekkiri
+てっこう;tekkou
+デッサン;dessan
+てっする;tessuru
+てっぺん;teppen
+てつぼう;tetsubou
+でなおし;denaoshi
+てのひら;tenohira
+てはい;tehai
+てはず;tehazu
+てびき;tebiki
+てほん;tehon
+てまわし;temawashi
+てもと;temoto
+デモンストレーション;demonsutoreeshon
+てりかえす;terikaesu
+テレックス;terekkusu
+てわけ;tewake
+てん;ten
+でんえん;den_en
+てんか;tenka
+てんかい;tenkai
+てんかん;tenkan
+てんきょ;tenkyo
+てんきん;tenkin
+てんけん;tenken
+でんげん;dengen
+てんこう;tenkou
+てんごく;tengoku
+でんごん;dengon
+てんさい;tensai
+てんさい;tensai
+てんじ;tenji
+でんせつ;densetsu
+てんせん;tensen
+てんじる;tenjiru
+てんずる;tenzuru
+てんたい;tentai
+でんたつ;dentatsu
+てんち;tenchi
+てんで;tende
+てんにん;tennin
+てんぼう;tenbou
+でんらい;denrai
+てんらく;tenraku
+と;to
+ど;do
+といあわせる;toiawaseru
+とう;tou
+とう;tou
+とう;tou
+どう;dou
+どうい;doui
+どういん;douin
+どうかん;doukan
+とうき;touki
+とうぎ;tougi
+どうき;douki
+とうきゅう;toukyuu
+どうきゅう;doukyuu
+どうきょ;doukyo
+とうこう;toukou
+とうごう;tougou
+どうこう;doukou
+とうさん;tousan
+とうし;toushi
+どうし;doushi
+どうし;doushi
+どうじょう;doujou
+どうじょう;doujou
+とうせい;tousei
+とうせん;tousen
+とうぜん;touzen
+とうそう;tousou
+とうそつ;tousotsu
+とうたつ;toutatsu
+とうち;touchi
+どうちょう;douchou
+とうてい;toutei
+どうてき;douteki
+とうとい;toutoi
+とうとい;toutoi
+どうとう;doutou
+どうどう;doudou
+とうとぶ;toutobu
+どうにか;dounika
+とうにゅう;tounyuu
+どうにゅう;dounyuu
+とうにん;tounin
+どうふう;doufuu
+とうぼう;toubou
+とうみん;toumin
+どうめい;doumei
+どうやら;douyara
+どうよう;douyou
+どうりょく;douryoku
+とうろく;touroku
+とうろん;touron
+とおざかる;toozakaru
+とおまわり;toomawari
+トーン;toon
+とかく;tokaku
+とがめる;togameru
+ときおり;tokiori
+とぎれる;togireru
+とく;toku
+とぐ;togu
+とくぎ;tokugi
+どくさい;dokusai
+とくさん;tokusan
+どくじ;dokuji
+とくしゅう;tokushuu
+どくせん;dokusen
+どくそう;dokusou
+とくてん;tokuten
+とくは;tokuha
+とくゆう;tokuyuu
+とげ;toge
+とげる;togeru
+どころか;dokoroka
+としごろ;toshigoro
+とじまり;tojimari
+とじょう;tojou
+とじる;tojiru
+どだい;dodai
+とだえる;todaeru
+とっきょ;tokkyo
+とっけん;tokken
+とっさに;tossani
+とつじょ;totsujo
+とって;totte
+とっぱ;toppa
+どて;dote
+とどけ;todoke
+とどこおる;todokooru
+ととのえる;totonoeru
+とどめる;todomeru
+となえる;tonaeru
+とのさま;tonosama
+どひょう;dohyou
+とびら;tobira
+どぶ;dobu
+とほ;toho
+どぼく;doboku
+とぼける;tobokeru
+とぼしい;toboshii
+とみ;tomi
+とむ;tomu
+とも;tomo
+ともかせぎ;tomokasegi
+ともなう;tomonau
+ともばたらき;tomobataraki
+ドライ;dorai
+ドライクリーニング;doraikuriiningu
+ドライバー;doraibaa
+ドライブイン;doraibuin
+トラブル;toraburu
+トランジスター;toranjisutaa
+とりあえず;toriaezu
+とりあつかい;toriatsukai
+とりあつかう;toriatsukau
+とりい;torii
+とりかえ;torikae
+とりくむ;torikumu
+とりしまり;torishimari
+とりしまる;torishimaru
+とりしらべる;torishiraberu
+とりたてる;toritateru
+とりつぐ;toritsugu
+とりつける;toritsukeru
+とりのぞく;torinozoku
+とりひき;torihiki
+とりまく;torimaku
+とりまぜる;torimazeru
+とりもどす;torimodosu
+とりよせる;toriyoseru
+ドリル;doriru
+とりわけ;toriwake
+とろける;torokeru
+どんかん;donkan
+とんだ;tonda
+どわすれ;dowasure
+とんや;ton_ya
+ないかく;naikaku
+ないし;naishi
+ないしょ;naisho
+ないしん;naishin
+ないぞう;naizou
+ナイター;naitaa
+ないぶ;naibu
+ないらん;nairan
+ないりく;nairiku
+なえ;nae
+なおさら;naosara
+ながし;nagashi
+ながなが;naganaga
+なかほど;nakahodo
+なぎさ;nagisa
+なげく;nageku
+なげだす;nagedasu
+なこうど;nakoudo
+なごやか;nagoyaka
+なごり;nagori
+なさけ;nasake
+なさけない;nasakenai
+なさけぶかい;nasakebukai
+なじる;najiru
+なだかい;nadakai
+なだれ;nadare
+なつく;natsuku
+なづける;nadukeru
+なにげない;nanigenai
+なにとぞ;nanitozo
+なにより;naniyori
+ナプキン;napukin
+なふだ;nafuda
+なまぐさい;namagusai
+なまぬるい;namanurui
+なまみ;namami
+なまり;namari
+なみ;nami
+なめらか;nameraka
+なめる;nameru
+なやましい;nayamashii
+なやます;nayamasu
+なやみ;nayami
+ならす;narasu
+ならす;narasu
+ならびに;narabini
+なりたつ;naritatsu
+なるたけ;narutake
+なれ;nare
+なれなれしい;narenareshii
+なん;nan
+なんか;nanka
+ナンセンス;nansensu
+なんだか;nandaka
+なんだかんだ;nandakanda
+なんなり;nannari
+に;ni
+にかよう;nikayou
+にきび;nikibi
+にぎわう;nigiwau
+にくしみ;nikushimi
+にくしん;nikushin
+にくたい;nikutai
+にげだす;nigedasu
+にしび;nishibi
+にじむ;nijimu
+にせもの;nisemono
+にちや;nichiya
+にづくり;nidukuri
+になう;ninau
+にぶる;niburu
+にもかかわらず;nimokakawarazu
+ニュアンス;nyuansu
+ニュー;nyuu
+にゅうしゅ;nyuushu
+にゅうしょう;nyuushou
+にゅうよく;nyuuyoku
+にょう;nyou
+にんしき;ninshiki
+しんじょう;shinjou
+にんしん;ninshin
+にんむ;ninmu
+にんめい;ninmei
+ぬかす;nukasu
+ぬけだす;nukedasu
+ぬし;nushi
+ぬま;numa
+ね;ne
+ねいろ;neiro
+ねうち;neuchi
+ネガ;nega
+ねかせる;nekaseru
+ねじまわし;nejimawashi
+ねじれる;nejireru
+ねたむ;netamu
+ねだる;nedaru
+ねつい;netsui
+ねっとう;nettou
+ねつりょう;netsuryou
+ねばり;nebari
+ねばる;nebaru
+ねびき;nebiki
+ねまわし;nemawashi
+ねむたい;nemutai
+ねる;neru
+ねん;nen
+ねんが;nenga
+ねんかん;nenkan
+ねんがん;nengan
+ねんごう;nengou
+ねんしょう;nenshou
+ねんちょう;nenchou
+ねんりょう;nenryou
+ねんりん;nenrin
+ノイローゼ;noirooze
+のう;nou
+のうこう;noukou
+のうじょう;noujou
+のうち;nouchi
+のうにゅう;nounyuu
+のがす;nogasu
+のがれる;nogareru
+のきなみ;nokinami
+のぞましい;nozomashii
+のぞむ;nozomu
+のっとる;nottoru
+のどか;nodoka
+ののしる;nonoshiru
+のべ;nobe
+のみこむ;nomikomu
+のりこむ;norikomu
+は;ha
+は;ha
+バー;baa
+はあく;haaku
+パート;paato
+はい;hai
+はい;hai
+はいき;haiki
+はいきゅう;haikyuu
+ばいきん;baikin
+はいぐうしゃ;haiguusha
+はいけい;haikei
+はいけい;haikei
+はいご;haigo
+はいし;haishi
+はいしゃく;haishaku
+はいじょ;haijo
+ばいしょう;baishou
+はいすい;haisui
+はいせん;haisen
+はいち;haichi
+はいふ;haifu
+はいぶん;haibun
+はいぼく;haiboku
+ばいりつ;bairitsu
+はいりょ;hairyo
+はいれつ;hairetsu
+はえる;haeru
+はかい;hakai
+はかどる;hakadoru
+はかない;hakanai
+ばかばかしい;bakabakashii
+はかる;hakaru
+はかる;hakaru
+はき;haki
+はぐ;hagu
+はくがい;hakugai
+はくじゃく;hakujaku
+はくじょう;hakujou
+ばくぜん;bakuzen
+ばくだん;bakudan
+ばくは;bakuha
+ばくろ;bakuro
+はげます;hagemasu
+はげむ;hagemu
+はげる;hageru
+ばける;bakeru
+はけん;haken
+はじ;haji
+はじく;hajiku
+パジャマ;pajama
+はじらう;hajirau
+はじる;hajiru
+はしわたし;hashiwatashi
+バス;basu
+はずむ;hazumu
+はそん;hason
+はたく;hataku
+はだし;hadashi
+ひずむ;hizumu
+ひそか;hisoka
+ひたす;hitasu
+ひたすら;hitasura
+ひだりきき;hidarikiki
+ひっかく;hikkaku
+ひっしゅう;hisshuu
+びっしょり;bisshori
+ひつぜん;hitsuzen
+ひってき;hitteki
+ひといき;hitoiki
+ひとかげ;hitokage
+ひとがら;hitogara
+ひとけ;hitoke
+ひところ;hitokoro
+ひとじち;hitojichi
+ひとすじ;hitosuji
+ひとめ;hitome
+ひどり;hidori
+ひな;hina
+ひなまつり;hinamatsuri
+ひなた;hinata
+ひなん;hinan
+ひなん;hinan
+ひのまる;hinomaru
+ひばな;hibana
+ひび;hibi
+ひめい;himei
+ひやかす;hiyakasu
+ひやけ;hiyake
+ひょう;hyou
+ひょうご;hyougo
+びょうしゃ;byousha
+ひょっと;hyotto
+びら;bira
+ひらたい;hiratai
+びり;biri
+ひりつ;hiritsu
+びりょう;biryou
+ひるめし;hirumeshi
+ひれい;hirei
+ひろう;hirou
+ひろまる;hiromaru
+びんかん;binkan
+ひんこん;hinkon
+ひんしつ;hinshitsu
+ひんじゃく;hinjaku
+ひんしゅ;hinshu
+ヒント;hinto
+ひんぱん;hinpan
+びんぼう;binbou
+ファイト;faito
+ファイル;fairu
+ファン;fan
+ふい;fui
+フィルタ;firuta
+ふう;fuu
+ふうさ;fuusa
+ふうしゃ;fuusha
+ふうしゅう;fuushuu
+ふうぞく;fuuzoku
+ブーツ;buutsu
+ふうど;fuudo
+ブーム;buumu
+フォーム;foomu
+ぶか;buka
+ふかけつ;fukaketsu
+ぶかぶか;bukabuka
+ふかめる;fukameru
+ふきつ;fukitsu
+ふきょう;fukyou
+ふきん;fukin
+ふく;fuku
+ふくごう;fukugou
+ふくし;fukushi
+ふくめん;fukumen
+ふくれる;fukureru
+ふけいき;fukeiki
+ふける;fukeru
+ふける;fukeru
+ふごう;fugou
+ふこく;fukoku
+ブザー;buzaa
+ふさい;fusai
+ふざい;fuzai
+ふさわしい;fusawashii
+ふじゅん;fujun
+ふしょう;fushou
+ぶじょく;bujoku
+ふしん;fushin
+ふしん;fushin
+ぶそう;busou
+ふだ;fuda
+ふたん;futan
+ふちょう;fuchou
+ふっかつ;fukkatsu
+ぶつぎ;butsugi
+ふっきゅう;fukkyuu
+ふっこう;fukkou
+ぶっし;busshi
+ぶつぞう;butsuzou
+ぶったい;buttai
+ふっとう;futtou
+ふとう;futou
+ふどうさん;fudousan
+ぶなん;bunan
+ふにん;funin
+ふはい;fuhai
+ふひょう;fuhyou
+ふふく;fufuku
+ふへん;fuhen
+ふまえる;fumaeru
+ふみこむ;fumikomu
+ふめい;fumei
+ぶもん;bumon
+ふよう;fuyou
+ふらふら;furafura
+ぶらぶら;burabura
+ふり;furi
+ふりかえる;furikaeru
+ふりだし;furidashi
+ふりょう;furyou
+ふりょく;furyoku
+ぶりょく;buryoku
+ブル;buru
+ふるわせる;furuwaseru
+ぶれい;burei
+ふろく;furoku
+フロント;furonto
+ふんがい;fungai
+ぶんかざい;bunkazai
+ぶんぎょう;bungyou
+ぶんご;bungo
+ぶんさん;bunsan
+ぶんし;bunshi
+ふんしつ;funshitsu
+ふんしゅつ;funshutsu
+ぶんしょ;bunsho
+ふんそう;funsou
+ふんだん;fundan
+ぶんたん;buntan
+ふんとう;funtou
+ぶんぱい;bunpai
+ぶんぼ;bunbo
+ふんまつ;funmatsu
+ぶんり;bunri
+ぶんれつ;bunretsu
+ペア;pea
+へいき;heiki
+へいこう;heikou
+へいこう;heikou
+へいさ;heisa
+へいし;heishi
+へいじょう;heijou
+へいほう;heihou
+へいれつ;heiretsu
+ぼうどう;boudou
+ほうび;houbi
+ぼうふう;boufuu
+ほうむる;houmuru
+ほうりこむ;hourikomu
+ほうりだす;houridasu
+ぼうりょく;bouryoku
+ほうわ;houwa
+ホース;hoosu
+ポーズ;poozu
+ホール;hooru
+ほおん;hoon
+ほかく;hokaku
+ほかん;hokan
+ほきゅう;hokyuu
+ほきょう;hokyou
+ぼきん;bokin
+ぼくし;bokushi
+ほげい;hogei
+ぼける;bokeru
+ほけん;hoken
+ほご;hogo
+ぼこう;bokou
+ぼこく;bokoku
+ほこる;hokoru
+ほころびる;hokorobiru
+ほし;hoshi
+ポジション;pojishon
+ほしもの;hoshimono
+ほしゅ;hoshu
+ほじゅう;hojuu
+ほじょ;hojo
+ほしょう;hoshou
+ほしょう;hoshou
+ほそう;hosou
+ほそく;hosoku
+ぼち;bochi
+ほっさ;hossa
+ぼっしゅう;bosshuu
+ほっそく;hossoku
+ほっと;hotto
+ポット;potto
+ほっぺた;hoppeta
+ぼつぼつ;botsubotsu
+ぼつらく;botsuraku
+ほどける;hodokeru
+ほどこす;hodokosu
+ほとり;hotori
+ぼやく;boyaku
+ぼやける;boyakeru
+ほよう;hoyou
+ほりょ;horyo
+ボルト;boruto
+ほろびる;horobiru
+ほろぼす;horobosu
+ほんかく;honkaku
+ほんかん;honkan
+ほんき;honki
+ほんごく;hongoku
+ほんしつ;honshitsu
+ほんたい;hontai
+ほんね;honne
+ほんのう;honnou
+ほんば;honba
+ポンプ;ponpu
+ほんぶん;honbun
+ほんみょう;honmyou
+マーク;maaku
+マイ;mai
+マイクロフォン;maikurofon
+まいぞう;maizou
+まう;mau
+まうえ;maue
+まえうり;maeuri
+まえおき;maeoki
+まえもって;maemotte
+まかす;makasu
+まかす;makasu
+まかなう;makanau
+まぎらわしい;magirawashii
+まぎれる;magireru
+まく;maku
+まごころ;magokoro
+まごつく;magotsuku
+まこと;makoto
+まことに;makotoni
+まさしく;masashiku
+まさる;masaru
+まし;mashi
+まじえる;majieru
+ました;mashita
+まして;mashite
+まじわる;majiwaru
+ますい;masui
+マスコミ;masukomi
+また;mata
+またがる;matagaru
+まちあわせ;machiawase
+まちどおしい;machidooshii
+まちのぞむ;machinozomu
+まちまち;machimachi
+まつ;matsu
+まっき;makki
+マッサージ;massaaji
+まっぷたつ;mapputatsu
+まと;mato
+まとまり;matomari
+まとめ;matome
+まぬがれる;manugareru
+まねき;maneki
+まばたき;mabataki
+まひ;mahi
+まみれ;mamire
+まゆ;mayu
+まり;mari
+まるごと;marugoto
+まるっきり;marukkiri
+まるまる;marumaru
+まるめる;marumeru
+まんげつ;mangetsu
+まんじょう;manjou
+まんまえ;manmae
+まんまるい;manmarui
+まんまるい;manmarui
+み;mi
+みあい;miai
+みあわせる;miawaseru
+みおとす;miotosu
+みかい;mikai
+みかく;mikaku
+みかける;mikakeru
+みき;miki
+みぐるしい;migurushii
+みこみ;mikomi
+みこん;mikon
+みじゅく;mijuku
+みじん;mijin
+ミス;misu
+みずけ;mizuke
+ミスプリント;misupurinto
+みすぼらしい;misuborashii
+ミセス;misesu
+みせびらかす;misebirakasu
+みせもの;misemono
+みぞ;mizo
+みたす;mitasu
+みだす;midasu
+みだれる;midareru
+みち;michi
+みぢか;midika
+みちびく;michibiku
+みっしゅう;misshuu
+みっせつ;missetsu
+みつど;mitsudo
+みつもり;mitsumori
+みてい;mitei
+みとおし;mitooshi
+みなす;minasu
+みなもと;minamoto
+みならう;minarau
+みなり;minari
+みね;mine
+みのうえ;minoue
+みのがす;minogasu
+みのまわり;minomawari
+みはからう;mihakarau
+みはらし;miharashi
+みぶり;miburi
+みゃく;myaku
+ミュージック;myuujikku
+みれん;miren
+みわたす;miwatasu
+みんしゅく;minshuku
+みんぞく;minzoku
+みんぞく;minzoku
+むいみ;muimi
+ムード;muudo
+むくち;mukuchi
+むこ;muko
+むこう;mukou
+むごん;mugon
+むじゃき;mujaki
+むしる;mushiru
+むすび;musubi
+むすびつき;musubitsuki
+むすびつく;musubitsuku
+むすびつける;musubitsukeru
+むせん;musen
+むだづかい;mudadukai
+むだん;mudan
+むち;muchi
+むちゃ;mucha
+むちゃくちゃ;muchakucha
+むなしい;munashii
+むねん;munen
+むのう;munou
+むやみに;muyamini
+むよう;muyou
+むら;mura
+むらがる;muragaru
+むろん;muron
+めいさん;meisan
+めいしょう;meishou
+めいちゅう;meichuu
+めいはく;meihaku
+めいぼ;meibo
+めいよ;meiyo
+めいりょう;meiryou
+めいろう;meirou
+メーカー;meekaa
+めかた;mekata
+めぐみ;megumi
+めぐむ;megumu
+めくる;mekuru
+めざましい;mezamashii
+めざめる;mezameru
+めす;mesu
+めす;mesu
+めつき;metsuki
+メッセージ;messeeji
+めつぼう;metsubou
+メディア;media
+めど;medo
+めもり;memori
+メロディー;merodii
+めんかい;menkai
+めんじょ;menjo
+めんする;mensuru
+めんぼく;menboku
+めんもく;menmoku
+もう;mou
+もうける;moukeru
+もうしいれる;moushiireru
+もうしこみ;moushikomi
+もうしで;moushide
+もうしでる;moushideru
+もうしぶん;moushibun
+もうてん;mouten
+もうれつ;mouretsu
+モーテル;mooteru
+もがく;mogaku
+もくろく;mokuroku
+もくろみ;mokuromi
+もけい;mokei
+もさく;mosaku
+もしかして;moshikashite
+もしくは;moshikuha
+もたらす;motarasu
+もちきり;mochikiri
+もっか;mokka
+もっぱら;moppara
+もてなす;motenasu
+もてる;moteru
+モニター;monitaa
+もの;mono
+ものずき;monozuki
+ものたりない;monotarinai
+もはや;mohaya
+もはん;mohan
+もほう;mohou
+もめる;momeru
+もも;momo
+もも;momo
+もよおす;moyoosu
+もらす;morasu
+もりあがる;moriagaru
+もる;moru
+もれる;moreru
+もろい;moroi
+もろに;moroni
+や;ya
+やがい;yagai
+やく;yaku
+やぐ;yagu
+やくしょく;yakushoku
+やくば;yakuba
+やけに;yakeni
+やしき;yashiki
+やしなう;yashinau
+やしん;yashin
+やすっぽい;yasuppoi
+やすめる;yasumeru
+やせい;yasei
+やつ;yatsu
+やとう;yatou
+やみ;yami
+やむ;yamu
+ややこしい;yayakoshii
+やりとおす;yaritoosu
+やりとげる;yaritogeru
+やわらげる;yawarageru
+ヤング;yangu
+ゆ;yu
+ゆう;yuu
+ゆうい;yuui
+ゆううつ;yuuutsu
+ゆうえき;yuueki
+ゆうえつ;yuuetsu
+ゆうかん;yuukan
+ゆうき;yuuki
+ゆうぐれ;yuugure
+ゆうし;yuushi
+ゆうする;yuusuru
+ゆうせい;yuusei
+ゆうせん;yuusen
+ゆうどう;yuudou
+ゆうずう;yuuzuu
+ゆうび;yuubi
+ゆうぼう;yuubou
+ゆうぼく;yuuboku
+ゆうやけ;yuuyake
+ゆうりょく;yuuryoku
+ゆうれい;yuurei
+ゆうわく;yuuwaku
+ゆえ;yue
+ゆがむ;yugamu
+ゆさぶる;yusaburu
+ゆすぐ;yusugu
+ゆとり;yutori
+ユニーク;yuniiku
+ユニフォーム;yunifoomu
+ゆびさす;yubisasu
+ゆみ;yumi
+ゆらぐ;yuragu
+ゆるむ;yurumu
+ゆるめる;yurumeru
+ゆるやか;yuruyaka
+よ;yo
+よう;you
+よういん;youin
+ようえき;youeki
+ようけん;youken
+ようご;yougo
+ようし;youshi
+ようしき;youshiki
+ようする;yousuru
+ようせい;yousei
+ようそう;yousou
+ようひん;youhin
+ようふう;youfuu
+ようほう;youhou
+ようぼう;youbou
+よか;yoka
+よかん;yokan
+よきょう;yokyou
+よきん;yokin
+よく;yoku
+よくあつ;yokuatsu
+よくしつ;yokushitsu
+よくせい;yokusei
+よくふかい;yokufukai
+よくぼう;yokubou
+よける;yokeru
+よげん;yogen
+よこづな;yokoduna
+よごれ;yogore
+よし;yoshi
+よし;yoshi
+よしあし;yoshiashi
+よそう;yosou
+よそみ;yosomi
+よち;yochi
+よって;yotte
+よとう;yotou
+よびとめる;yobitomeru
+よふかし;yofukashi
+よふけ;yofuke
+よほど;yohodo
+よみあげる;yomiageru
+より;yori
+よりかかる;yorikakaru
+よろん;yoron
+せろん;seron
+よわまる;yowamaru
+よわめる;yowameru
+よわる;yowaru
+らいじょう;raijou
+ライス;raisu
+らくのう;rakunou
+らっか;rakka
+らっかん;rakkan
+ラベル;raberu
+ランプ;ranpu
+らんよう;ran_you
+リード;riido
+りくつ;rikutsu
+りし;rishi
+りじゅん;rijun
+りせい;risei
+りそく;risoku
+りったい;rittai
+りっぽう;rippou
+りっぽう;rippou
+りてん;riten
+りゃくだつ;ryakudatsu
+りゃくご;ryakugo
+りゅうつう;ryuutsuu
+りょういき;ryouiki
+りょうかい;ryoukai
+りょうかい;ryoukai
+りょうきょく;ryoukyoku
+りょうこう;ryoukou
+りょうしき;ryoushiki
+りょうしつ;ryoushitsu
+りょうしょう;ryoushou
+りょうしん;ryoushin
+りょうち;ryouchi
+りょうど;ryoudo
+りょうりつ;ryouritsu
+りょかく;ryokaku
+りょけん;ryoken
+りれき;rireki
+りろん;riron
+りんぎょう;ringyou
+るい;rui
+るいすい;ruisui
+るいじ;ruiji
+ルーズ;ruuzu
+ルール;ruuru
+れいこく;reikoku
+れいぞう;reizou
+れいたん;reitan
+レース;reesu
+レギュラー;regyuraa
+レッスン;ressun
+レディー;redii
+レバー;rebaa
+れんあい;ren_ai
+れんきゅう;renkyuu
+レンジ;renji
+れんじつ;renjitsu
+れんたい;rentai
+レンタカー;rentakaa
+れんちゅう;renchuu
+レントゲン;rentogen
+れんぽう;renpou
+れんめい;renmei
+ろうすい;rousui
+ろうどく;roudoku
+ろうひ;rouhi
+ろうりょく;rouryoku
+ロープウエイ;roopuuei
+ロープ;roopu
+ろくな;rokuna
+ろこつ;rokotsu
+ロマンチック;romanchikku
+ろんぎ;rongi
+ろんり;ronri
+わく;waku
+わくせい;wakusei
+わざ;waza
+わざわざ;wazawaza
+わずらわしい;wazurawashii
+わたりどり;wataridori
+ワット;watto
+わび;wabi
+わぶん;wabun
+わら;wara
+わり;wari
+わりあて;wariate
+わりこむ;warikomu
+わるもの;warumono
+われ;ware
+いない;inai
+けいかくです;keikakudesu
+たがる;tagaru
+とちがう;tochigau
+として;toshite
+やをない;yawonai
+あがる;agaru
+あいだ;aida
+あじ;aji
+あかりがきえている;akarigakieteiru
+あきる;akiru
+あまい;amai
+あんぜん;anzen
+あらゆる;arayuru
+あさい;asai
+あつい;atsui
+あつまり;atsumari
+あつまる;atsumaru
+あつめる;atsumeru
+あやまる;ayamaru
+AよりBのほうがわかいです;AyoriBnohougawakaidesu
+ばんぐみ;bangumi
+バター;bataa
+ベル;beru
+びっくり;bikkuri
+びしょうじょ;bishoujo
+ボタン;botan
+ぶどうしゅ;budoushu
+ぶん;bun
+ぶんれい;bunrei
+ちゃんと;chanto
+ち;chi
+ちかぢか;chikadika
+ちから;chikara
+ちょうし;choushi
+ちゅうがっこう;chuugakkou
+ちゅういする;chuuisuru
+だけど;dakedo
+だんぼう;danbou
+だれにでも;darenidemo
+だろう;darou
+だす;dasu
+だす;dasu
+でんとう;dentou
+でている;deteiru
+どんなでも;donnademo
+どんなに;donnani
+どのくらい;donokurai
+どりょく;doryoku
+どうぶつえん;doubutsuen
+どうどう;doudou
+どうしたの;doushitano
+どうやって;douyatte
+えだ;eda
+えいがかん;eigakan
+えらぶ;erabu
+ふで;fude
+ふえる;fueru
+ふかい;fukai
+ふく;fuku
+ふね;fune
+ふとい;futoi
+ふつか;futsuka
+ふつう;futsuu
+ふつうの;futsuuno
+ふうとう;fuutou
+がいこくじん;gaikokujin
+ガソリンスタンド;gasorinsutando
+ごい;goi
+ごめんください;gomenkudasai
+はく;haku
+はなし;hanashi
+はらい;harai
+はしる;hashiru
+はたらく;hataraku
+はつか;hatsuka
+へる;heru
+ひえる;hieru
+ひがし;higashi
+ひきだし;hikidashi
+ひろば;hiroba
+ひろい;hiroi
+ひるま;hiruma
+ひるすぎ;hirusugi
+ひつよう;hitsuyou
+ほか;hoka
+ほしい;hoshii
+ほそい;hosoi
+いちじかんご;ichijikango
+いがい;igai
+いいんだけど;iindakedo
+いまでも;imademo
+いみ;imi
+いのり;inori
+いれる;ireru
+いろいろあるね;iroiroarune
+いし;ishi
+いそいで;isoide
+いっしょう;isshou
+いっしゅうかん;isshuukan
+いたむ;itamu
+いたす;itasu
+いつか;itsuka
+いつか;itsuka
+いやでも;iyademo
+じゃ、このつぎ;ja_konotsugi
+じしん;jishin
+じしん;jishin
+じしょをひく;jishowohiku
+じゆう;jiyuu
+じゆうじかん;jiyuujikan
+じょうず;jouzu
+じょうずに;jouzuni
+じゅんばん;junban
+じゅんび;junbi
+じゅうよっか;juuyokka
+カーテン;kaaten
+かどうか;kadouka
+かがみ;kagami
+かい;kai
+かいわ;kaiwa
+かっこ;kakko
+かまいません;kamaimasen
+かまわない;kamawanai
+かならず;kanarazu
+かんがえる;kangaeru
+かんごふ;kangofu
+かんじる;kanjiru
+からだ;karada
+からい;karai
+かす;kasu
+かたち;katachi
+かつ;katsu
+かうことにする;kaukotonisuru
+かわく;kawaku
+かわる;kawaru
+かよう;kayou
+かざる;kazaru
+かぜ;kaze
+かぜ;kaze
+けんきゅう;kenkyuu
+けんきゅうしつ;kenkyuushitsu
+けんめい;kenmei
+けしごむ;keshigomu
+けっして;kesshite
+きびしい;kibishii
+きけん;kiken
+きんえん;kin_en
+きたない;kitanai
+きわめる;kiwameru
+コギャル;kogyaru
+こくでん;kokuden
+こくご;kokugo
+こまる;komaru
+ころぶ;korobu
+こし;koshi
+こしょう;koshou
+こたえ;kotae
+こうちょう;kouchou
+こうえい;kouei
+こうぎ;kougi
+こういう;kouiu
+こうとうがっこう;koutougakkou
+くらべる;kuraberu
+くらい;kurai
+きょく;kyoku
+きょう;kyou
+きょうかしょ;kyoukasho
+きょうしつ;kyoushitsu
+きゅうに;kyuuni
+まちあわせ;machiawase
+まちがい;machigai
+まいる;mairu
+まなぶ;manabu
+まねき;maneki
+まにあう;maniau
+まるい;marui
+めがねをかける;meganewokakeru
+めがさめる;megasameru
+めいれい;meirei
+めざめる;mezameru
+みにいく;miniiku
+みたい;mitai
+もじ;moji
+もつ;motsu
+もうすぐです;mousugudesu
+むかい;mukai
+むこう;mukou
+むり;muri
+むりに;murini
+なのか;nanoka
+ならべる;naraberu
+ならぶ;narabu
+ならう;narau
+ねむれない;nemurenai
+にがい;nigai
+にじゅうよっか;nijuuyokka
+にかい;nikai
+にんじん;ninjin
+にし;nishi
+ので;node
+のに;noni
+にゅうがく;nyuugaku
+おこす;okosu
+おくれる;okureru
+おくりもの;okurimono
+おくりさき;okurisaki
+おくる;okuru
+おみやげ;omiyage
+おもい;omoi
+おもいだす;omoidasu
+おもいで;omoide
+おもう;omou
+おなじ;onaji
+おおい;ooi
+オートバイ;ootobai
+おれい;orei
+おさきにしつれいします;osakinishitsureishimasu
+おしいれ;oshiire
+パソコン;pasokon
+らくな;rakuna
+らしい;rashii
+れい;rei
+れいぼう;reibou
+りゆう;riyuu
+りょう;ryou
+さびしい;sabishii
+さがる;sagaru
+さがす;sagasu
+さがす;sagasu
+さいご;saigo
+さいきん;saikin
+さいてい;saitei
+さいやく;saiyaku
+さく;saku
+さくぶん;sakubun
+さんかく;sankaku
+さしあげる;sashiageru
+せいかい;seikai
+せいかく;seikaku
+せいせき;seiseki
+せき;seki
+せなか;senaka
+しゃしんか;shashinka
+しゃしんをとる;shashinwotoru
+しあい;shiai
+しばふ;shibafu
+しばらくです;shibarakudesu
+しか;shika
+しま;shima
+しまる;shimaru
+しも;shimo
+しなもの;shinamono
+しんぱい;shinpai
+しらべる;shiraberu
+しる;shiru
+したく;shitaku
+しつもん;shitsumon
+しょくどう;shokudou
+しょうがっこう;shougakkou
+しょうじょ;shoujo
+しょうじょう;shoujou
+しょうたい;shoutai
+しゅっきん;shukkin
+しゅくだいをだす;shukudaiwodasu
+しゅみ;shumi
+しゅうり;shuuri
+それに;soreni
+そつぎょうしき;sotsugyoushiki
+そうじ;souji
+すべりやすい;suberiyasui
+すぐ;sugu
+すいどう;suidou
+すいえい;suiei
+すいか;suika
+すっかり;sukkari
+すむ;sumu
+すわる;suwaru
+すずしい;suzushii
+たちいりきんし;tachiirikinshi
+たいふう;taifuu
+たいいん;taiin
+たてる;tateru
+たとえば;tatoeba
+たずねる;tazuneru
+たずねる;tazuneru
+てまえ;temae
+てんらんかい;tenrankai
+てつだい;tetsudai
+とぶ;tobu
+という;toiu
+といわれた;toiwareta
+ところ;tokoro
+ところで;tokorode
+ところです;tokorodesu
+とく;toku
+とくに;tokuni
+とまる;tomaru
+とにかく;tonikaku
+とおか;tooka
+とおる;tooru
+とりあえず;toriaezu
+とうとう;toutou
+ついたち;tsuitachi
+つくる;tsukuru
+つまらない;tsumaranai
+つめたい;tsumetai
+つれてくる;tsuretekuru
+つよい;tsuyoi
+うける;ukeru
+うる;uru
+うすい;usui
+うつす;utsusu
+うつす;utsusu
+わかれる;wakareru
+わけ;wake
+われる;wareru
+わる;waru
+わたる;wataru
+やりかた;yarikata
+やせている;yaseteiru
+よごれる;yogoreru
+よほう;yohou
+よこ;yoko
+よく;yoku
+よく;yoku
+よくじつ;yokujitsu
+よんかい;yonkai
+よる;yoru
+よしゅう;yoshuu
+よてい;yotei
+よう;you
+ようだ;youda
+ようふく;youfuku
+ようか;youka
+ようになりました;youninarimashita
+ようす;yousu
+よわい;yowai
+ゆれる;yureru
+ゆうえんち;yuuenchi
+ユーロー;yuuroo
+ぜんぶ;zenbu
+ぜんぶで;zenbude
+ずっと;zutto
+だいいっか;daiikka
+にほんご;nihongo
+べんきょうする;benkyousuru
+だいがく;daigaku
+ある;aru
+たてもの;tatemono
+おおきい;ookii
+そして;soshite
+りっぱだ;rippada
+がくせい;gakusei
+かず;kazu
+おおい;ooi
+なかむら;nakamura
+にほんじん;nihonjin
+たち;tachi
+まいにち;mainichi
+おしえる;oshieru
+きょうしつ;kyoushitsu
+はなす;hanasu
+にほんにっぽん;nihonnippon
+がっか;gakka
+にほんがっか;nihongakka
+ちいさい;chiisai
+きれいだ;kireida
+いく;iku
+バス;basu
+きょう;kyou
+ごぜん;gozen
+ごぜんちゅう;gozenchuu
+じゅぎょう;jugyou
+しゅっせき;shusseki
+しゅっせきする;shussekisuru
+としょかん;toshokan
+ほん;hon
+よむ;yomu
+しずかだ;shizukada
+こんばん;konban
+たんご;tango
+それから;sorekara
+さくぶん;sakubun
+そのあと;sonoato
+ともだち;tomodachi
+てがみ;tegami
+たのしい;tanoshii
+さん;san
+おがわ;ogawa
+だいにか;dainika
+かぞく;kazoku
+ごにん;gonin
+ちち;chichi
+がいむしょう;gaimushou
+はは;haha
+えいご;eigo
+とても;totemo
+いそがしい;isogashii
+にわ;niwa
+ひろい;hiroi
+ばら;bara
+など;nado
+はな;hana
+さく;saku
+きょうだい;kyoudai
+あに;ani
+おきる;okiru
+パン;pan
+をでる;woderu
+こうぎ;kougi
+はじまる;hajimaru
+ぶんがく;bungaku
+ぜんぜんない;zenzennai
+たいくつ;taikutsu
+たいくつする;taikutsusuru
+れきし;rekishi
+げつようび;getsuyoubi
+すいようび;suiyoubi
+やさしい;yasashii
+どいつご;doitsugo
+じょうずだ;jouzuda
+わかる;wakaru
+しつもん;shitsumon
+しつもんする;shitsumonsuru
+こたえる;kotaeru
+しんせつだ;shinsetsuda
+おわる;owaru
+ほかのひ;hokanohi
+こうがい;kougai
+あまりない;amarinai
+べんりだ;benrida
+へいじつ;heijitsu
+かじ;kaji
+かいもの;kaimono
+りょうりする;ryourisuru
+つくる;tsukuru
+さら;sara
+あらう;arau
+そうじ;souji
+そうじする;soujisuru
+ねる;neru
+そうです;soudesu
+かようび;kayoubi
+もくようび;mokuyoubi
+きんようび;kin_youbi
+だいよんか;daiyonka
+けんぶつ;kenbutsu
+けんぶつする;kenbutsusuru
+どいつみんしゅきょうわこく;doitsuminshukyouwakoku
+しゅと;shuto
+かんこうきゃく;kankoukyaku
+ここ;koko
+ひろば;hiroba
+ひらた;hirata
+つうやく;tsuuyaku
+つうやくする;tsuuyakusuru
+あたり;atari
+あるく;aruku
+あれ;are
+ホテル;hoteru
+ね;ne
+それに;soreni
+ひゃくめえてる;hyakumeeteru
+さあ;saa
+しる;shiru
+ひだり;hidari
+デパート;depaato
+みぎ;migi
+しちょうしゃ;shichousha
+この;kono
+だいぶぶん;daibubun
+てれびとう;terebitou
+うえ;ue
+のぼる;noboru
+エレベーター;erebeetaa
+めいしょ;meisho
+はいる;hairu
+こくでん;kokuden
+えき;eki
+ふたり;futari
+どいつじん;doitsujin
+おちゃ;ocha
+ちゃ;cha
+だいすきだ;daisukida
+ご;go
+しょくぎょう;shokugyou
+ぎし;gishi
+よく;yoku
+はたらく;hataraku
+あね;ane
+おとうと;otouto
+ほんとうに;hontouni
+たいへんだ;taihenda
+かんしん;kanshin
+かんしんする;kanshinsuru
+どおり;doori
+おりる;oriru
+おとうとさん;otoutosan
+おいしゃさん;oishasan
+だいごか;daigoka
+ほんや;hon_ya
+たなか;tanaka
+がくしゃ;gakusha
+ことし;kotoshi
+しがつ;shigatsu
+ヨーロッパ;yooroppa
+けんきゅう;kenkyuu
+けんきゅうする;kenkyuusuru
+すごす;sugosu
+でかける;dekakeru
+かう;kau
+さがす;sagasu
+その;sono
+とき;toki
+そのとき;sonotoki
+しりあい;shiriai
+あう;au
+こんにちは;konnichiha
+ひさしぶりです;hisashiburidesu
+このまえから;konomaekara
+みせ;mise
+うる;uru
+よ;yo
+ぶんか;bunka
+かんけい;kankei
+びじゅつ;bijutsu
+じしょ;jisho
+もつ;motsu
+ああ;aa
+いっさつ;issatsu
+でも;demo
+ないよう;naiyou
+いいよい;iiyoi
+へん;hen
+すこし;sukoshi
+さんぽする;sanposuru
+ありがとう;arigatou
+ありがとうございます;arigatougozaimasu
+おうち;ouchi
+とおい;tooi
+かよう;kayou
+やく;yaku
+いちじかん;ichijikan
+かかる;kakaru
+おうふく;oufuku
+おうふくする;oufukusuru
+ふべんだ;fubenda
+りょう;ryou
+すむ;sumu
+げしゅく;geshuku
+げしゅくする;geshukusuru
+しゅじん;shujin
+たいがいぼうえきしょう;taigaibouekishou
+しごと;shigoto
+する;suru
+ひと;hito
+きのう;kinou
+についての;nitsuiteno
+ゆっくり;yukkuri
+さようなら;sayounara
+せいかつする;seikatsusuru
+といっしょに;toisshoni
+だいろっか;dairokka
+とうきょう;toukyou
+だいい;daii
+めんせき;menseki
+せまい;semai
+とち;tochi
+ひとびと;hitobito
+しんじゅく;shinjuku
+としん;toshin
+こうそう;kousou
+けんちく;kenchiku
+きんだいてきだ;kindaitekida
+さいきん;saikin
+たつ;tatsu
+かい;kai
+にかいだて;nikaidate
+ふるい;furui
+あさくさ;asakusa
+せんそうじ;sensouji
+でんとうてきだ;dentoutekida
+じいん;jiin
+とくに;tokuni
+ゆうめいだ;yuumeida
+こうきょ;koukyo
+いちぶ;ichibu
+れきしてきだ;rekishitekida
+とかい;tokai
+ぎんざ;ginza
+にぎやかだ;nigiyakada
+ところ;tokoro
+せんもんてん;senmonten
+つぎつぎに;tsugitsugini
+ならぶ;narabu
+じゅうたく;juutaku
+がい;gai
+じゅうたくがい;juutakugai
+ふえる;fueru
+せいかくだ;seikakuda
+ちほう;chihou
+しゅうへん;shuuhen
+でていく;deteiku
+へる;heru
+ひるま;hiruma
+けん;ken
+かいしゃ;kaisha
+つとめにん;tsutomenin
+つうきん;tsuukin
+つうがく;tsuugaku
+ながい;nagai
+らっしゅのじかん;rasshunojikan
+こうつうきかん;koutsuukikan
+こうそくどうろ;kousokudouro
+てん;ten
+かいけつ;kaiketsu
+かいけつする;kaiketsusuru
+こんご;kongo
+はってん;hatten
+はってんする;hattensuru
+のために;notameni
+じゅうようだ;juuyouda
+へいほう;heihou
+キロ;kiro
+おしえました;oshiemashita
+いろいろだ;iroiroda
+じゅっかいだて;jukkaidate
+いっかい;ikkai
+おおく;ooku
+になっている;ninatteiru
+いちがつ;ichigatsu
+にがつ;nigatsu
+さんがつ;sangatsu
+ごがつ;gogatsu
+ろくがつ;rokugatsu
+しちがつ;shichigatsu
+はちがつ;hachigatsu
+じゅうがつ;juugatsu
+じゅういちがつ;juuichigatsu
+じゅうにがつ;juunigatsu
+れい;rei
+ひゃく;hyaku
+まん;man
+しき;shiki
+いちねん;ichinen
+なつ;natsu
+あき;aki
+ふゆ;fuyu
+へんか;henka
+へんかする;henkasuru
+はっきりする;hakkirisuru
+かんしん;kanshin
+よほう;yohou
+てんきよほう;tenkiyohou
+はじめ;hajime
+あいさつする;aisatsusuru
+えいきょう;eikyou
+あたえる;ataeru
+つよい;tsuyoi
+かぜ;kaze
+ふく;fuku
+おだやかだ;odayakada
+あたたかい;atatakai
+いろ;iro
+さくら;sakura
+によって;niyotte
+ちがう;chigau
+じょうじゅん;joujun
+ばいう;baiu
+きせつ;kisetsu
+ちゅうじゅん;chuujun
+あめ;ame
+きおん;kion
+さがる;sagaru
+かなり;kanari
+すずしい;suzushii
+あつい;atsui
+あがる;agaru
+しっけ;shikke
+よわい;yowai
+むしあつい;mushiatsui
+うみ;umi
+やま;yama
+ほっかいどう;hokkaidou
+しんしゅう;shinshuu
+りょこう;ryokou
+りょこうする;ryokousuru
+おわり;owari
+たいふう;taifuu
+はげしい;hageshii
+さる;saru
+ほんかくてきだ;honkakutekida
+いちねんちゅう;ichinenchuu
+さわやかだ;sawayakada
+あおい;aoi
+そら;sora
+げじゅん;gejun
+ひえる;hieru
+つめたい;tsumetai
+さむい;samui
+にほんかい;nihonkai
+がわ;gawa
+ゆき;yuki
+きゅうしゅう;kyuushuu
+かごしま;kagoshima
+テキスト;tekisuto
+らいしゅう;raishuu
+テスト;tesuto
+くらい;kurai
+なんねん;nannen
+なんじ;nanji
+なんにん;nannin
+なんにち;nannichi
+なんようび;nan_youbi
+なんど;nando
+なんかい;nankai
+なんさつ;nansatsu
+なんまい;nanmai
+なんばん;nanban
+どの;dono
+どんな;donna
+どう;dou
+よてい;yotei
+よていする;yoteisuru
+おげんきですか;ogenkidesuka
+げんきだ;genkida
+ところで;tokorode
+べつにありません;betsuniarimasen
+きょうと;kyouto
+つれていく;tsureteiku
+くわしい;kuwashii
+しんかんせん;shinkansen
+はくぶつかん;hakubutsukan
+けんがく;kengaku
+けんがくする;kengakusuru
+おおさか;oosaka
+ぶんらく;bunraku
+しゅっぱつ;shuppatsu
+しゅっぱつする;shuppatsusuru
+ふん;fun
+ごう;gou
+ひかり;hikari
+はやい;hayai
+おじ;oji
+とまる;tomaru
+おもう;omou
+そう;sou
+ねがう;negau
+おねがいします;onegaishimasu
+もどる;modoru
+くるま;kuruma
+ひえいざん;hieizan
+うんてん;unten
+うんてんする;untensuru
+へただ;hetada
+けっこうだ;kekkouda
+まだない;madanai
+ちず;chizu
+でる;deru
+かいさつぐち;kaisatsuguchi
+まちがえる;machigaeru
+すみませんが;sumimasenga
+きっぷ;kippu
+あんない;annai
+あんないする;annaisuru
+かす;kasu
+ちゅうしん;chuushin
+きょうみぶかい;kyoumibukai
+こんど;kondo
+きたい;kitai
+きたいする;kitaisuru
+おくれる;okureru
+ほか;hoka
+いちにちじゅう;ichinichijuu
+うまれる;umareru
+びじゅつかん;bijutsukan
+げいじゅつ;geijutsu
+がくもん;gakumon
+まち;machi
+として;toshite
+がわ;gawa
+ながれる;nagareru
+かん;kan
+きょういく;kyouiku
+ぎむきょういく;gimukyouiku
+うける;ukeru
+かもく;kamoku
+すうがく;suugaku
+がいこくご;gaikokugo
+いまりやき;imariyaki
+ひん;hin
+びじゅつひん;bijutsuhin
+ふかい;fukai
+げんだい;gendai
+せいじ;seiji
+きょうみ;kyoumi
+きじ;kiji
+かならず;kanarazu
+えいが;eiga
+えいがかん;eigakan
+とうろん;touron
+とうろんする;touronsuru
+そつぎょう;sotsugyou
+そつぎょうする;sotsugyousuru
+ご;go
+きぼう;kibou
+きぼうする;kibousuru
+いがい;igai
+はじめる;hajimeru
+ねっしんだ;nesshinda
+みじかい;mijikai
+きかん;kikan
+じょうたつする;joutatsusuru
+やくす;yakusu
+りゅうがく;ryuugaku
+りゅうがくする;ryuugakusuru
+きかい;kikai
+まもなく;mamonaku
+なれる;nareru
+なら;nara
+のう;nou
+かぶき;kabuki
+かんがえる;kangaeru
+こまる;komaru
+はんとし;hantoshi
+たいざい;taizai
+たいざいする;taizaisuru
+けいけん;keiken
+けいけんする;keikensuru
+きこく;kikoku
+きこくする;kikokusuru
+すずき;suzuki
+ふらんすご;furansugo
+ふらんすじん;furansujin
+すいすじん;suisujin
+たんじょうび;tanjoubi
+パーティー;paatii
+さい;sai
+になる;ninaru
+ふつう;futsuu
+かてい;katei
+おさない;osanai
+こども;kodomo
+いわう;iwau
+おとな;otona
+ばあい;baai
+とくべつだ;tokubetsuda
+きょねん;kyonen
+はんがりいじん;hangariijin
+ふんいき;fun_iki
+ちょくせつ;chokusetsu
+ふれる;fureru
+じぶん;jibun
+しょうたい;shoutai
+しょうたいする;shoutaisuru
+プレゼント;purezento
+じょうとうだ;joutouda
+ネクタイ;nekutai
+えらぶ;erabu
+よそう;yosou
+よそうする;yosousuru
+いじょう;ijou
+おどろく;odoroku
+それ;sore
+きにいる;kiniiru
+まよう;mayou
+てんいん;ten_in
+そうだん;soudan
+そうだんする;soudansuru
+さいご;saigo
+まい;mai
+さとう;satou
+きゅうだ;kyuuda
+やくそく;yakusoku
+やくそくする;yakusokusuru
+おそい;osoi
+それぞれ;sorezore
+おいわい;oiwai
+おいわいをのべる;oiwaiwonoberu
+のべる;noberu
+くわわる;kuwawaru
+にほんしゅ;nihonshu
+さかな;sakana
+やさい;yasai
+たまご;tamago
+さまざまだ;samazamada
+えんげき;engeki
+ゆかいだ;yukaida
+いけん;iken
+かならずしもない;kanarazushimonai
+しょくご;shokugo
+いもうとさん;imoutosan
+かずこ;kazuko
+ピアノ;piano
+ひく;hiku
+みんよう;min_you
+うたう;utau
+うた;uta
+てんけいてきだ;tenkeitekida
+きょく;kyoku
+いっきょく;ikkyoku
+ならう;narau
+ひとりで;hitoride
+ハンガリー;hangarii
+よろこぶ;yorokobu
+そのころ;sonokoro
+ころ;koro
+おもいがけない;omoigakenai
+こばやし;kobayashi
+ぐうぜんだ;guuzenda
+ほうもん;houmon
+ほうもんする;houmonsuru
+よなか;yonaka
+すぎ;sugi
+かえってくる;kaettekuru
+にとって;nitotte
+わすれがたい;wasuregatai
+ひとばん;hitoban
+まさお;masao
+お;o
+にさつ;nisatsu
+そう、そう;sou_sou
+さがし;sagashi
+やすい;yasui
+なかなかない;nakanakanai
+みつかる;mitsukaru
+いま;ima
+たがい;tagai
+たがいに;tagaini
+かわだ;kawada
+よつや;yotsuya
+かわり;kawari
+そのかわり;sonokawari
+さかなや;sakanaya
+やおや;yaoya
+むかい;mukai
+おすしや;osushiya
+くだもの;kudamono
+くさい;kusai
+におい;nioi
+にがてだ;nigateda
+だめだ;dameda
+ことわる;kotowaru
+つぎ;tsugi
+あおやま;aoyama
+ちかてつ;chikatetsu
+ばんごう;bangou
+ええと;eeto
+まつ;matsu
+ばん;ban
+かとう;katou
+こうしゅうでんわ;koushuudenwa
+でんわをかける;denwawokakeru
+ばしょ;basho
+すぐだ;suguda
+じゅっぷん;juppun
+かんじ;kanji
+かんじがいい;kanjigaii
+へやだい;heyadai
+こうきゅう;koukyuu
+これより;koreyori
+まずない;mazunai
+えん;en
+つらい;tsurai
+くるしい;kurushii
+かぐ;kagu
+りそうてきだ;risoutekida
+あの;ano
+きめる;kimeru
+かおいろ;kaoiro
+かおいろがわるい;kaoirogawarui
+あたま;atama
+きぶんがよい;kibungayoi
+きぶんがいい;kibungaii
+かぜ;kaze
+いけませんね;ikemasenne
+たいしたことはない;taishitakotohanai
+おだいじに;odaijini
+どういしまして;douishimashite
+りょうりや;ryouriya
+や;ya
+にほんりょうりや;nihonryouriya
+そのまえ;sonomae
+いちど;ichido
+おはなしする;ohanashisuru
+フランス;furansu
+びょうき;byouki
+かんきょう;kankyou
+あう;au
+ずつう;zutsuu
+きぶんがわるい;kibungawarui
+すぐ;sugu
+ぶ;bu
+いぎりすじん;igirisujin
+しんぱい;shinpai
+しんぱいする;shinpaisuru
+のみもの;nomimono
+かってくる;kattekuru
+かえり;kaeri
+とちゅう;tochuu
+オレンジ;orenji
+ジュース;juusu
+オレンジジュース;orenjijuusu
+えんりょ;enryo
+えんりょする;enryosuru
+りんご;ringo
+なし;nashi
+かわく;kawaku
+のどがかわく;nodogakawaku
+みず;mizu
+すっかり;sukkari
+こおり;koori
+まど;mado
+あける;akeru
+ほう;hou
+もうしわけありませんもうしわけありません;moushiwakearimasenmoushiwakearimasen
+ちっともない;chittomonai
+かまいません;kamaimasen
+どうせ;douse
+コンサート;konsaato
+おばさん;obasan
+げしゅくのおばさん;geshukunoobasan
+ゆうごはん;yuugohan
+たのむ;tanomu
+ていねいだ;teineida
+しんさつ;shinsatsu
+しんさつする;shinsatsusuru
+りゅうかん;ryuukan
+はやる;hayaru
+ちゅうしゃ;chuusha
+ちゅうしゃする;chuushasuru
+あんせい;ansei
+もういちど;mouichido
+ようす;yousu
+くすり;kusuri
+いちにち;ichinichi
+かい;kai
+のむ;nomu
+ひとばんじゅう;hitobanjuu
+あせ;ase
+あせをかく;asewokaku
+けさ;kesa
+もう;mou
+ずっと;zutto
+ひる;hiru
+かんだ;kanda
+じつに;jitsuni
+いっそう;issou
+もっとも;mottomo
+より;yori
+せんしゅう;senshuu
+あそぶ;asobu
+あそびにいく;asobiniiku
+たずねる;tazuneru
+さいふ;saifu
+わすれる;wasureru
+おかね;okane
+とる;toru
+でんわがかかる;denwagakakaru
+おそくなってしまった;osokunatteshimatta
+かえって;kaette
+ひつようだ;hitsuyouda
+しんぱいだ;shinpaida
+かんたんだ;kantanda
+ふくざつだ;fukuzatsuda
+わかりにくい;wakarinikui
+しらべる;shiraberu
+わりあい;wariai
+わりあいに;wariaini
+このまえ;konomae
+なかやま;nakayama
+しょくじ;shokuji
+じゅうきょ;juukyo
+やはり;yahari
+こんなんだ;konnanda
+わかい;wakai
+どくとくだ;dokutokuda
+いっぱんてきだ;ippantekida
+したしい;shitashii
+あいだ;aida
+さんかげつ;sankagetsu
+しぜんだ;shizenda
+ひょうげん;hyougen
+ひょうげんする;hyougensuru
+しかた;shikata
+しかたがない;shikataganai
+いっしょうけんめい;isshoukenmei
+どりょく;doryoku
+どりょくする;doryokusuru
+たとえば;tatoeba
+けいとうてきだ;keitoutekida
+あつめる;atsumeru
+ノート;nooto
+ノートする;nootosuru
+ほうほう;houhou
+こまかい;komakai
+そっちょくだ;socchokuda
+ざんねんだ;zannenda
+じょし;joshi
+クラス;kurasu
+がっこう;gakkou
+よにん;yonin
+さらに;sarani
+かんじ;kanji
+きょうじゅ;kyouju
+しゃかいがくしゃ;shakaigakusha
+いっしゅうかん;isshuukan
+ちしきじん;chishikijin
+きんろうしゃ;kinrousha
+はば;haba
+はばひろい;habahiroi
+かいそう;kaisou
+こうかん;koukan
+こうかんする;koukansuru
+こんしゅう;konshuu
+おとずれる;otozureru
+せいねん;seinen
+よか;yoka
+スポーツ;supootsu
+けんこう;kenkou
+まいしゅう;maishuu
+バドミントン;badominton
+たっきゅう;takkyuu
+すいえい;suiei
+すいえいぷうる;suieipuuru
+こてん;koten
+ジャズ;jazu
+ビート;biito
+ギター;gitaa
+つけくわえる;tsukekuwaeru
+ねっちゅうする;necchuusuru
+いう;iu
+ふそく;fusoku
+ふそくする;fusokusuru
+うんどうふそく;undoufusoku
+なりやすい;nariyasui
+うんどうじょう;undoujou
+トラック;torakku
+いち、にかい;ichi_nikai
+はしる;hashiru
+こうか;kouka
+しゅちょう;shuchou
+しゅちょうする;shuchousuru
+いっぱんのひとびと;ippannohitobito
+しせつ;shisetsu
+りょうきん;ryoukin
+りよう;riyou
+りようする;riyousuru
+りようできる;riyoudekiru
+じつじょう;jitsujou
+せつめい;setsumei
+せつめいする;setsumeisuru
+に、さんにん;ni_sannin
+ウインタースポーツ;uintaasupootsu
+やすみ;yasumi
+ふゆやすみ;fuyuyasumi
+スキー;sukii
+スケート;sukeeto
+にたいして;nitaishite
+はんたいする;hantaisuru
+しょうせつ;shousetsu
+し;shi
+しんじる;shinjiru
+あかるい;akarui
+けんこうだ;kenkouda
+くらい;kurai
+かなしい;kanashii
+さびしい;sabishii
+しじん;shijin
+とよぶ;toyobu
+どくしょ;dokusho
+テニス;tenisu
+じゆうだ;jiyuuda
+ぜいたくだ;zeitakuda
+むりだ;murida
+ふさわしい;fusawashii
+さいこう;saikou
+しゅうとく;shuutoku
+しゅうとくする;shuutokusuru
+しょうらい;shourai
+じつようてきだ;jitsuyoutekida
+かいわ;kaiwa
+やくにたつ;yakunitatsu
+さんせい;sansei
+さんせいする;sanseisuru
+たいせつだ;taisetsuda
+ちゅういする;chuuisuru
+ちゅういぶかい;chuuibukai
+ポーランド;poorando
+はじめて;hajimete
+もう(+Mengenangabe);mou(+Mengenangabe)
+いっかげつ;ikkagetsu
+べつの;betsuno
+ぶるがりあじん;burugariajin
+ドイツ;doitsu
+ながされる;nagasareru
+しゅうしょく;shuushoku
+しゅうしょくする;shuushokusuru
+ひさしぶりだ;hisashiburida
+よねんせい;yonensei
+とうじ;touji
+なかの;nakano
+ほうそうきょく;housoukyoku
+しけん;shiken
+しけんをうける;shikenwoukeru
+けっか;kekka
+おちる;ochiru
+とおり;toori
+しんぶんしゃ;shinbunsha
+ジャーナリスト;jaanarisuto
+とくはいん;tokuhain
+かつやく;katsuyaku
+かつやくする;katsuyakusuru
+りかい;rikai
+りかいする;rikaisuru
+たすける;tasukeru
+ぎんこう;ginkou
+ぎんこういん;ginkouin
+かくじつだ;kakujitsuda
+がいこうかん;gaikoukan
+たいしかん;taishikan
+きょうそう;kyousou
+きょうそうする;kyousousuru
+りつ;ritsu
+かいがい;kaigai
+ちゅうざい;chuuzai
+ちゅうざいする;chuuzaisuru
+しょうしゃ;shousha
+しょうしゃいん;shoushain
+ながい;nagai
+きょうし;kyoushi
+かわる;kawaru
+ぐたいてきだ;gutaitekida
+のうみん;noumin
+ふくしまけん;fukushimaken
+のうそん;nouson
+ろうどう;roudou
+ろうどうする;roudousuru
+くろう;kurou
+くろうする;kurousuru
+のうぎょう;nougyou
+じゅうじする;juujisuru
+いなか;inaka
+にあい;niai
+さわがしい;sawagashii
+はなれる;hanareru
+しぜん;shizen
+おくる;okuru
+きかい;kikai
+きかいか;kikaika
+すすむ;susumu
+らくだ;rakuda
+かいぜん;kaizen
+かいぜんする;kaizensuru
+けっしん;kesshin
+けっしんする;kesshinsuru
+やまだ;yamada
+せいじか;seijika
+かいしゃいん;kaishain
+ろうどうくみあい;roudoukumiai
+かつどう;katsudou
+かつどうする;katsudousuru
+しんぽてきだ;shinpotekida
+ろうどうしゃ;roudousha
+じょうけん;jouken
+せいこう;seikou
+せいこうする;seikousuru
+かんこう;kankou
+こくりつ;kokuritsu
+こくりつとしょかん;kokuritsutoshokan
+ひつよう;hitsuyou
+こうかんできる;koukandekiru
+アクセント;akusento
+かわむら;kawamura
+こうし;koushi
+える;eru
+ぶれひとげき;burehitogeki
+かのじょ;kanojo
+それん(=そびえとしゃかいしゅぎきょうわこくれんぽう);soren(=sobietoshakaishugikyouwakokurenpou)
+ぎきょく;gikyoku
+ブレヒトのぎきょく;burehitonogikyoku
+さくひん;sakuhin
+かんしょう;kanshou
+かんしょうする;kanshousuru
+しばい;shibai
+いんしょう;inshou
+しゃかい;shakai
+しゃかいてきだ;shakaitekida
+けいざいてきだ;keizaitekida
+あらゆる;arayuru
+ぶんや;bun_ya
+だんせい;dansei
+じょせい;josei
+けんり;kenri
+ぎむ;gimu
+げきだん;gekidan
+えんしゅつか;enshutsuka
+はいゆう;haiyuu
+かい;kai
+じょゆう;joyuu
+どうりょう;douryou
+のもとに;nomotoni
+さんか;sanka
+さんかする;sankasuru
+うらやましい;urayamashii
+れい;rei
+けっこん;kekkon
+けっこんする;kekkonsuru
+ふたん;futan
+ふたんする;futansuru
+おっと;otto
+しゃかいしゅぎ;shakaishugi
+しゃかいしゅぎこく;shakaishugikoku
+つま;tsuma
+つづける;tsudukeru
+めぐまれる;megumareru
+すてる;suteru
+しゅふ;shufu
+しきりに;shikirini
+おもいだす;omoidasu
+そうりつ;souritsu
+そうりつする;souritsusuru
+げきじょう;gekijou
+レパートリー;repaatorii
+にんき;ninki
+にんきのある;ninkinoaru
+すぐれる;sugureru
+すぐれた;sugureta
+えんぎ;engi
+かんきゃく;kankyaku
+さかんだ;sakanda
+はくしゅ;hakushu
+はくしゅする;hakushusuru
+はんのう;hannou
+はんのうする;hannousuru
+かんげき;kangeki
+かんげきする;kangekisuru
+まんいん;man_in
+てにいれる;teniireru
+にゅうじょうりょう;nyuujouryou
+ふくむ;fukumu
+すべて;subete
+こっか;kokka
+オペラ;opera
+しょうれい;shourei
+しょうれいする;shoureisuru
+ざいせいてきだ;zaiseitekida
+えんじょ;enjo
+えんじょする;enjosuru
+おしむ;oshimu
+ぶんかしょう;bunkashou
+からい;karai
+えいぶんがく;eibungaku
+ただ;tada
+いっぽう;ippou
+とくいだ;tokuida
+ところが;tokoroga
+うしろ;ushiro
+もと;moto
+ほか;hoka
+そと;soto
+ところ;tokoro
+てつだい;tetsudai
+じゅんび;junbi
+じゅんびする;junbisuru
+ほとんどない;hotondonai
+としうえ;toshiue
+よゆう;yoyuu
+ゆでたまご;yudetamago
+ミルク;miruku
+すます;sumasu
+かたづけ;kataduke
+コップ;koppu
+ナイフ;naifu
+フォーク;fooku
+スプーン;supuun
+おゆ;oyu
+しょっき;shokki
+とだな;todana
+バター;bataa
+れいぞうこ;reizouko
+いれる;ireru
+しょくたく;shokutaku
+ふく;fuku
+テーブルセンター;teeburusentaa
+かける;kakeru
+かびん;kabin
+いま;ima
+きもち;kimochi
+きもちがいい;kimochigaii
+たしょう;tashou
+よくじつ;yokujitsu
+ぜんぶ;zenbu
+にちようひん;nichiyouhin
+しょくりょうひん;shokuryouhin
+スーパーマーケット;suupaamaaketto
+きたく;kitaku
+きたくする;kitakusuru
+おもだ;omoda
+こしらえる;koshiraeru
+ひまだ;himada
+ごちそうする;gochisousuru
+たく;taku
+しゅるい;shurui
+おかず;okazu
+みそしる;misoshiru
+にく;niku
+ジャガイモ;jagaimo
+かわ;kawa
+むく;muku
+にんじん;ninjin
+キャベツ;kyabetsu
+きる;kiru
+ほおれんそう;hoorensou
+さとう;satou
+しお;shio
+こしょう;koshou
+あぶら;abura
+す;su
+ちょうみりょう;choumiryou
+おわん;owan
+はし;hashi
+ならべる;naraberu
+そろう;sorou
+ひととき;hitotoki
+すむ;sumu
+かたづける;katadukeru
+いやがる;iyagaru
+なべ;nabe
+フライパン;furaipan
+うえの;ueno
+ひきうける;hikiukeru
+でんき;denki
+でんきそうじき;denkisoujiki
+いえじゅう;iejuu
+したの;shitano
+せんたくする;sentakusuru
+せんたくもの;sentakumono
+ほす;hosu
+とりいれる;toriireru
+アイロン;airon
+アイロンをかける;aironwokakeru
+わける;wakeru
+ぜんたい;zentai
+かんげき;kangeki
+つたえる;tsutaeru
+タクシー;takushii
+さんもんおぺら;sanmon_opera
+じょうえん;jouen
+じょうえんする;jouensuru
+したがって;shitagatte
+かさねて;kasanete
+において;nioite
+にかんして;nikanshite
+にかんれんして;nikanrenshite
+をもって;womotte
+につれて;nitsurete
+にしたがって;nishitagatte
+におうじて;nioujite
+にならんで;ninarande
+たいした;taishita
+いわゆる;iwayuru
+さる;saru
+ぞう;zou
+くま;kuma
+おもしろそうだ;omoshirosouda
+いける;ikeru
+かこむ;kakomu
+おかし;okashi
+れこおどてん;rekoodoten
+クリスマス;kurisumasu
+ひこうき;hikouki
+か;ka
+せきにん;sekinin
+せきにんしゃ;sekininsha
+けいゆ;keiyu
+くうこう;kuukou
+こうくう;koukuu
+とぶ;tobu
+ちょっこう;chokkou
+ちょっこうする;chokkousuru
+じどうしゃ;jidousha
+むかえる;mukaeru
+むかえにいく;mukaeniiku
+むかえにくる;mukaenikuru
+こうくうけん;koukuuken
+りょけん;ryoken
+しょるい;shorui
+たしかめる;tashikameru
+ながめる;nagameru
+じさ;jisa
+ふしぎだ;fushigida
+しゅっこく;shukkoku
+しゅっこくする;shukkokusuru
+カウンター;kauntaa
+かかり;kakari
+かかりのひと;kakarinohito
+にもつ;nimotsu
+じゅうりょう;juuryou
+はかる;hakaru
+ちょうか;chouka
+ちょうかする;choukasuru
+はらう;harau
+てつづき;tetsuduki
+とうじょうけん;toujouken
+ぜいかん;zeikan
+てにもつ;tenimotsu
+けんさ;kensa
+けんさする;kensasuru
+まちあいしつ;machiaishitsu
+とおす;toosu
+めをとおす;mewotoosu
+きない;kinai
+せいけつだ;seiketsuda
+とうちゃく;touchaku
+とうちゃくする;touchakusuru
+のりかえる;norikaeru
+スチュアデス;suchuadesu
+たつ;tatsu
+ゆううつだ;yuuutsuda
+はっちゃく;hacchaku
+はっちゃくする;hacchakusuru
+おおがた;oogata
+じぇっとき;jettoki
+ら;ra
+たいりく;tairiku
+とびつづける;tobitsudukeru
+こうだいだ;koudaida
+こくど;kokudo
+みおろす;miorosu
+あらためる;aratameru
+あらためて;aratamete
+なりたくうこう;naritakuukou
+ちゃくりく;chakuriku
+ちゃくりくする;chakurikusuru
+にゅうこく;nyuukoku
+にゅうこくする;nyuukokusuru
+さしょう;sashou
+しらべ;shirabe
+ホール;hooru
+うけとる;uketoru
+でんぽう;denpou
+うつ;utsu
+でんぽうをうつ;denpouwoutsu
+かんけいしゃ;kankeisha
+しらせる;shiraseru
+しらせてある;shirasetearu
+でむかえる;demukaeru
+とない;tonai
+むかう;mukau
+ふりむく;furimuku
+あつまる;atsumaru
+なごや;nagoya
+ほいくしょ;hoikusho
+ようちえん;youchien
+しょうがっこう;shougakkou
+ちゅうがっこう;chuugakkou
+こうとうがっこう;koutougakkou
+しさつ;shisatsu
+しさつする;shisatsusuru
+まわる;mawaru
+せんもんか;senmonka
+きょういくしょう;kyouikushou
+げんざい;genzai
+はったつ;hattatsu
+はったつする;hattatsusuru
+はったつした;hattatsushita
+しほんしゅぎ;shihonshugi
+しょ;sho
+ちょうさ;chousa
+ちょうさする;chousasuru
+くにぐに;kuniguni
+くらべる;kuraberu
+にかんする;nikansuru
+こくみん;kokumin
+いっぱん;ippan
+しりつ;shiritsu
+ちゅうしょく;chuushoku
+ともに;tomoni
+あんないしゃ;annaisha
+おおの;oono
+し;shi
+りゆう;riyuu
+じじつ;jijitsu
+とくしゅだ;tokushuda
+じじょう;jijou
+せいど;seido
+すでに;sudeni
+ねんげつ;nengetsu
+すう;suu
+およぶ;oyobu
+ほうけんてきだ;houkentekida
+ほうけん;houken
+でんとう;dentou
+ねざす;nezasu
+ねつ;netsu
+にたいする;nitaisuru
+せっきょくてきだ;sekkyokutekida
+ひょうか;hyouka
+ひょうかする;hyoukasuru
+かたち;katachi
+あらわれる;arawareru
+せいき;seiki
+しゅうがく;shuugaku
+パーセント;paasento
+はなし;hanashi
+のぞく;nozoku
+アメリカ;amerika
+つぐ;tsugu
+についで;nitsuide
+こうとうきょういく;koutoukyouiku
+こえる;koeru
+とうけい;toukei
+せんしんてきだ;senshintekida
+しつ;shitsu
+かんれん;kanren
+かんれんする;kanrensuru
+にかんれんして;nikanrenshite
+かかえる;kakaeru
+かたる;kataru
+しみん;shimin
+きほんてきだ;kihontekida
+げんそく;gensoku
+もとづく;motoduku
+のうりょく;nouryoku
+おうじる;oujiru
+におうじて;nioujite
+びょうどうだ;byoudouda
+における;niokeru
+よさん;yosan
+だいがくせい;daigakusei
+そう;sou
+しゅっしん;shusshin
+じょしがくせい;joshigakusei
+むりょう;muryou
+こうりつ;kouritsu
+しゃ;sha
+レストラン;resutoran
+ちょうしょく;choushoku
+ゆうしょく;yuushoku
+えんそく;ensoku
+なかじま;nakajima
+しょぞく;shozoku
+しょぞくする;shozokusuru
+きょうしょくいん;kyoushokuin
+をはじめ;wohajime
+じむ;jimu
+じむいん;jimuin
+ひしょ;hisho
+だいたすう;daitasuu
+きょうこく;kyoukoku
+くたびれる;kutabireru
+きがつく;kigatsuku
+は;ha
+かお;kao
+みのまわりひん;minomawarihin
+かるい;karui
+てさげぶくろ;tesagebukuro
+くもる;kumoru
+しゅうごう;shuugou
+しゅうごうする;shuugousuru
+ほぼ;hobo
+ざせき;zaseki
+すわる;suwaru
+はっしゃ;hassha
+はっしゃする;hasshasuru
+いえなみ;ienami
+たえる;taeru
+さゆう;sayuu
+りょうがわ;ryougawa
+むぎ;mugi
+はたけ;hatake
+いちめん;ichimen
+ひろがる;hirogaru
+いちご;ichigo
+いちごばたけ;ichigobatake
+しゅうかく;shuukaku
+しゅうかくする;shuukakusuru
+じき;jiki
+こい;koi
+は;ha
+きる;kiru
+しゃがむ;shagamu
+み;mi
+つむ;tsumu
+かご;kago
+しゃべる;shaberu
+ねむい;nemui
+ねむる;nemuru
+いねむりする;inemurisuru
+だいにじせかいたいせん;dainijisekaitaisen
+ちょくぜん;chokuzen
+かいほう;kaihou
+かいほうする;kaihousuru
+ぐん;gun
+ナチ;nachi
+ぐんたい;guntai
+せんとう;sentou
+せんとうする;sentousuru
+せんし;senshi
+せんしする;senshisuru
+へいし;heishi
+とむらう;tomurau
+ひ;hi
+し;shi
+こっきょう;kokkyou
+こくせき;kokuseki
+しゅつにゅうこく;shutsunyuukoku
+いる;iru
+はし;hashi
+わたる;wataru
+もり;mori
+ほそい;hosoi
+ロマンチックだ;romanchikkuda
+ブルーベリー;buruuberii
+つかり;tsukari
+かんじる;kanjiru
+みずうみ;mizuumi
+かいすいぎ;kaisuigi
+しゃしん;shashin
+しゃしんする;shashinsuru
+ボール;booru
+なげる;nageru
+みおくる;miokuru
+そんなに;sonnani
+こっかい;kokkai
+ぎかい;gikai
+ひらく;hiraku
+いってい;ittei
+がく;gaku
+ぜいきん;zeikin
+だけ;dake
+せんきょ;senkyo
+せんきょする;senkyosuru
+せんきょけん;senkyoken
+おとこ;otoko
+おんな;onna
+しゅうぎいん;shuugiin
+さんぎいん;sangiin
+こうせい;kousei
+こうせいする;kouseisuru
+じょうやく;jouyaku
+みとめる;mitomeru
+そうりだいじん;souridaijin
+しめい;shimei
+しめいする;shimeisuru
+さいけつ;saiketsu
+さいけつする;saiketsusuru
+ぎいん;giin
+はんすう;hansuu
+さんぶんのに;sanbunnoni
+ぶん;bun
+けっせき;kesseki
+けっせきする;kessekisuru
+かいぎ;kaigi
+ほんかいぎ;honkaigi
+むこう;mukou
+きんきゅうだ;kinkyuuda
+りんじ;rinji
+ぎけつ;giketsu
+たすうけつ;tasuuketsu
+ほうしき;houshiki
+どうすう;dousuu
+ぎちょう;gichou
+けってい;kettei
+けっていする;ketteisuru
+による;niyoru
+ちょくせつせんきょ;chokusetsusenkyo
+ぎせき;giseki
+にんき;ninki
+ごとに;gotoni
+かいせん;kaisen
+かいせんする;kaisensuru
+ぜんこく;zenkoku
+せんきょく;senkyoku
+ふ;fu
+とうきょうと;toukyouto
+く;ku
+おおさかふ;oosakafu
+じゆうみんしゅとうじみんとう;jiyuuminshutoujimintou
+しゃかいとう;shakaitou
+きょうさんとう;kyousantou
+こうめいとう;koumeitou
+みんしゃとう;minshatou
+せいとう;seitou
+だいひょう;daihyou
+だいひょうする;daihyousuru
+あわてる;awateru
+ニュアンス;nyuansu
+ぶん;bun
+しゅうちゅうりょく;shuuchuuryoku
+どうけん;douken
+まえかわ;maekawa
+ふじん;fujin
+たのしみ;tanoshimi
+ちちおや;chichioya
+しぬ;shinu
+わかれる;wakareru
+しにわかれる;shiniwakareru
+したがう;shitagau
+かこ;kako
+じっさい;jissai
+そういう;souiu
+いっしょう;isshou
+がまん;gaman
+がまんする;gamansuru
+すみ;sumi
+なく;naku
+けっしてない;kesshitenai
+じんせい;jinsei
+どくりつ;dokuritsu
+どくりつする;dokuritsusuru
+にんげん;ningen
+あつかう;atsukau
+ぎのう;ginou
+けつい;ketsui
+けついする;ketsuisuru
+こんなん;konnan
+ほんやく;hon_yaku
+ほんやくする;hon_yakusuru
+アルバイト;arubaito
+アルバイトする;arubaitosuru
+もとめる;motomeru
+いろんな;ironna
+べんがく;bengaku
+がか;gaka
+ば;ba
+しりあう;shiriau
+はげます;hagemasu
+たすけあう;tasukeau
+くらす;kurasu
+いらい;irai
+しゅっぱん;shuppan
+しゅっぱんする;shuppansuru
+きょうりょく;kyouryoku
+きょうりょくする;kyouryokusuru
+おかげで;okagede
+おかげです;okagedesu
+ほしょう;hoshou
+ほしょうする;hoshousuru
+せんご;sengo
+しんしゅつする;shinshutsusuru
+けいこう;keikou
+たしかだ;tashikada
+めだつ;medatsu
+だいじん;daijin
+ぜんめんてきだ;zenmentekida
+のこす;nokosu
+れいがいてきだ;reigaitekida
+いぜん;izen
+いみ;imi
+まいつき;maitsuki
+おんがくかい;ongakukai
+そうい;soui
+めいじ;meiji
+けんきゅうしゃ;kenkyuusha
+あるいは;aruiha
+ひょうろんか;hyouronka
+さっか;sakka
+ろんぶん;ronbun
+きんべんだ;kinbenda
+れいぎ;reigi
+ただしい;tadashii
+れいぎただしい;reigitadashii
+ちつじょ;chitsujo
+まもる;mamoru
+かがくてきだ;kagakutekida
+ごうりてきだ;gouritekida
+しそう;shisou
+せいしん;seishin
+そんちょう;sonchou
+そんちょうする;sonchousuru
+しゅうきょうてきだ;shuukyoutekida
+かんてん;kanten
+かんさつ;kansatsu
+かんさつする;kansatsusuru
+たいしょう;taishou
+ろんじる;ronjiru
+いったい;ittai
+まさに;masani
+げんじつ;genjitsu
+ちゅうもく;chuumoku
+ちゅうもくする;chuumokusuru
+たんじゅんだ;tanjunda
+おうべいじん;oubeijin
+ときとして;tokitoshite
+きょくたんだ;kyokutanda
+むじゅん;mujun
+むじゅんする;mujunsuru
+たいしょうてきだ;taishoutekida
+めん;men
+どうじ;douji
+ルース・ベネディクト;ruusu_benedikuto
+きく;kiku
+かたな;katana
+こうどうする;koudousuru
+ぶんせき;bunseki
+ぶんせきする;bunsekisuru
+はあくする;haakusuru
+せいかく;seikaku
+ぶぶん;bubun
+いんしょうてきだ;inshoutekida
+すなわち;sunawachi
+にすると;nisuruto
+けんかする;kenkasuru
+おとなしい;otonashii
+いばる;ibaru
+あいて;aite
+ばかにする;bakanisuru
+がんこだ;gankoda
+じゅんのうせい;junnousei
+じゅうじゅんだ;juujunda
+たにん;tanin
+かんしょう;kanshou
+かんしょうする;kanshousuru
+はら;hara
+はらをたてる;harawotateru
+ちゅうじつだ;chuujitsuda
+かんようだ;kan_youda
+ふちゅうじつだ;fuchuujitsuda
+いじわるだ;ijiwaruda
+ゆうき;yuuki
+おくびょう;okubyou
+ほしゅてきだ;hoshutekida
+よろこんで;yorokonde
+うけいれる;ukeireru
+そうご;sougo
+まったく;mattaku
+はんする;hansuru
+こじん;kojin
+おおかれすくなかれ;ookaresukunakare
+けいせい;keisei
+けいせいする;keiseisuru
+こんきょ;konkyo
+いずれにしても;izurenishitemo
+こうぞう;kouzou
+きんだいか;kindaika
+きんだいかする;kindaikasuru
+かてい;katei
+むすびつく;musubitsuku
+ぜんじつ;zenjitsu
+かさねる;kasaneru
+かさねて;kasanete
+じしん;jishin
+ていあん;teian
+ていあんする;teiansuru
+がいらいご;gairaigo
+みみ;mimi
+みみにする;miminisuru
+のりもの;norimono
+こうこく;koukoku
+くわえる;kuwaeru
+とは;toha
+せいしつ;seishitsu
+もと;moto
+ぼこくご;bokokugo
+かんぜんだ;kanzenda
+さす;sasu
+なかば;nakaba
+ぽるとがるじん;porutogarujin
+おらんだじん;orandajin
+せっしょく;sesshoku
+せっしょくする;sesshokusuru
+ぶんめい;bunmei
+じぶつ;jibutsu
+もたらす;motarasu
+いご;igo
+おうべい;oubei
+かりいれる;kariireru
+いふく;ifuku
+いがく;igaku
+イタリア;itaria
+いたりあご;itariago
+こうぎょう;kougyou
+しょうぎょう;shougyou
+しゅうきょう;shuukyou
+はんい;han_i
+ぶんぷ;bunpu
+ぶんぷする;bunpusuru
+きんだい;kindai
+りょういき;ryouiki
+むける;mukeru
+いっち;icchi
+いっちする;icchisuru
+あめりかえいご;amerikaeigo
+あっとうてきだ;attoutekida
+びよういん;biyouin
+かみ;kami
+よごれる;yogoreru
+シャンプー;shanpuu
+ききかえす;kikikaesu
+ヘアー;heaa
+ほんらい;honrai
+うしなう;ushinau
+つうようする;tsuuyousuru
+おうかがいする;oukagaisuru
+しゅうにゅう;shuunyuu
+ぞうか;zouka
+ぞうかする;zoukasuru
+かんげい;kangei
+かんげいする;kangeisuru
+ひかんする;hikansuru
+たちば;tachiba
+うたがう;utagau
+きもちをわるくする;kimochiwowarukusuru
+とか;toka
+ですから;desukara
+えんりょぶかい;enryobukai
+じしん;jishin
+そだつ;sodatsu
+カーテン;kaaten
+まっしろだ;masshiroda
+つもる;tsumoru
+ふりつづく;furitsuduku
+に、さんねん;ni_sannen
+セントラル・ヒーティング;sentoraru_hiitingu
+だんぼう;danbou
+しゅっきん;shukkin
+しゅっきんする;shukkinsuru
+ねぼう;nebou
+ねぼうする;nebousuru
+せんめんじょ;senmenjo
+ひげをそる;higewosoru
+おおいそぎ;ooisogi
+ネクタイをしめる;nekutaiwoshimeru
+めんどうだ;mendouda
+ワイシャツ;waishatsu
+セーター;seetaa
+せびろ;sebiro
+うわぎ;uwagi
+ながぐつ;nagagutsu
+はく;haku
+まにあう;maniau
+あわてて;awatete
+おちつく;ochitsuku
+いやだ;iyada
+かみをとかす;kamiwotokasu
+けしょう;keshou
+けしょうする;keshousuru
+みじたく;mijitaku
+ととのえる;totonoeru
+きこえる;kikoeru
+ろうか;rouka
+にがわらい;nigawarai
+にがわらいする;nigawaraisuru
+こし;koshi
+て;te
+あてる;ateru
+いたそうだ;itasouda
+であう;deau
+よこぎる;yokogiru
+ゆうびんきょく;yuubinkyoku
+こおる;kooru
+ころぶ;korobu
+ズボン;zubon
+ちこく;chikoku
+ちこくする;chikokusuru
+れんらく;renraku
+れんらくする;renrakusuru
+むり;muri
+むりする;murisuru
+ちゅうこく;chuukoku
+ちゅうこくする;chuukokusuru
+どんどん;dondon
+いけない;ikenai
+きをつける;kiwotsukeru
+かさをさす;kasawosasu
+ろうじん;roujin
+すがた;sugata
+いがいだ;igaida
+いたむ;itamu
+たばこ;tabako
+すう;suu
+たばこをすう;tabakowosuu
+たいくつだ;taikutsuda
+おもいで;omoide
+しぜんかがく;shizenkagaku
+はなしかける;hanashikakeru
+ほうそう;housou
+ほうそうする;housousuru
+テレビほうそう;terebihousou
+かいし;kaishi
+かいしする;kaishisuru
+しょうわ;shouwa
+ばくはつてきだ;bakuhatsutekida
+いきおい;ikioi
+いいすぎ;iisugi
+そくど;sokudo
+ふきゅう;fukyuu
+ふきゅうする;fukyuusuru
+ばんめ;banme
+カラーテレビ;karaaterebi
+マスコミ;masukomi
+しゅだん;shudan
+はたす;hatasu
+やくわり;yakuwari
+やくわりをはたす;yakuwariwohatasu
+かわる;kawaru
+きゅうそくだ;kyuusokuda
+たかまる;takamaru
+こうしき;koushiki
+はっぴょう;happyou
+はっぴょうする;happyousuru
+せたい;setai
+ぶんかてきだ;bunkatekida
+およぼす;oyobosu
+むしする;mushisuru
+にっぽんほうそうきょうかい;nipponhousoukyoukai
+せんでん;senden
+せんでんする;sendensuru
+しゅうにゅうげん;shuunyuugen
+みんかん;minkan
+てれびきょく;terebikyoku
+ばんぐみ;bangumi
+とならんで;tonarande
+しちょうりつ;shichouritsu
+れんぞく;renzoku
+れんぞくする;renzokusuru
+ちゅうし;chuushi
+ちゅうしする;chuushisuru
+くりかえす;kurikaesu
+まれだ;mareda
+いち;ichi
+しめる;shimeru
+たいど;taido
+ていど;teido
+はんだん;handan
+はんだんする;handansuru
+うちのこ;uchinoko
+ふまん;fuman
+ごらく;goraku
+むだだ;mudada
+ついやす;tsuiyasu
+なげく;nageku
+ひなん;hinan
+ひなんする;hinansuru
+ねんれい;nenrei
+せいべつ;seibetsu
+ふだん;fudan
+へいきん;heikin
+へいきんする;heikinsuru
+へいきんして;heikinshite
+ひかく;hikaku
+ひかくする;hikakusuru
+ニュース;nyuusu
+かいせつ;kaisetsu
+かいせつする;kaisetsusuru
+ほうどう;houdou
+ほうどうする;houdousuru
+ドラマ;dorama
+けいおんがく;keiongaku
+クイズ;kuizu
+はなす;hanasu
+つけはなす;tsukehanasu
+けす;kesu
+めをやる;mewoyaru
+おきゃくさん;okyakusan
+きにする;kinisuru
+こうけい;koukei
+こしょう;koshou
+こしょうする;koshousuru
+ものたりない;monotarinai
+あつい;atsui
+めいわく;meiwaku
+めいわくをかける;meiwakuwokakeru
+からだ;karada
+からだじゅう;karadajuu
+かぜをひく;kazewohiku
+しない;shinai
+だんち;danchi
+ひっこす;hikkosu
+きんじょ;kinjo
+ごうかん;goukan
+きのどくだ;kinodokuda
+うわさ;uwasa
+うわさする;uwasasuru
+かおみしり;kaomishiri
+ぎゃくだ;gyakuda
+したしむ;shitashimu
+したしみやすい;shitashimiyasui
+かいだん;kaidan
+おもい;omoi
+かいものぶくろ;kaimonobukuro
+おうだん;oudan
+おうだんする;oudansuru
+ほどう;hodou
+おうだんほどう;oudanhodou
+としより;toshiyori
+あぶない;abunai
+そのたびに;sonotabini
+ありがたい;arigatai
+かいかつだ;kaikatsuda
+ちょうし;choushi
+じたく;jitaku
+まねく;maneku
+こころ;kokoro
+こころをうつ;kokorowoutsu
+いきいきと;ikiikito
+きがする;kigasuru
+せんそうちゅう;sensouchuu
+ひろしま;hiroshima
+げんばく;genbaku
+おとす;otosu
+こうかふこうか;koukafukouka
+さとがえり;satogaeri
+ばくだん;bakudan
+くさ;kusa
+はかい;hakai
+はかいする;hakaisuru
+なんとか;nantoka
+おそろしい;osoroshii
+きおく;kioku
+きおくする;kiokusuru
+くろい;kuroi
+やける;yakeru
+こげる;kogeru
+はだか;hadaka
+したい;shitai
+あちらこちら;achirakochira
+ころがる;korogaru
+よぶ;yobu
+ははおや;hahaoya
+さけぶ;sakebu
+きみわるい;kimiwarui
+ひびく;hibiku
+のはら;nohara
+やけのはら;yakenohara
+しょうそく;shousoku
+つかむ;tsukamu
+いっしゅん;isshun
+ざいさん;zaisan
+なくす;nakusu
+ひげき;higeki
+にどとふたたびない;nidotofutatabinai
+かたい;katai
+いきのこる;ikinokoru
+へいわ;heiwa
+いきる;ikiru
+いぎ;igi
+かく;kaku
+エネルギー;enerugii
+かくえねるぎい;kakuenerugii
+ころす;korosu
+しよう;shiyou
+しようする;shiyousuru
+ゆたかだ;yutakada
+しあわせだ;shiawaseda
+へいき;heiki
+せいぞう;seizou
+せいぞうする;seizousuru
+じっけん;jikken
+じっけんする;jikkensuru
+きんし;kinshi
+きんしする;kinshisuru
+もくてき;mokuteki
+がい;gai
+がいする;gaisuru
+こうけん;kouken
+こうけんする;koukensuru
+えらい;erai
+あさねぼう;asanebou
+あさねぼうする;asanebousuru
+めがさめる;megasameru
+おこす;okosu
+かぎる;kagiru
+にかぎって;nikagitte
+とまる;tomaru
+ドア;doa
+のせる;noseru
+しつれいだ;shitsureida
+おろす;orosu
+せかいてきだ;sekaitekida
+とどく;todoku
+へんだ;henda
+きがへんだ;kigahenda
+ぶり;buri
+あつさ;atsusa
+うごく;ugoku
+にっちゅう;nicchuu
+たいよう;taiyou
+ひかり;hikari
+とぼしい;toboshii
+てる;teru
+にっこう;nikkou
+にっこうよく;nikkouyoku
+しょうご;shougo
+よう;you
+ようがある;yougaaru
+ひとどおり;hitodoori
+まるで;marude
+きゅうか;kyuuka
+みなみ;minami
+ようい;youi
+よういする;youisuru
+ふるさと;furusato
+しま;shima
+とう;tou
+みなと;minato
+みなとまち;minatomachi
+あさい;asai
+およぎ;oyogi
+すいちゅう;suichuu
+ひっぱる;hipparu
+はな;hana
+しおからい;shiokarai
+おこる;okoru
+おおわらい;oowarai
+おおわらいする;oowaraisuru
+ゆめ;yume
+すなはま;sunahama
+すな;suna
+ほる;horu
+いし;ishi
+バレーボール;bareebooru
+かわらない;kawaranai
+ひがし;higashi
+もよう;moyou
+そらもよう;soramoyou
+あやしい;ayashii
+まっくろだ;makkuroda
+くも;kumo
+かみなり;kaminari
+おおつぶ;ootsubu
+かんし;kanshi
+かんしする;kanshisuru
+きがえる;kigaeru
+まとめる;matomeru
+らいう;raiu
+ふとい;futoi
+にげこむ;nigekomu
+かいがん;kaigan
+とおる;tooru
+とおりかかる;toorikakaru
+きけんだ;kikenda
+ますます;masumasu
+にし;nishi
+すこしずつ;sukoshizutsu
+はれあげる;hareageru
+すむ;sumu
+むしあつさ;mushiatsusa
+そうぞう;souzou
+そうぞうする;souzousuru
+てんこう;tenkou
+わすれものをする;wasuremonowosuru
+かばん;kaban
+もくひょう;mokuhyou
+とうぜんだ;touzenda
+うっかりする;ukkarisuru
+かねもち;kanemochi
+あきれる;akireru
+とにかく;tonikaku
+ごじぶん;gojibun
+じしん;jishin
+ことわざ;kotowaza
+よのなか;yononaka
+かじ;kaji
+おやじ;oyaji
+むしろ;mushiro
+どろぼう;dorobou
+じょうだん;joudan
+ともかく;tomokaku
+それはともかく;sorehatomokaku
+ぎじゅつ;gijutsu
+よこく;yokoku
+よこくする;yokokusuru
+よぼう;yobou
+よぼうする;yobousuru
+かんとうだいしんさい;kantoudaishinsai
+だいきぼだ;daikiboda
+さいがい;saigai
+たいけん;taiken
+たいけんする;taikensuru
+こわさ;kowasa
+ちんぼつ;chinbotsu
+ちんぼつする;chinbotsusuru
+ほろぶ;horobu
+テーマ;teema
+ベストセラー;besutoseraa
+ぽおらんどじん;poorandojin
+いよくてきだ;iyokutekida
+ゆれる;yureru
+ねまき;nemaki
+とびだす;tobidasu
+りょかん;ryokan
+あんぜんだ;anzenda
+ぐらぐらと;guragurato
+さすが;sasuga
+とっさに;tossani
+きんちょう;kinchou
+きんちょうする;kinchousuru
+ひなん;hinan
+ひなんする;hinansuru
+たちあがる;tachiagaru
+へいきだ;heikida
+だいじょうぶだ;daijoubuda
+くらい;kurai
+アパート;apaato
+たおれる;taoreru
+とうきょうじゅう;toukyoujuu
+ひ;hi
+たすかる;tasukaru
+そこ;soko
+はし;hashi
+さんみゃく;sanmyaku
+つらなる;tsuranaru
+かざん;kazan
+たえず;taezu
+けむり;kemuri
+げんいん;gen_in
+ふじさん;fujisan
+はこね;hakone
+おんせん;onsen
+うむ;umu
+うみだす;umidasu
+わけ;wake
+わけです;wakedesu
+あばれる;abareru
+くるう;kuruu
+あばれくるう;abarekuruu
+たほう;tahou
+おそれ;osore
+かんかく;kankaku
+あいじょう;aijou
+いだく;idaku
+しみじみと;shimijimito
+ゆめをみる;yumewomiru
+くろ;kuro
+なんかこく;nankakoku
+だいじしん;daijishin
+まどう;madou
+こわれる;kowareru
+たすけ;tasuke
+のむ;nomu
+まっくらだ;makkurada
+おく;oku
+わらいごえ;waraigoe
+さんぎょう;sangyou
+めざましい;mezamashii
+ほうめん;houmen
+ぼうえき;boueki
+ぼうえきかいしゃ;bouekikaisha
+あおき;aoki
+かわさき;kawasaki
+れっしゃ;ressha
+はやい;hayai
+ここち;kokochi
+のりごこちがいい;norigokochigaii
+のりごこちがわるい;norigokochigawarui
+ガラス;garasu
+とくべつ;tokubetsu
+しゃない;shanai
+にほんじゅう;nihonjuu
+かっき;kakki
+みちる;michiru
+しょうじきだ;shoujikida
+てっこうぎょう;tekkougyou
+ぞうせんぎょう;zousengyou
+せいさん;seisan
+せいさんする;seisansuru
+のびる;nobiru
+さん;san
+しげん;shigen
+せきゆ;sekiyu
+げんりょう;genryou
+ゆにゅう;yunyuu
+ゆにゅうする;yunyuusuru
+たよる;tayoru
+かこう;kakou
+かこうする;kakousuru
+ゆしゅつ;yushutsu
+ゆしゅつする;yushutsusuru
+れいがい;reigai
+ほら;hora
+けんせつ;kensetsu
+けんせつする;kensetsusuru
+けんせつちゅう;kensetsuchuu
+こうじょう;koujou
+ひろげる;hirogeru
+さっそく;sassoku
+だいこうじょう;daikoujou
+あんぜん;anzen
+せいけつ;seiketsu
+だいいちだ;daiichida
+このむ;konomu
+おくに;okuni
+きかいこうぎょう;kikaikougyou
+せんい;sen_i
+せんいこうぎょう;sen_ikougyou
+かがくこうぎょう;kagakukougyou
+すいじゅん;suijun
+りょう;ryou
+こうじょう;koujou
+こうじょうする;koujousuru
+こくえい;kokuei
+りえき;rieki
+そんみん;sonmin
+けんしんてきだ;kenshintekida
+ほね;hone
+ほねおる;honeoru
+ひょうばん;hyouban
+ひょうばんだ;hyoubanda
+もはん;mohan
+そんけい;sonkei
+そんけいする;sonkeisuru
+なかがよい;nakagayoi
+なかがわるい;nakagawarui
+かわ;kawa
+つる;tsuru
+らんぼうだ;ranbouda
+びんぼう;binbou
+びんぼうだ;binbouda
+しゃかいがく;shakaigaku
+とうほくだいがく;touhokudaigaku
+いがくぶ;igakubu
+ゆうじょう;yuujou
+まなぶ;manabu
+ちしき;chishiki
+まじめだ;majimeda
+しあわせ;shiawase
+しんけんだ;shinkenda
+ぎろん;giron
+ぎろんする;gironsuru
+げか;geka
+せんだい;sendai
+しゃかいか;shakaika
+じょうぶだ;joubuda
+ほえる;hoeru
+ほえっておく;hoetteoku
+けっかく;kekkaku
+びょうじょう;byoujou
+えいよう;eiyou
+えいようがある;eiyougaaru
+しょくもつ;shokumotsu
+じゅうぶんだ;juubunda
+せいよう;seiyou
+せいようする;seiyousuru
+しっそだ;shissoda
+かけい;kakei
+ふかのうだ;fukanouda
+つきあい;tsukiai
+びょういん;byouin
+にゅういん;nyuuin
+にゅういんする;nyuuinsuru
+もともと;motomoto
+げっきゅう;gekkyuu
+しゃかいほしょう;shakaihoshou
+ふじゅうぶんだ;fujuubunda
+ちょくせつだ;chokusetsuda
+だげき;dageki
+ちょきん;chokin
+ちょきんする;chokinsuru
+なめる;nameru
+ひよう;hiyou
+たいいん;taiin
+たいいんする;taiinsuru
+まかせる;makaseru
+のぞむ;nozomu
+へんじ;henji
+へんじする;henjisuru
+とどける;todokeru
+かんしゃ;kansha
+かんしゃする;kanshasuru
+おれい;orei
+おれいをいう;oreiwoiu
+さえ;sae
+すなおだ;sunaoda
+これこそ;korekoso
+きたない;kitanai
+そういうわけにはいかない;souiuwakenihaikanai
+ぼんやりと;bon_yarito
+おう;ou
+ひさしぶり;hisashiburi
+パートナー;paatonaa
+じっこう;jikkou
+じっこうする;jikkousuru
+ちかいうちに;chikaiuchini
+ゆいしょ;yuisho
+ゆいしょある;yuishoaru
+よやく;yoyaku
+よやくする;yoyakusuru
+おんなしゅじん;onnashujin
+おじぎ;ojigi
+おじぎする;ojigisuru
+もうける(1-dan);moukeru(1-dan)
+みょうごにち;myougonichi
+まことに;makotoni
+やけい;yakei
+テーブル;teeburu
+そつろん;sotsuron
+どだい;dodai
+さんこうしりょう;sankoushiryou
+ぺえじ;peeji
+みょうばん;myouban
+すべて;subete
+おしおきする;oshiokisuru
+おしおき;oshioki
+ゆるす;yurusu
+どうしよう;doushiyou
+なるほど;naruhodo
+てんいん;ten_in
+てんしゅ;tenshu
+てんちょう;tenchou
+かっこいい;kakkoii
+すてき;suteki
+だいじょうぶ;daijoubu
+ちくしょう;chikushou
+きさま;kisama
+おのれ;onore
+スケベ;sukebe
+ごちそうさまでした;gochisousamadeshita
+おじゃまします;ojamashimasu
+いらっしゃい;irasshai
+いらっしゃいませ;irasshaimase
+どうぞ、こちらへ;douzo_kochirahe
+どうぞおかけください;douzookakekudasai
+なんで;nande
+よく;yoku
+おきて;okite
+わかい;wakai
+おおかみ;ookami
+ずっと;zutto
+れい;rei
+かいとうようし;kaitouyoushi
+そうこう;soukou
+はしりがき;hashirigaki
+ざっそう;zassou
+そうしょ;sousho
+くさち;kusachi
+たすう;tasuu
+ためん;tamen
+おおすぎる;oosugiru
+たいし;taishi
+たいよう;taiyou
+ふとじ;futoji
+たいかく;taikaku
+ふうてい;fuutei
+からだつき;karadatsuki
+どだい;dodai
+たいふう;taifuu
+ちほう;chihou
+ちか;chika
+きじ;kiji
+ようすいち;yousuichi
+でんち;denchi
+ふるいけ;furuike
+ちしき;chishiki
+ちせい;chisei
+しりあい;shiriai
+ちくざい;chikuzai
+たけだ;takeda
+たけやぶ;takeyabu
+ちゃちゃ;chacha
+さか;saka
+ちゅうしょく;chuushoku
+ちゅうこうせい;chuukousei
+ひるま;hiruma
+せいちょう;seichou
+かいちょう;kaichou
+ながいき;nagaiki
+はくちょう;hakuchou
+やちょう;yachou
+とりい;torii
+ちょうしょく;choushoku
+あさひ;asahi
+ちょうてい;choutei
+つうこう;tsuukou
+つうきん;tsuukin
+おおどおり;oodoori
+してい;shitei
+でし;deshi
+きょうだい;kyoudai
+てんいん;ten_in
+よみせ;yomise
+たなだて;tanadate
+てんせん;tensen
+とくてん;tokuten
+じゅうてん;juuten
+でんきゅう;denkyuu
+でんりゅう;denryuu
+だいとう;daitou
+ぐんとう;guntou
+こがたな;kogatana
+とうみん;toumin
+とうき;touki
+ふゆしょうぐん;fuyushougun
+そうとう;soutou
+とうにん;tounin
+てあて;teate
+とうよう;touyou
+ちゅうとう;chuutou
+ひがしがわ;higashigawa
+かいとう;kaitou
+とうあん;touan
+くちごたえ;kuchigotae
+とうこつ;toukotsu
+きち;kichi
+きよ;kiyo
+よせなみ;yosenami
+たちよる;tachiyoru
+きそく;kisoku
+じょうぎ;jougi
+だいきぼ;daikibo
+ぎじゅつ;gijutsu
+ぎし;gishi
+えんぎ;engi
+しゅぎ;shugi
+ぎり;giri
+いぎ;igi
+ぎゃっこう;gyakkou
+ぎゃくせつ;gyakusetsu
+はんぎゃく;hangyaku
+えいきゅう;eikyuu
+くおん;kuon
+ひさしぶり;hisashiburi
+きゅうゆう;kyuuyuu
+きゅうは;kyuuha
+きゅうしき;kyuushiki
+きょじゅう;kyojuu
+じゅうきょ;juukyo
+いどころ;idokoro
+きょか;kyoka
+とっきょ;tokkyo
+てもと;temoto
+こっきょう;kokkyou
+けいだい;keidai
+きょうかいせん;kyoukaisen
+こうふん;koufun
+ふっこう;fukkou
+きょうみぶかい;kyoumibukai
+へいきん;heikin
+きんとう;kintou
+ふきんこう;fukinkou
+だんぼう;danbou
+だんりゅう;danryuu
+だんとう;dantou
+かちかん;kachikan
+ねびき;nebiki
+ちゅうさい;chuusai
+なこうど;nakoudo
+なかよく;nakayoku
+うちゅうせん;uchuusen
+ちゅうがえり;chuugaeri
+ちゅうのり;chuunori
+ちゅうじつ;chuujitsu
+ちゅうせい;chuusei
+ちゅうこく;chuukoku
+ちょしゃ;chosha
+ちょめい;chomei
+めいちょ;meicho
+かんちょう;kanchou
+ちょうれい;chourei
+かんきょうちょう;kankyouchou
+ちょうこう;choukou
+ぜんちょう;zenchou
+おくちょう;okuchou
+ちょうてん;chouten
+ちょうじょう;choujou
+ちょうだい;choudai
+ちょうりゅう;chouryuu
+しおみず;shiomizu
+しおどき;shiodoki
+ちんぎん;chingin
+うんちん;unchin
+やちん;yachin
+ずつう;zutsuu
+いたで;itade
+つうせつ;tsuusetsu
+はってん;hatten
+すいじょう;suijou
+まるおもり;maruomori
+ずいひつ;zuihitsu
+ずいこういん;zuikouin
+こつずい;kotsuzui
+のうずい;nouzui
+しんずい;shinzui
+すうじく;suujiku
+すうよう;suuyou
+ちゅうすう;chuusuu
+すうはい;suuhai
+すうこう;suukou
+すうけい;suukei
+すえおく;sueoku
+すえもの;suemono
+すえつけ;suetsuke
+すぎあや;sugiaya
+すぎがき;sugigaki
+すぎなみき;suginamiki
+うねだて;unedate
+にせ;nise
+うねおり;uneori
+あさせ;asase
+せと;seto
+せともの;setomono
+せつれつ;setsuretsu
+せっそく;sessoku
+せっとう;settou
+ひょうせつ;hyousetsu
+せっしゅ;sesshu
+せっしゅ;sesshu
+せっしょう;sesshou
+せっせい;sessei
+せんにん;sennin
+しゅせん;shusen
+すいせん;suisen
+さけ;sake
+みほん;mihon
+みほんいち;mihon_ichi
+てんじ;tenji
+てんじする;tenjisuru
+かいじょう;kaijou
+さいしん;saishin
+でんきこうぎょう;denkikougyou
+でんし;denshi
+でんしこうぎょう;denshikougyou
+せいひん;seihin
+かがくぎじゅつ;kagakugijutsu
+こうりゅう;kouryuu
+ふかまる;fukamaru
+ひとことでいえば;hitokotodeieba
+いとなむ;itonamu
+しょとく;shotoku
+こくみんしょとく;kokuminshotoku
+りんぎょう;ringyou
+ちくさんぎょう;chikusangyou
+すいさんぎょう;suisangyou
+だいじ;daiji
+こうぎょう;kougyou
+せいぞうぎょう;seizougyou
+けんせつぎょう;kensetsugyou
+うんゆ;un_yu
+つうしん;tsuushin
+うんゆつうしんぎょう;un_yutsuushingyou
+きんゆう;kin_yuu
+ほけん;hoken
+きんゆうほけんぎょう;kin_yuuhokengyou
+こうむ;koumu
+じゆうぎょう;jiyuugyou
+さあびすぎょう;saabisugyou
+ひじゅう;hijuu
+とうぶん;toubun
+よち;yochi
+のうさんぶつ;nousanbutsu
+いぞん;izon
+いぞんする;izonsuru
+けいこうぎょう;keikougyou
+じゅうかがくこうぎょう;juukagakukougyou
+じゅうしする;juushisuru
+にともなう;nitomonau
+ぶもん;bumon
+こよう;koyou
+せんぜん;senzen
+かくしん;kakushin
+ぎじゅつかくしん;gijutsukakushin
+せいみつだ;seimitsuda
+せいのう;seinou
+きょうか;kyouka
+きょうかする;kyoukasuru
+たんちょうだ;tanchouda
+にくたいてきだ;nikutaitekida
+じゅうろうどう;juuroudou
+つねに;tsuneni
+じゅくれん;jukuren
+じゅくれんする;jukurensuru
+のうりつ;nouritsu
+おもんじる;omonjiru
+ちゅうねん;chuunen
+くんれん;kunren
+くんれんする;kunrensuru
+せいふ;seifu
+けいえい;keiei
+けいえいする;keieisuru
+けいえいしゃ;keieisha
+ようきゅう;youkyuu
+ようきゅうする;youkyuusuru
+しつぎょう;shitsugyou
+しつぎょうする;shitsugyousuru
+ふきょう;fukyou
+しりょう;shiryou
+くせ;kuse
+むちゅうだ;muchuuda
+かぞえる;kazoeru
+めいわくだ;meiwakuda
+よう;you
+センチメンタルだ;senchimentaruda
+さわる;sawaru
+くちにあう;kuchiniau
+じゅんじょ;junjo
+ぎょうぎ;gyougi
+おと;oto
+おとをたてる;otowotateru
+とうなん;tounan
+じけん;jiken
+すじ;suji
+すいせん;suisen
+すいせんする;suisensuru
+いちりゅう;ichiryuu
+しゅうい;shuui
+せつび;setsubi
+サービス;saabisu
+このつぎ;konotsugi
+まんぞく;manzoku
+まんぞくする;manzokusuru
+うけつけ;uketsuke
+がいじん;gaijin
+くび;kubi
+かしげる;kashigeru
+じこく;jikoku
+みぶん;mibun
+あきらかだ;akirakada
+ほんにん;honnin
+しはい;shihai
+しはいする;shihaisuru
+しはいにん;shihainin
+きそく;kisoku
+おこる;okoru
+しんよう;shin_you
+しんようする;shin_yousuru
+にかかわる;nikakawaru
+まざまざと;mazamazato
+あせる;aseru
+ひきだし;hikidashi
+ようふくだんす;youfukudansu
+みあたる;miataru
+いんさつ;insatsu
+いんさつする;insatsusuru
+いんさつぶつ;insatsubutsu
+しなもの;shinamono
+さいわい;saiwai
+げんきん;genkin
+みにつける;minitsukeru
+さいなん;sainan
+まぬがれる;manugareru
+もうしわけない;moushiwakenai
+げんどう;gendou
+あやしい;ayashii
+みかける;mikakeru
+けいさつ;keisatsu
+フロント;furonto
+てはいする;tehaisuru
+ぬすむ;nusumu
+かち;kachi
+けいかん;keikan
+やってくる;yattekuru
+ひがい;higai
+じょうきょう;joukyou
+はんにん;hannin
+つかまえる;tsukamaeru
+はっけん;hakken
+はっけんする;hakkensuru
+よくあさ;yokuasa
+しんらい;shinrai
+しんらいする;shinraisuru
+きょうちょう;kyouchou
+きょうちょうする;kyouchousuru
+しょち;shochi
+しゃ;sha
+きんがく;kingaku
+せいきゅう;seikyuu
+せいきゅうする;seikyuusuru
+かくにん;kakunin
+かくにんする;kakuninsuru
+かんじょう;kanjou
+かんじょうする;kanjousuru
+さしひく;sashihiku
+さ;sa
+さがく;sagaku
+はらいもどす;haraimodosu
+さわぐ;sawagu
+あやまる;ayamaru
+せっかく;sekkaku
+ようやく;youyaku
+じこにあう;jikoniau
+ぶつかる;butsukaru
+はこぶ;hakobu
+はこびこむ;hakobikomu
+ぶつける;butsukeru
+みまう;mimau
+うつる;utsuru
+つい;tsui
+べッド;beddo
+ねかす;nekasu
+つうしんしゃ;tsuushinsha
+げんこう;genkou
+しきゅう;shikyuu
+そくたつ;sokutatsu
+こうくうびん;koukuubin
+めいれい;meirei
+めいれいする;meireisuru
+ほうしん;houshin
+まとまる;matomaru
+おもわす;omowasu
+ひにち;hinichi
+せわ;sewa
+せわする;sewasuru
+つきじ;tsukiji
+いちば;ichiba
+うおいちば;uoichiba
+そうちょう;souchou
+そうとう;soutou
+ふるえる;furueru
+しょうかい;shoukai
+しょうかいする;shoukaisuru
+いけだ;ikeda
+ちかづく;chikaduku
+いせい;isei
+いせいのいい;iseinoii
+かけごえ;kakegoe
+ライトバン;raitoban
+やかましい;yakamashii
+そうおん;souon
+まわり;mawari
+ばめん;bamen
+あっとうする;attousuru
+ぎょこう;gyokou
+りく;riku
+りくにあげる;rikuniageru
+たいりょう;tairyou
+おろしぎょうしゃ;oroshigyousha
+なま;nama
+しんせんだ;shinsenda
+あじ;aji
+しょうひん;shouhin
+しいれる;shiireru
+はかり;hakari
+めかた;mekata
+はかる;hakaru
+おおごえ;oogoe
+どなる;donaru
+おおぜい;oozei
+ふむ;fumu
+よこ;yoko
+インタビュー;intabyuu
+ちゅうおうせん;chuuousen
+こうえんじ;kouenji
+まがる;magaru
+おおどおり;oodoori
+まっすぐだ;massuguda
+かど;kado
+おれる;oreru
+うおまる;uomaru
+かんばん;kanban
+おじさん;ojisan
+ざしき;zashiki
+あがる;agaru
+さしみ;sashimi
+ほがらかだ;hogarakada
+ふうふ;fuufu
+うちとける;uchitokeru
+ゆずる;yuzuru
+しょうばい;shoubai
+くしん;kushin
+くしんする;kushinsuru
+くさる;kusaru
+いじょうだ;ijouda
+ぶっかだか;bukkadaka
+せつやく;setsuyaku
+せつやくする;setsuyakusuru
+みつもる;mitsumoru
+こめ;kome
+しょくりょう;shokuryou
+せいさんしゃ;seisansha
+りょうし;ryoushi
+さんち;sanchi
+ねだんをつける;nedanwotsukeru
+しょうひ;shouhi
+しょうひする;shouhisuru
+しょうひしゃ;shouhisha
+ばい;bai
+もうける;moukeru
+わずかだ;wazukada
+きびしい;kibishii
+ちゅうもんする;chuumonsuru
+ひとで;hitode
+たりる;tariru
+はいたつ;haitatsu
+はいたつする;haitatsusuru
+つぶれる;tsubureru
+ふあん;fuan
+ふあんだ;fuanda
+なかま;nakama
+いっか;ikka
+もうしこむ;moushikomu
+つうち;tsuuchi
+つうちする;tsuuchisuru
+ふさい;fusai
+ちゃん;chan
+こうふん;koufun
+こうふんする;koufunsuru
+きれ;kire
+くん;kun
+だまる;damaru
+えどじだい;edojidai
+ほうこく;houkoku
+ほうこくする;houkokusuru
+かべ;kabe
+なやむ;nayamu
+ゆるす;yurusu
+こうかい;koukai
+こうかいする;koukaisuru
+ゆうじん;yuujin
+げきれい;gekirei
+げきれいする;gekireisuru
+しどう;shidou
+しどうする;shidousuru
+こうふくだ;koufukuda
+けんい;ken_i
+はやし;hayashi
+やくば;yakuba
+てら;tera
+きろく;kiroku
+きろくする;kirokusuru
+じかに;jikani
+せっする;sessuru
+すすめる;susumeru
+ひょうじゅん;hyoujun
+ひょうじゅんご;hyoujungo
+ようじん;youjin
+ようじんする;youjinsuru
+ひょうめんてきだ;hyoumentekida
+さっする;sassuru
+こうさい;kousai
+こうさいする;kousaisuru
+ながのけん;naganoken
+むら;mura
+そんちょう;sonchou
+いらい;irai
+いらいする;iraisuru
+くばる;kubaru
+きをくばる;kiwokubaru
+きょり;kyori
+ほうげん;hougen
+あっさり;assari
+あいにく;ainiku
+るす;rusu
+さらいげつ;saraigetsu
+したく;shitaku
+したくする;shitakusuru
+いし;ishi
+しゅうしゅう;shuushuu
+しゅうしゅうする;shuushuusuru
+せいり;seiri
+せいりする;seirisuru
+しゅうちゅう;shuuchuu
+しゅうちゅうする;shuuchuusuru
+うえだ;ueda
+だいり;dairi
+あべ;abe
+ちゃんと;chanto
+おせじ;oseji
+とめる;tomeru
+じゅうしょく;juushoku
+ぎもん;gimon
+しじゅう;shijuu
+きげん;kigen
+きげんする;kigensuru
+のうか;nouka
+みこん;mikon
+じしゅてきだ;jishutekida
+だんたい;dantai
+まつり;matsuri
+しょうぼう;shoubou
+ようすい;yousui
+こうじ;kouji
+こうきょう;koukyou
+じぎょう;jigyou
+きょうどう;kyoudou
+そしき;soshiki
+そしきする;soshikisuru
+にんむ;ninmu
+だんじょ;danjo
+あい;ai
+ちかう;chikau
+しょうめい;shoumei
+しょうめいする;shoumeisuru
+しょうこ;shouko
+あきまつり;akimatsuri
+ほし;hoshi
+ほしぞら;hoshizora
+まぶしい;mabushii
+かがやく;kagayaku
+むし;mushi
+なく;naku
+あざやかだ;azayakada
+え;e
+じめん;jimen
+かげ;kage
+かんどう;kandou
+かんどうする;kandousuru
+おそう;osou
+しげき;shigeki
+しげきする;shigekisuru
+ごかい;gokai
+ごかいする;gokaisuru
+だいひょうだん;daihyoudan
+だんちょう;danchou
+にちじょう;nichijou
+ごうにいってはごうにしたがえ;gouniittehagounishitagae
+じょうようしゃ;jouyousha
+だんけつ;danketsu
+だんけつする;danketsusuru
+しんいち;shin_ichi
+ごぶさたする;gobusatasuru
+あいかわらず;aikawarazu
+ぐあい;guai
+ぐあいがわるい;guaigawarui
+い;i
+しんけい;shinkei
+しょうか;shouka
+しょうかする;shoukasuru
+きかん;kikan
+くれぐれも;kureguremo
+くれぐれもきをつける;kureguremokiwotsukeru
+そうごう;sougou
+そうごうする;sougousuru
+しんだん;shindan
+しんだんする;shindansuru
+たいかく;taikaku
+しんぞう;shinzou
+けつえき;ketsueki
+ふとる;futoru
+おそらく;osoraku
+さいしゅうてきだ;saishuutekida
+さて;sate
+けっさく;kessaku
+てあたり;teatari
+しだい;shidai
+てあたりしだい;teatarishidai
+てつや;tetsuya
+てつやする;tetsuyasuru
+ちから;chikara
+みにつく;minitsuku
+せんこう;senkou
+せんこうする;senkousuru
+いとこ;itoko
+ゲーテ;geete
+ちゅうりゅう;chuuryuu
+やしなう;yashinau
+きじゅん;kijun
+かだいだ;kadaida
+きそ;kiso
+しんじつ;shinjitsu
+かい;kai
+はがき;hagaki
+がくしゅう;gakushuu
+がくしゅうする;gakushuusuru
+つまる;tsumaru
+だす;dasu
+しまだ;shimada
+さいそく;saisoku
+さいそくする;saisokusuru
+スピード;supiido
+せいげん;seigen
+せいげんする;seigensuru
+いはん;ihan
+いはんする;ihansuru
+ばっきん;bakkin
+じまん;jiman
+じまんする;jimansuru
+かげん;kagen
+かげんする;kagensuru
+いいかげんにする;iikagennisuru
+しまつ;shimatsu
+しまつする;shimatsusuru
+おう;ou
+しまつにおえない;shimatsunioenai
+きつい;kitsui
+しきん;shikin
+さそう;sasou
+はりきる(5-dan);harikiru(5-dan)
+たいしょう;taishou
+よろしくつたえる(1-dan);yoroshikutsutaeru(1-dan)
+はるお;haruo
+たいようがぽかぽか(と)てる;taiyougapokapoka(to)teru
+けはい;kehai
+はだ;hada
+ほっとする;hottosuru
+つきひ;tsukihi
+ぐったり;guttari
+わた;wata
+さらさら;sarasara
+ぶるぶるふるえる;buruburufurueru
+むかう;mukau
+けろりとなおる;keroritonaoru
+さむがり;samugari
+のびのび(と)くらす;nobinobi(to)kurasu
+きんきょう(M);kinkyou(M)
+きぶんがさっぱりする;kibungasapparisuru
+ちる;chiru
+しゃっきり(と)する;shakkiri(to)suru
+はくし;hakushi
+いらいらする;irairasuru
+あと;ato
+やまなか;yamanaka
+くふう;kufuu
+くふうする;kufuusuru
+ゆういぎだ;yuuigida
+かさなる;kasanaru
+ふらふら(と);furafura(to)
+めまい;memai
+めまいがする;memaigasuru
+かんり;kanri
+かんりする;kanrisuru
+きそくてきだ;kisokutekida
+きく;kiku
+たいそう;taisou
+ひごろ(M);higoro(M)
+なまける(1-dan);namakeru(1-dan)
+せい;sei
+いき;iki
+きれる(1-dan);kireru(1-dan)
+いきがきれる;ikigakireru
+ハーハー(と);haahaa(to)
+こきゅう;kokyuu
+こきゅうする;kokyuusuru
+りくじょうきょうぎ;rikujoukyougi
+きょうぎ;kyougi
+せんしゅ;senshu
+たけし;takeshi
+クラブ;kurabu
+いいん;iin
+じなん;jinan
+みつお;mitsuo
+ちょうじょ;choujo
+れいこ;reiko
+おうえん;ouen
+おうえんする;ouensuru
+ゲーム;geemu
+ほねやすめ;honeyasume
+しあい;shiai
+ぐるりと;gururito
+まわす;mawasu
+たかこ;takako
+チーム;chiimu
+くむ;kumu
+まける;makeru
+かつ;katsu
+ケーキ;keeki
+きゃあきゃあ(と);kyaakyaa(to)
+はしゃぐ;hashagu
+どっと;dotto
+まあまあ;maamaa
+せんしゅけん;senshuken
+たいかい;taikai
+せんしゅけんたいかい;senshukentaikai
+けっしょう;kesshou
+じゅん;jun
+せん;sen
+しょうぶ;shoubu
+しょうぶする;shoubusuru
+にこにこ;nikoniko
+にこにこする;nikonikosuru
+のぞく;nozoku
+なあ;naa
+かってだ;katteda
+くじ;kuji
+ひく;hiku
+くじをひく;kujiwohiku
+おろおろ(と);orooro(to)
+おろおろ(と)する;orooro(to)suru
+こうぎ;kougi
+こうぎする;kougisuru
+オリンピック;orinpikku
+しゅつじょう;shutsujou
+しゅつじょうする;shutsujousuru
+きょうそう;kyousou
+さっぱり;sappari
+はめ;hame
+おちいる(5-dan);ochiiru(5-dan)
+はめにおちいる;hameniochiiru
+どっしり;dosshiri
+どうり(M);douri(M)
+がやがや;gayagaya
+けっきょく(M);kekkyoku(M)
+けいひん;keihin
+けいひんがつく;keihingatsuku
+どうてん;douten
+えんちょう;enchou
+えんちょうする;enchousuru
+ひきわける;hikiwakeru
+ひきわけ;hikiwake
+ぷんぷん;punpun
+ずるい;zurui
+くう;kuu
+くってかかる;kuttekakaru
+そうべつかい;soubetsukai
+じょうきゅう;joukyuu
+はずむ;hazumu
+はなしがはずむ;hanashigahazumu
+ふける(1-dan);fukeru(1-dan)
+てをかす;tewokasu
+ちかごろ(M);chikagoro(M)
+けんとう;kentou
+けんとうする;kentousuru
+べん;ben
+わかれ;wakare
+わかれをおしむ;wakarewooshimu
+せんげつ;sengetsu
+すえ;sue
+のうぎょうせいさんきょうどうくみあい;nougyouseisankyoudoukumiai
+のうはんき;nouhanki
+おす;osu
+おしかける(1-dan);oshikakeru(1-dan)
+きほん;kihon
+こうえん;kouen
+こうえんする;kouensuru
+そう;sou
+しゅうぎょう;shuugyou
+しゅうぎょうする;shuugyousuru
+わずか;wazuka
+とどまる;todomaru
+げきげんする;gekigensuru
+そうねん;sounen
+ちたい;chitai
+しんしゅつ;shinshutsu
+きぎょう;kigyou
+だいきぎょう;daikigyou
+さぎょう;sagyou
+のうさぎょう;nousagyou
+かたにかかる;katanikakaru
+まめ;mame
+こくもつ;kokumotsu
+じきゅう;jikyuu
+じきゅうする;jikyuusuru
+こくない;kokunai
+じゅよう;juyou
+うわまわる;uwamawaru
+あまる;amaru
+だいず;daizu
+けつぼう;ketsubou
+けつぼうする;ketsubousuru
+まかなう;makanau
+じょうたい;joutai
+しょくりょう;shokuryou
+きょうきゅう;kyoukyuu
+きょうきゅうする;kyoukyuusuru
+ふくろ;fukuro
+いぶくろ;ibukuro
+あずける;azukeru
+こうど;koudo
+せいちょう;seichou
+せいちょうする;seichousuru
+トラクター;torakutaa
+はいっている;haitteiru
+しゅうやく;shuuyaku
+しゅうやくする;shuuyakusuru
+か;ka
+こうにゅう;kounyuu
+こうにゅうする;kounyuusuru
+きかん;kikan
+うったえる(1-dan);uttaeru(1-dan)
+こうしょう;koushou
+しゅうり;shuuri
+しゅうりする;shuurisuru
+ぶひん;buhin
+とりかえる(1-dan);torikaeru(1-dan)
+たいしゅう;taishuu
+せいじてきだ;seijitekida
+いしき;ishiki
+いんしょうをうける;inshouwoukeru
+こうがい;kougai
+きょうつうする;kyoutsuusuru
+じゅうだいだ;juudaida
+ます;masu
+ひりょう;hiryou
+かがくひりょう;kagakuhiryou
+かいはつ;kaihatsu
+かいはつする;kaihatsusuru
+のうやく;nouyaku
+もちいる(1-dan);mochiiru(1-dan)
+ちゅうどく;chuudoku
+ちゅうどくする;chuudokusuru
+しぼう;shibou
+しぼうする;shibousuru
+はっせい;hassei
+はっせいする;hasseisuru
+ぎせい;gisei
+いっぽうてきだ;ippoutekida
+かたよる;katayoru
+かたよった;katayotta
+ほご;hogo
+ほごする;hogosuru
+せいさく;seisaku
+あんてい;antei
+あんていする;anteisuru
+さんぶつ;sanbutsu
+かかく;kakaku
+かくりつ;kakuritsu
+かくりつする;kakuritsusuru
+おかわりありませんか;okawariarimasenka
+かけがえのない;kakegaenonai
+こじんきょうじゅ;kojinkyouju
+どうきゅう;doukyuu
+たより;tayori
+とも(Suffix);tomo(Suffix)
+はなす;hanasu
+みっせつだ;missetsuda
+しゅし;shushi
+はんきょう;hankyou
+たにざきじゅんいちろう;tanizakijun_ichirou
+かわばたやすなり;kawabatayasunari
+び;bi
+エキゾチシズム;ekizochishizumu
+コピー;kopii
+たずさわる;tazusawaru
+すうじ;suuji
+ことずける(1-dan);kotozukeru(1-dan)
+まえもって;maemotte
+ざんしょ;zansho
+いのる;inoru
+やまもと;yamamoto
+ふみこ;fumiko
+ただいま;tadaima
+ませ;mase
+つかまる;tsukamaru
+ごめんなさい;gomennasai
+ゼミ;zemi
+れんちゅう;renchuu
+かくめい;kakumei
+てんらんかい;tenrankai
+じゃ;ja
+いってたろう;ittetarou
+なにしろ;nanishiro
+せんむ;senmu
+えんかい;enkai
+おうせつま;ousetsuma
+わざわざ;wazawaza
+おこしになる;okoshininaru
+きょうしゅくだ;kyoushukuda
+ぎょうむ;gyoumu
+じゅんちょうだ;junchouda
+らいねんど;rainendo
+ゆうし;yuushi
+ゆうしする;yuushisuru
+たちいる(1-dan);tachiiru(1-dan)
+ほんじつ;honjitsu
+ようけん;youken
+せき;seki
+ぼうし;boushi
+たとえば;tatoeba
+しけん;shiken
+おとめ;otome
+めいれい;meirei
+おい;oi
+おいて;oite
+しんか;shinka
+しんうん;shin_un
+すすむ;susumu
+つい;tsui
+そそぐ;sosogu
+いっかげつ;ikkagetsu
+さゆう;sayuu
+みぎて;migite
+あまぐも;amagumo
+はるさめ;harusame
+ごひゃくえん;gohyakuen
+まるい;marui
+おうじ;ouji
+おうじょ;oujo
+おとをだす;otowodasu
+ほんね;honne
+したごころ;shitagokoro
+げひんな;gehinna
+したごころ;shitagokoro
+ください;kudasai
+へたな;hetana
+かざん;kazan
+かようび;kayoubi
+ひばな;hibana
+はなび;hanabi
+こっか;kokka
+はなみ;hanami
+かいぼたん;kaibotan
+がくせい;gakusei
+がっこう;gakkou
+まなぶ;manabu
+きたい;kitai
+きゅうじつ;kyuujitsu
+ひるやすみ;hiruyasumi
+たまご;tamago
+きんいろ;kin_iro
+おかね;okane
+きゅうかい;kyuukai
+くうしゃ;kuusha
+からて;karate
+おおぞら;oozora
+あける;akeru
+しがつ;shigatsu
+まいつき;maitsuki
+つきろけっと;tsukiroketto
+げつようび;getsuyoubi
+ばんけん;banken
+こいぬ;koinu
+いぬごや;inugoya
+いっけん;ikken
+せんけん;senken
+みほん;mihon
+みる;miru
+みせる;miseru
+ごにん;gonin
+いつか;itsuka
+くちだし;kuchidashi
+ちゅうがっこう;chuugakkou
+ぼこう;bokou
+こうちょう;kouchou
+さほう;sahou
+ひだりあし;hidariashi
+さんにん;sannin
+みっか;mikka
+さんすい;sansui
+かざん;kazan
+こやま;koyama
+しがつ;shigatsu
+よっか;yokka
+だんし;danshi
+じょし;joshi
+おんなのこ;onnanoko
+いっしまとわね;isshimatowane
+いとぐるま;itoguruma
+きいと;kiito
+こくじ;kokuji
+ろおまじ;roomaji
+じもく;jimoku
+みみたぶ;mimitabu
+しちにん;shichinin
+なのか;nanoka
+すいしゃ;suisha
+じょうず;jouzu
+てほん;tehon
+じゅうにん;juunin
+とおか;tooka
+しゅっか;shukka
+ひとで;hitode
+だす;dasu
+でる;deru
+じょちゅう;jochuu
+おんなのひと;onnanohito
+こびと;kobito
+こがね;kogane
+じょうげ;jouge
+しんりん;shinrin
+あおもり;aomori
+どいつじん;doitsujin
+ひゃくにん;hyakunin
+ひとびと;hitobito
+すいようび;suiyoubi
+みずがめ;mizugame
+ただしい;tadashii
+いけばな;ikebana
+うまれる;umareru
+せいねん;seinen
+あおぞら;aozora
+あおもの;aomono
+ぼくせき;bokuseki
+こいし;koishi
+いしきり;ishikiri
+せきどう;sekidou
+あからめる;akarameru
+せんじつ;senjitsu
+せんせんげつ;sensengetsu
+かんてん;kanten
+ひぼしの;hiboshino
+ほしくさ;hoshikusa
+おがわ;ogawa
+かわかみ;kawakami
+そうそう;sousou
+はやみみ;hayamimi
+てばやい;tebayai
+そうげん;sougen
+くさき;kusaki
+そうほん;souhon
+いっそく;issoku
+てあし;teashi
+たりる;tariru
+たす;tasu
+そんかい;sonkai
+そんちょう;sonchou
+むらびと;murabito
+たいきん;taikin
+おおきさ;ookisa
+だんせい;dansei
+ちょうなん;chounan
+おとこのひと;otokonohito
+おおおとこ;oootoko
+ちくりん;chikurin
+しない;shinai
+たけのつえ;takenotsue
+にちゅう;nichuu
+いちにちじゅう;ichinichijuu
+がいちゅう;gaichuu
+むしば;mushiba
+ちょうない;chounai
+したまち;shitamachi
+てんもんがく;tenmongaku
+あまのがわ;amanogawa
+すいでん;suiden
+ほんだ;honda
+どぼく;doboku
+どじん;dojin
+ふたり;futari
+ふつか;futsuka
+いちじつ;ichijitsu
+ついたち;tsuitachi
+みっか;mikka
+にゅうこく;nyuukoku
+はいる;hairu
+いれる;ireru
+ねんきん;nenkin
+はくし;hakushi
+しろい;shiroi
+はちにん;hachinin
+ようか;youka
+やっつ;yattsu
+ひゃくにん;hyakunin
+ぶんがく;bungaku
+ふみ;fumi
+ほんじつ;honjitsu
+もと;moto
+めいが;meiga
+だいみょう;daimyou
+もくようび;mokuyoubi
+きぎ;kigi
+いちもく;ichimoku
+めうえ;meue
+めした;meshita
+いっせき;isseki
+ゆうひ;yuuhi
+たなばた;tanabata
+じりつ;jiritsu
+たてる;tateru
+たいりょく;tairyoku
+むりょく;muryoku
+りんがく;ringaku
+こばやし;kobayashi
+ろくにん;rokunin
+むいか;muika
+いんりょく;inryoku
+ひきだし;hikidashi
+うもう;umou
+しらは;shiraha
+はねだ;haneda
+ふううん;fuuun
+あんうん;an_un
+あまぐも;amagumo
+らくえん;rakuen
+はなぞの;hanazono
+そくたつ;sokutatsu
+そくど;sokudo
+はやめる;hayameru
+すみやか;sumiyaka
+こうよう;kouyou
+おうごん;ougon
+きいろ;kiiro
+なにごと;nanigoto
+なんにち;nannichi
+りっか;rikka
+なつもの;natsumono
+かじ;kaji
+けらい;kerai
+やぬし;yanushi
+しりょう;shiryou
+りょうきん;ryoukin
+かしゅ;kashu
+たんか;tanka
+うたう;utau
+がか;gaka
+あう;au
+かいぎ;kaigi
+こんかい;konkai
+ぜんかい;zenkai
+いいまわし;iimawashi
+まわす;mawasu
+まわる;mawaru
+たいかい;taikai
+うちうみ;uchiumi
+かいが;kaiga
+えはがき;ehagaki
+くちえ;kuchie
+がいらいご;gairaigo
+ほかに;hokani
+はずす;hazusu
+さんかく;sankaku
+まちかど;machikado
+たのしい;tanoshii
+ぶんらく;bunraku
+かつどう;katsudou
+ちゅうかん;chuukan
+にんげん;ningen
+まもなく;mamonaku
+がんやく;gan_yaku
+まるい;marui
+こばやしまる;kobayashimaru
+がんせき;ganseki
+いわや;iwaya
+がんめん;ganmen
+かおいろ;kaoiro
+しらんかお;shirankao
+きこく;kikoku
+きせん;kisen
+きゅうどう;kyuudou
+ゆみや;yumiya
+ぎゅうにく;gyuuniku
+うしごや;ushigoya
+きんぎょ;kingyo
+うおいちば;uoichiba
+さかなや;sakanaya
+とうきょう;toukyou
+ぺきん;pekin
+つよい;tsuyoi
+きょうかい;kyoukai
+おしえかた;oshiekata
+おそわる;osowaru
+きんじょ;kinjo
+ちかみち;chikamichi
+きょうだい;kyoudai
+ふけい;fukei
+ずけい;zukei
+がんじつ;ganjitsu
+げんき;genki
+もともと;motomoto
+そうげん;sougen
+げんりょう;genryou
+うなばら;unabara
+いう;iu
+げんご;gengo
+こご;kogo
+ふるい;furui
+とだな;todana
+こがいで;kogaide
+ごぜん;gozen
+しょうご;shougo
+あとで;atode
+いご;igo
+がいこくご;gaikokugo
+ものがたり;monogatari
+がいこう;gaikou
+まぜる;mazeru
+まじわる;majiwaru
+にっこう;nikkou
+ひかる;hikaru
+こうりつ;kouritsu
+こういん;kouin
+だいく;daiku
+こうがく;kougaku
+ひろい;hiroi
+こうだい;koudai
+かんがえる;kangaeru
+かんがえかた;kangaekata
+こうあん;kouan
+いく;iku
+いっこう;ikkou
+ぎょうかん;gyoukan
+がっしょう;gasshou
+あいきどう;aikidou
+ぜんこく;zenkoku
+くにぐに;kuniguni
+こくじん;kokujin
+くろい;kuroi
+こんにち;konnichi
+ただいま;tadaima
+さいき;saiki
+なんさい;nansai
+さっか;sakka
+つくる;tsukuru
+さんしゅつする;sanshutsusuru
+こうさん;kousan
+ねえさん;neesan
+しない;shinai
+しがい;shigai
+おもいだす;omoidasu
+おもいあがった;omoiagatta
+とめる;tomeru
+きゅうし;kyuushi
+しつもんようし;shitsumon_youshi
+てがみ;tegami
+しゃじ;shaji
+おてら;otera
+いちじ;ichiji
+ときどき;tokidoki
+じぶん;jibun
+みずからのてで;mizukaranotede
+ほんや;hon_ya
+おくじょう;okujou
+しゃいん;shain
+しゃかい;shakai
+よわい;yowai
+きょうじゃく;kyoujaku
+よわる;yowaru
+しゅちょう;shuchou
+しゅしょう;shushou
+てくび;tekubi
+しゅうき;shuuki
+あきかぜ;akikaze
+こんしゅう;konshuu
+にしゅうかん;nishuukan
+しゅんぶん;shunbun
+はるさめ;harusame
+しょどう;shodou
+しょうじょ;shoujo
+すこし;sukoshi
+しじょう;shijou
+たちば;tachiba
+とくしょく;tokushoku
+きいろ;kiiro
+しょくじ;shokuji
+たべもの;tabemono
+しんぱい;shinpai
+こころもち;kokoromochi
+しんせつ;shinsetsu
+おやがいしゃ;oyagaisha
+ちず;chizu
+としょかん;toshokan
+はかる;hakaru
+かいすう;kaisuu
+かずかずの;kazukazuno
+かせい;kasei
+ほしうらない;hoshiuranai
+せいてん;seiten
+はれのひ;harenohi
+めいせい;meisei
+おおごえ;oogoe
+とうざい;touzai
+にしよおろっぱ;nishiyooroppa
+たいせつな;taisetsuna
+きって;kitte
+しんせつ;shinsetsu
+ゆきまつり;yukimatsuri
+かせん;kasen
+こうせん;kousen
+ないせん;naisen
+せんちょう;senchou
+ふなたび;funatabi
+ごぜん;gozen
+ばんぐみ;bangumi
+くむ;kumu
+そせい;sosei
+はしる;hashiru
+そうこうじかん;soukoujikan
+くちばしる;kuchibashiru
+おおい;ooi
+ふとい;futoi
+こうたいし;koutaishi
+たいへいよう;taiheiyou
+じんたい;jintai
+ごたい;gotai
+たかだい;takadai
+たにま;tanima
+たにがわ;tanigawa
+ちじん;chijin
+しる;shiru
+ちか;chika
+きじ;kiji
+でんち;denchi
+ちゃいろ;chairo
+ちゃのま;chanoma
+ちゅうしょく;chuushoku
+ひるやすみ;hiruyasumi
+ちょうしょく;choushoku
+あさひ;asahi
+けさ;kesa
+ぶちょう;buchou
+ながねん;naganen
+はくちょう;hakuchou
+いっせきにちょう;issekinichou
+ちょくぜん;chokuzen
+ちょくご;chokugo
+つやく;tsuyaku
+かよう;kayou
+でし;deshi
+しょてん;shoten
+でみせ;demise
+てんがよい;tengayoi
+がてん;gaten
+でんりょく;denryoku
+とうき;touki
+ふゆもの;fuyumono
+めいとう;meitou
+こがたな;kogatana
+しない;shinai
+ちゅうとう;chuutou
+ひがしあじあ;higashiajia
+ほんとう;hontou
+とうじ;touji
+ひとりあたり;hitoriatari
+あたる;ataru
+こうとう;koutou
+めいとう;meitou
+こたえる;kotaeru
+しゅっとう;shuttou
+おなじ;onaji
+どうこく;doukoku
+どうじょう;doujou
+かえりみちで;kaerimichide
+どくしゃ;dokusha
+よみかた;yomikata
+たいない;tainai
+なんせい;nansei
+みなみかぜ;minamikaze
+ぎゅうにく;gyuuniku
+にくしん;nikushin
+ばりき;bariki
+うまごや;umagoya
+ばいばい;baibai
+かいもの;kaimono
+ばいてん;baiten
+とくばい;tokubai
+うりきれる;urikireru
+うりば;uriba
+ばくしゅびいる;bakushubiiru
+こむぎ;komugi
+おおむぎ;oomugi
+らいむぎ;raimugi
+つきなかばに;tsukinakabani
+ばんち;banchi
+ばんにん;bannin
+ふぼ;fubo
+ふうりょく;fuuryoku
+にほんふう;nihonfuu
+ふろば;furoba
+きたかぜ;kitakaze
+ぶんけ;bunke
+まいふん;maifun
+ものわかりのよい;monowakarinoyoi
+ふうぶん;fuubun
+みちをきく;michiwokiku
+べいこく;beikoku
+こめや;komeya
+ほこうしゃ;hokousha
+あるく;aruku
+ぼいん;boin
+ぼこくご;bokokugo
+ちほう;chihou
+かんがえかた;kangaekata
+ほっぽう;hoppou
+きたぐち;kitaguchi
+ていまい;teimai
+まいかい;maikai
+ふつかめごとに;futsukamegotoni
+まんねん;mannen
+ばんにん;bannin
+めいげつ;meigetsu
+みょうにち;myounichi
+あかるい;akarui
+なく;naku
+うもう;umou
+けいと;keito
+あかげ;akage
+せいもん;seimon
+にゅうもん;nyuumon
+かどぐち;kadoguchi
+やはん;yahan
+よあけ;yoake
+よぞら;yozora
+よるひる;yoruhiru
+やがい;yagai
+ののはな;nonohana
+ゆみや;yumiya
+やさき;yasaki
+ゆうこう;yuukou
+ともだち;tomodachi
+しちよう;shichiyou
+ようび;youbi
+ようにん;younin
+ようがある;yougaaru
+ひろくもちいる;hirokumochiiru
+らいしゅう;raishuu
+かえってくる;kaettekuru
+ぎりしゃごからきたことば;girishagokarakitakotoba
+りか;rika
+しんりがく;shinrigaku
+むり;muri
+りじん;rijin
+やまざと;yamazato
+かいり;kairi
+わしゃ;washa
+かいわ;kaiwa
+はなしごえ;hanashigoe
+いちがつ;ichigatsu
+きんいつ;kin_itsu
+うは;uha
+うがん;ugan
+みぎて;migite
+うき;uki
+おおあめ;ooame
+あまぐも;amagumo
+えんけい;enkei
+えんだか;endaka
+ひゃくえん;hyakuen
+おうじ;ouji
+じょおう;joou
+おうさま;ousama
+しいん;shiin
+ていか;teika
+げしゃ;gesha
+かわしも;kawashimo
+かようび;kayoubi
+かざん;kazan
+ひばな;hibana
+かべん;kaben
+はなび;hanabi
+はなみ;hanami
+がっこう;gakkou
+がくしゃ;gakusha
+でんき;denki
+じゅうきゅう;juukyuu
+くがつ;kugatsu
+きゅうじつ;kyuujitsu
+きゅうせん;kyuusen
+なつやすみ;natsuyasumi
+きんようび;kin_youbi
+こんじき;konjiki
+かねもち;kanemochi
+そらいろ;sorairo
+からばこ;karabako
+こんげつ;kongetsu
+げつようび;getsuyoubi
+つきみ;tsukimi
+りょうけん;ryouken
+いぬごや;inugoya
+こいぬ;koinu
+はっけん;hakken
+けんぶつ;kenbutsu
+みもの;mimono
+ごがつ;gogatsu
+ごにん;gonin
+いつか;itsuka
+こうじつ;koujitsu
+でぐち;deguchi
+こうせい;kousei
+こうちょう;kouchou
+さは;saha
+ひだりがわ;hidarigawa
+ひだりて;hidarite
+さんがつ;sangatsu
+みっか;mikka
+さんかく;sankaku
+ひょうざん;hyouzan
+やまば;yamaba
+でんし;denshi
+こども;kodomo
+ようす;yousu
+しがつ;shigatsu
+よっか;yokka
+よんかい;yonkai
+せいし;seishi
+けいと;keito
+いとまき;itomaki
+じびき;jibiki
+あかじ;akaji
+すうじ;suuji
+じか;jika
+みみなり;miminari
+みみかざり;mimikazari
+しちがつ;shichigatsu
+なのか;nanoka
+ななばん;nanaban
+はっしゃ;hassha
+くちぐるま;kuchiguruma
+しゅだん;shudan
+てほん;tehon
+じょうず;jouzu
+じゅうがつ;juugatsu
+とおか;tooka
+じゅうじ;juuji
+しゅっぱつ;shuppatsu
+おもいで;omoide
+ひきだし;hikidashi
+じょせい;josei
+にょうぼう;nyoubou
+おんなのこ;onnanoko
+しょうじん;shoujin
+こうし;koushi
+おがわ;ogawa
+いじょう;ijou
+かわかみ;kawakami
+ねあげ;neage
+しんりん;shinrin
+しんげん;shingen
+しんかん;shinkan
+にほんじん;nihonjin
+にんげん;ningen
+ひとで;hitode
+すいようび;suiyoubi
+すいそ;suiso
+おおみず;oomizu
+せいかい;seikai
+しょうがつ;shougatsu
+しょうじき;shoujiki
+がくせい;gakusei
+いっしょう;isshou
+いきもの;ikimono
+せいねん;seinen
+あおぞら;aozora
+あおもの;aomono
+こんせき;konseki
+ゆうしょく;yuushoku
+ゆうひ;yuuhi
+かせき;kaseki
+こいし;koishi
+せきゆ;sekiyu
+せきどう;sekidou
+せきめん;sekimen
+あかんぼう;akanbou
+せんえん;sen_en
+ごせん;gosen
+ちどり;chidori
+かわぐち;kawaguchi
+かわばた;kawabata
+えどがわ;edogawa
+せんげつ;sengetsu
+ゆびさき;yubisaki
+そうきゅう;soukyuu
+はやくち;hayakuchi
+はやじに;hayajini
+ふそく;fusoku
+あしくび;ashikubi
+あしおと;ashioto
+そんちょう;sonchou
+のうそん;nouson
+むらびと;murabito
+たいかい;taikai
+だいがく;daigaku
+おおごえ;oogoe
+だんし;danshi
+ちょうなん;chounan
+おとこぎ;otokogi
+ちゅうりつ;chuuritsu
+ちゅうごく;chuugoku
+まんなか;mannaka
+きせいちゅう;kiseichuu
+がいちゅう;gaichuu
+むしば;mushiba
+ちょうみん;choumin
+ちょうちょう;chouchou
+したまち;shitamachi
+てんし;tenshi
+てんのう;tennou
+あまくだり;amakudari
+でんえん;den_en
+たうえ;taue
+いなか;inaka
+どようび;doyoubi
+とち;tochi
+つちくさい;tsuchikusai
+にがつ;nigatsu
+にじゅう;nijuu
+ふたり;futari
+にちようび;nichiyoubi
+ほんじつ;honjitsu
+ふつか;futsuka
+ゆにゅう;yunyuu
+いりぐち;iriguchi
+いれもの;iremono
+らいねん;rainen
+ごねんせい;gonensei
+としより;toshiyori
+はくしょ;hakusho
+はくじん;hakujin
+はちがつ;hachigatsu
+やおや;yaoya
+やつあたり;yatsuatari
+ひゃくばい;hyakubai
+ひゃくしょう;hyakushou
+ひゃっかてん;hyakkaten
+ぶんがく;bungaku
+もんじ;monji
+もんぶしょう;monbushou
+もくようび;mokuyoubi
+きめ;kime
+こだち;kodachi
+にほん;nihon
+ほんや;hon_ya
+ほんてん;honten
+ゆうめい;yuumei
+めいじん;meijin
+ひとつめ;hitotsume
+ちゅうもく;chuumoku
+ひとめ;hitome
+じりつ;jiritsu
+たちば;tachiba
+めだつ;medatsu
+のうりょく;nouryoku
+じんりきしゃ;jinrikisha
+ちからだめし;chikaradameshi
+りんがく;ringaku
+こばやし;kobayashi
+みつりん;mitsurin
+ろくがつ;rokugatsu
+むいか;muika
+ろっかく;rokkaku
+いんりょく;inryoku
+じびき;jibiki
+とりひき;torihiki
+うんも;unmo
+せいうん;seiun
+うきぐも;ukigumo
+えんそく;ensoku
+とおまわり;toomawari
+えんし;enshi
+なんかい;nankai
+なにもの;nanimono
+なんにん;nannin
+がっか;gakka
+けんきゅうか;kenkyuuka
+しょか;shoka
+まなつ;manatsu
+なつまつり;natsumatsuri
+のうか;nouka
+ぶけ;buke
+さっか;sakka
+かしゅ;kashu
+たんか;tanka
+かぞえうた;kazoeuta
+えいが;eiga
+がめん;gamen
+かいてん;kaiten
+かいすう;kaisuu
+いいまわし;iimawashi
+かいしゃ;kaisha
+えしゃく;eshaku
+こっかい;kokkai
+かいぐん;kaigun
+にほんかい;nihonkai
+うみべ;umibe
+かいが;kaiga
+くちえ;kuchie
+えほん;ehon
+ほたてがい;hotategai
+かいがら;kaigara
+かいるい;kairui
+がいじん;gaijin
+げか;geka
+そとがわ;sotogawa
+にんげん;ningen
+まちがい;machigai
+がんめん;ganmen
+かおいろ;kaoiro
+かおつき;kaotsuki
+きせん;kisen
+きあつ;kiatsu
+きしゃ;kisha
+きじ;kiji
+にっき;nikki
+きか;kika
+きせい;kisei
+かえりみち;kaerimichi
+ぎゅうにく;gyuuniku
+ぎゅうにゅう;gyuunyuu
+うしかい;ushikai
+きんぎょ;kingyo
+うおつり;uotsuri
+さかなや;sakanaya
+とうきょう;toukyou
+じょうきょう;joukyou
+けいひん;keihin
+きょうか;kyouka
+つよみ;tsuyomi
+きょうかい;kyoukai
+きょうしつ;kyoushitsu
+おしえご;oshiego
+ぎょくはい;gyokuhai
+たまつき;tamatsuki
+めだま;medama
+きんじょ;kinjo
+さいきん;saikin
+ちかみち;chikamichi
+けいしき;keishiki
+かたちづくる;katachidukuru
+ごうけい;goukei
+けいさん;keisan
+かんだんけい;kandankei
+げんき;genki
+がんらい;ganrai
+もとどおり;motodoori
+げんし;genshi
+げんぶん;genbun
+くさはら;kusahara
+こがい;kogai
+こしゅ;koshu
+とぐち;toguchi
+ふっこ;fukko
+こうこがく;koukogaku
+ふるほん;furuhon
+ごぜん;gozen
+しょうご;shougo
+いご;igo
+こうはん;kouhan
+あとあじ;atoaji
+ごちょう;gochou
+ものがたり;monogatari
+にほんご;nihongo
+こうじょう;koujou
+じんこう;jinkou
+だいく;daiku
+こうだい;koudai
+ひろしま;hiroshima
+こうこく;koukoku
+がいこう;gaikou
+こうかん;koukan
+にっこう;nikkou
+こうねん;kounen
+こうがく;kougaku
+こうあん;kouan
+さんこう;sankou
+かんがえごと;kangaegoto
+じっこう;jikkou
+ぎょうれつ;gyouretsu
+ゆくえ;yukue
+こうげん;kougen
+さいこう;saikou
+たかね;takane
+こうよう;kouyou
+おうごん;ougon
+きいろ;kiiro
+ごうり;gouri
+かっせん;kassen
+はなしあい;hanashiai
+ゆうこく;yuukoku
+たにぞこ;tanizoko
+はせがわ;hasegawa
+しこく;shikoku
+こっか;kokka
+こくじん;kokujin
+くろじ;kuroji
+こくしびょう;kokushibyou
+こんしゅう;konshuu
+こんど;kondo
+ことし;kotoshi
+てんさい;tensai
+さいのう;sainou
+ごさい;gosai
+せいさく;seisaku
+さくひん;sakuhin
+どうさ;dousa
+さんぷ;sanpu
+よさん;yosan
+さんすう;sansuu
+ちゅうし;chuushi
+とめど;tomedo
+とまりぎ;tomarigi
+すいたし;suitashi
+しじょう;shijou
+うおいち;uoichi
+しそう;shisou
+しこう;shikou
+おもいだす;omoidasu
+ひょうし;hyoushi
+わし;washi
+てがみ;tegami
+りょうあんじ;ryouanji
+じいん;jiin
+やまでら;yamadera
+じぶん;jibun
+しぜん;shizen
+じしん;jishin
+にじ;niji
+ときどき;tokidoki
+しつない;shitsunai
+きょしつ;kyoshitsu
+むろつ;murotsu
+しゃかい;shakai
+じんじゃ;jinja
+しゃいん;shain
+じゃくてん;jakuten
+じゃくしょう;jakushou
+よわむし;yowamushi
+しゅりょう;shuryou
+くびわ;kubiwa
+くびきり;kubikiri
+ばんしゅう;banshuu
+しゅうぶん;shuubun
+あきぞら;akizora
+せいしゅん;seishun
+ばいしゅん;baishun
+はるぎ;harugi
+しょき;shoki
+きょうかしょ;kyoukasho
+はがき;hagaki
+しょうねん;shounen
+しょうすう;shousuu
+たしょう;tashou
+かいじょう;kaijou
+にゅうじょう;nyuujou
+ひろば;hiroba
+こうしょく;koushoku
+しきそ;shikiso
+ぎんいろ;gin_iro
+しょくじ;shokuji
+たべもの;tabemono
+くいもの;kuimono
+ちゅうしん;chuushin
+しんぞう;shinzou
+まごころ;magokoro
+しんねん;shinnen
+しんぴん;shinpin
+しんじん;shinjin
+しんるい;shinrui
+おやこ;oyako
+ちず;chizu
+ずが;zuga
+としょかん;toshokan
+すうがく;suugaku
+じゅず;juzu
+かずかず;kazukazu
+せいよう;seiyou
+かんさい;kansai
+にしび;nishibi
+せいえん;seien
+だいおんじょう;daionjou
+なきごえ;nakigoe
+かせい;kasei
+みょうじょう;myoujou
+ながれぼし;nagareboshi
+せいてん;seiten
+はればれ;harebare
+はれぎ;haregi
+しんせつ;shinsetsu
+いっさい;issai
+はらきり;harakiri
+こうせつ;kousetsu
+おおゆき;ooyuki
+じょせつしゃ;josetsusha
+せんちょう;senchou
+こぎぶね;kogibune
+ふなびん;funabin
+ぜんしゃ;zensha
+くうぜん;kuuzen
+まえばらい;maebarai
+そしき;soshiki
+くみあい;kumiai
+くみたて;kumitate
+きょうそう;kyousou
+ずつう;zutsuu
+あたまうち;atamauchi
+どうよう;douyou
+どうじ;douji
+どうい;doui
+てつどう;tetsudou
+しんとう;shintou
+みちばた;michibata
+どくしゃ;dokusha
+とくほん;tokuhon
+よみかた;yomikata
+とうなん;tounan
+なんきょく;nankyoku
+みなみがわ;minamigawa
+ばじゅつ;bajutsu
+ばしゃ;basha
+うまのり;umanori
+ばいばい;baibai
+ばいてん;baiten
+うりもの;urimono
+ばいしゅう;baishuu
+かいもの;kaimono
+かいて;kaite
+ばくが;bakuga
+むぎちゃ;mugicha
+こむぎ;komugi
+はんとう;hantou
+はんとし;hantoshi
+じゅんばん;junban
+ばんにん;bannin
+ふぼ;fubo
+おとうさま;otousama
+ちちおや;chichioya
+ふうせん;fuusen
+かみかぜ;kamikaze
+わふう;wafuu
+ぶんし;bunshi
+いっぷん;ippun
+いちぶ;ichibu
+ちょうもん;choumon
+ききとる;kikitoru
+べいか;beika
+べいこく;beikoku
+はくまい;hakumai
+しんぽ;shinpo
+ほこうしゃ;hokousha
+あるきだす;arukidasu
+ぼせい;bosei
+おかあさま;okaasama
+ははおや;hahaoya
+ほうがく;hougaku
+おやかた;oyakata
+みかた;mikata
+とうほく;touhoku
+はいぼく;haiboku
+きたかぜ;kitakaze
+まいにち;mainichi
+まいど;maido
+ひごと;higoto
+しまい;shimai
+いもうとぶん;imoutobun
+れいまい;reimai
+めいはく;meihaku
+みょうにち;myounichi
+あけがた;akegata
+めいどう;meidou
+なきごえ;nakigoe
+なりもの;narimono
+ようもう;youmou
+けがわ;kegawa
+けむし;kemushi
+せいもん;seimon
+もんばん;monban
+かどで;kadode
+ほんや;hon_ya
+よあけ;yoake
+よるがお;yorugao
+やせい;yasei
+やきゅう;yakyuu
+のはら;nohara
+ゆうじん;yuujin
+ゆうじょう;yuujou
+ともだち;tomodachi
+ようい;youi
+あくよう;akuyou
+ようび;youbi
+かよう;kayou
+しちよう;shichiyou
+しんらいしゃ;shinraisha
+きらく;kiraku
+たのしみ;tanoshimi
+がっき;gakki
+いちり;ichiri
+さとびと;satobito
+ふるさと;furusato
+りせい;risei
+むり;muri
+しんりがく;shinrigaku
+かいわ;kaiwa
+わだい;wadai
+こばなし;kobanashi
+あくい;akui
+おかん;okan
+わるもの;warumono
+ふあん;fuan
+あんしん;anshin
+やすもの;yasumono
+めいあん;meian
+あんさつ;ansatsu
+まっくら;makkura
+げかい;gekai
+いがく;igaku
+けつい;ketsui
+いけん;iken
+きょういく;kyouiku
+いくじ;ikuji
+そだておや;sodateoya
+かいいん;kaiin
+ぜんいん;zen_in
+どういん;douin
+びょういん;byouin
+じいん;jiin
+ぎいん;giin
+いんようすい;in_yousui
+のみもの;nomimono
+のみや;nomiya
+ふうん;fuun
+うんそう;unsou
+すいえい;suiei
+はいえい;haiei
+ひらおよぎ;hiraoyogi
+えきちょう;ekichou
+えきべん;ekiben
+とうきょうえき;toukyoueki
+どうぶつえん;doubutsuen
+はなぞの;hanazono
+おうだん;oudan
+おうこう;oukou
+よこがお;yokogao
+おくじょう;okujou
+こや;koya
+ぱんや;pan_ya
+おんせん;onsen
+おんじょう;onjou
+おんしつ;onshitsu
+へんか;henka
+けしょう;keshou
+ばけもの;bakemono
+しゅっか;shukka
+ふなに;funani
+にもつ;nimotsu
+きょうかい;kyoukai
+せいかい;seikai
+かいはつ;kaihatsu
+かいし;kaishi
+ひらきづな;hirakiduna
+かいだん;kaidan
+にかい;nikai
+かいきゅう;kaikyuu
+かくど;kakudo
+つのぶえ;tsunobue
+まちかど;machikado
+かっき;kakki
+かつどう;katsudou
+かんぱ;kanpa
+さむけ;samuke
+かんだんけい;kandankei
+かんしん;kanshin
+かんかく;kankaku
+かんじょう;kanjou
+かいかん;kaikan
+りょかん;ryokan
+びじゅつかん;bijutsukan
+かいがん;kaigan
+たいがん;taigan
+かわぎし;kawagishi
+がんせき;ganseki
+いわや;iwaya
+じさ;jisa
+さべつ;sabetsu
+さしこむ;sashikomu
+やさい;yasai
+なたね;natane
+さいしょくしゅぎ;saishokushugi
+さいだい;saidai
+さいご;saigo
+さいしんしき;saishinshiki
+ざいもく;zaimoku
+ざいりょう;zairyou
+じんざい;jinzai
+さくじつ;sakujitsu
+さくや;sakuya
+さくねん;sakunen
+いんさつしょ;insatsusho
+さっしん;sasshin
+こうせいずり;kouseizuri
+さつじん;satsujin
+じさつ;jisatsu
+ころしや;koroshiya
+けいさつ;keisatsu
+さっち;sacchi
+かんさつ;kansatsu
+さんか;sanka
+さんこう;sankou
+さんぎ;sangi
+せいさん;seisan
+さんぶつ;sanbutsu
+しゅっさん;shussan
+さんぶん;sanbun
+ちらし;chirashi
+ざんきん;zankin
+ざんにん;zannin
+ぶし;bushi
+しかん;shikan
+しゅうし;shuushi
+しめい;shimei
+しぞく;shizoku
+かとうし;katoushi
+れきし;rekishi
+じょし;joshi
+しじょう;shijou
+しほう;shihou
+しれいぶ;shireibu
+しかいしゃ;shikaisha
+ねえさん;neesan
+あねうえ;aneue
+しまいとし;shimaitoshi
+しあい;shiai
+しけんかん;shikenkan
+こころみ;kokoromi
+しょうてんがい;shoutengai
+かくだい;kakudai
+かくさん;kakusan
+かくせいき;kakuseiki
+かくめい;kakumei
+かくしん;kakushin
+かわこうば;kawakouba
+かっか;kakka
+ないかく;naikaku
+かくりょう;kakuryou
+ぶんかつ;bunkatsu
+わりびき;waribiki
+わりあい;wariai
+きりかぶ;kirikabu
+かぶしき;kabushiki
+かぶぬし;kabunushi
+かんちょう;kanchou
+かんじょう;kanjou
+ほしにく;hoshiniku
+だいいっかん;daiikkan
+まきもの;makimono
+いとまき;itomaki
+かんごふ;kangofu
+かんばん;kanban
+かんしゅ;kanshu
+かんこく;kankoku
+かんしょう;kanshou
+かんゆう;kan_yuu
+かんたん;kantan
+しょかん;shokan
+かんりゃく;kanryaku
+がんやく;gan_yaku
+まるみ;marumi
+にっぽんまる;nipponmaru
+きき;kiki
+きけん;kiken
+きがい;kigai
+きじょう;kijou
+きへん;kihen
+じむつくえ;jimutsukue
+はっき;hakki
+しき;shiki
+きはつせい;kihatsusei
+きぞく;kizoku
+きちょう;kichou
+しつぎ;shitsugi
+ぎもん;gimon
+ぎじ;giji
+きゅうどう;kyuudou
+きゅうじょう;kyuujou
+ゆみとり;yumitori
+きゅうしゅう;kyuushuu
+ゆせい;yusei
+てんじょう;tenjou
+いど;ido
+せいめい;seimei
+かいせい;kaisei
+ひゃくしょう;hyakushou
+せいふく;seifuku
+えんせい;ensei
+せいい;seii
+いっせい;issei
+せいいつ;seiitsu
+せいしょう;seishou
+ぎせいしゃ;giseisha
+いけにえ;ikenie
+ぎせいてき;giseiteki
+せいきょ;seikyo
+きゅうせい;kyuusei
+ちょうせい;chousei
+ぜんせいき;zenseiki
+おおもり;oomori
+もえさかる;moesakaru
+じょせい;josei
+はなむこ;hanamuko
+むこいり;mukoiri
+せいやく;seiyaku
+せんせい;sensei
+ちかいごと;chikaigoto
+せいきゅう;seikyuu
+ふしん;fushin
+うけおいにん;ukeoinin
+はいせき;haiseki
+せっこう;sekkou
+せきりょく;sekiryoku
+せきじつ;sekijitsu
+むかしふう;mukashifuu
+こんじゃく;konjaku
+ぶんせき;bunseki
+かいせき;kaiseki
+せきしゅつ;sekishutsu
+せきしゅ;sekishu
+いっせき;isseki
+いっせきがん;issekigan
+つうせき;tsuuseki
+おしげ;oshige
+ほねおしみ;honeoshimi
+ついせき;tsuiseki
+あしあと;ashiato
+いせき;iseki
+しょせき;shoseki
+こせき;koseki
+こくせき;kokuseki
+せっしゃ;sessha
+ぼうしょう;boushou
+がくぼう;gakubou
+ぼうだい;boudai
+ぼうまん;bouman
+ぼうちょうべん;bouchouben
+いんぼう;inbou
+むほん;muhon
+ぼうりゃく;bouryaku
+じゅんぼく;junboku
+そぼく;soboku
+ほうのき;hounoki
+こうぼく;kouboku
+どぼく;doboku
+ぼくら;bokura
+ひつぼく;hitsuboku
+はくぼく;hakuboku
+すみえ;sumie
+だぼく;daboku
+すもう;sumou
+ぼくさつ;bokusatsu
+ぼっしゅう;bosshuu
+にちぼつ;nichibotsu
+ぼつご;botsugo
+そとぼり;sotobori
+つりぼり;tsuribori
+ほりかわ;horikawa
+ほんそう;honsou
+ほんぽう;honpou
+しゅっぽん;shuppon
+ほんやくか;hon_yakuka
+ほんい;hon_i
+ひるがえって;hirugaette
+へいぼん;heibon
+ぼんせん;bonsen
+はんれい;hanrei
+ぼんち;bonchi
+ぼんおどり;bon_odori
+ぼんけい;bonkei
+まふ;mafu
+まやく;mayaku
+あさづな;asaduna
+まてんろう;matenrou
+まさつ;masatsu
+まさつおん;masatsuon
+けんま;kenma
+まめつ;mametsu
+くつみがき;kutsumigaki
+あくま;akuma
+まほう;mahou
+まら;mara
+まいそう;maisou
+うめたて;umetate
+うもれぎ;umoregi
+こまく;komaku
+もうまく;moumaku
+まくしつ;makushitsu
+または;mataha
+またとない;matatonai
+またがし;matagashi
+まっさつ;massatsu
+まっちゃ;maccha
+いちまつ;ichimatsu
+たいまん;taiman
+じまん;jiman
+まんせい;mansei
+まんが;manga
+さんまん;sanman
+そぞろごと;sozorogoto
+みりょく;miryoku
+みわく;miwaku
+みりょう;miryou
+こうかく;koukaku
+こうわん;kouwan
+コッドみさき;koddomisaki
+みょうあん;myouan
+びみょう;bimyou
+きみょう;kimyou
+ふみんしょう;fuminshou
+ねむけ;nemuke
+いねむり;inemuri
+ぼうげき;bougeki
+ほこさき;hokosaki
+むじゅんした;mujunshita
+むちゅう;muchuu
+あくむ;akumu
+ゆめみる;yumemiru
+むてき;muteki
+のうむ;noumu
+あさぎり;asagiri
+こむすめ;komusume
+じょうしぐん;joushigun
+むすめざかり;musumezakari
+めいがら;meigara
+めいき;meiki
+めいめい;meimei
+ぜつめつ;zetsumetsu
+めつぼう;metsubou
+はめつ;hametsu
+めんじょ;menjo
+めんぜい;menzei
+ほうめん;houmen
+はんも;hanmo
+もりん;morin
+しげみ;shigemi
+ぼうげん;bougen
+もうそう;mousou
+かせいがん;kaseigan
+きげん;kigen
+はやおき;hayaoki
+きどうりょく;kidouryoku
+がっき;gakki
+きたい;kitai
+さいご;saigo
+らいきゃく;raikyaku
+じょうきゃく;joukyaku
+かくいん;kakuin
+けんきゅう;kenkyuu
+きゅうめい;kyuumei
+たんきゅう;tankyuu
+きゅうし;kyuushi
+きゅうそく;kyuusoku
+おおいそぎ;ooisogi
+しんきゅう;shinkyuu
+どうきゅうせい;doukyuusei
+じょうきゅう;joukyuu
+じんぐう;jinguu
+きゅうちゅう;kyuuchuu
+みやさま;miyasama
+きゅうぎ;kyuugi
+ちきゅう;chikyuu
+たまひろい;tamahiroi
+きょねん;kyonen
+かこ;kako
+たちさる;tachisaru
+てっきょう;tekkyou
+りっきょう;rikkyou
+いしばし;ishibashi
+さんぎょう;sangyou
+ざいごう;zaigou
+しわざ;shiwaza
+きょくせん;kyokusen
+さっきょく;sakkyoku
+まげもの;magemono
+きょくめん;kyokumen
+けっきょく;kekkyoku
+ゆうびんきょく;yuubinkyoku
+ぎんこう;ginkou
+ぎんが;ginga
+ぎんか;ginka
+くしん;kushin
+くつう;kutsuu
+にがみ;nigami
+ぐあい;guai
+ようぐ;yougu
+どうぐ;dougu
+ぼうくん;boukun
+さいくん;saikun
+やまだくん;yamadakun
+ふけい;fukei
+にいさま;niisama
+きょうだいあい;kyoudaiai
+かんけい;kankei
+けいそう;keisou
+かかりいん;kakariin
+けいしょく;keishoku
+けいはく;keihaku
+かるいし;karuishi
+けつえき;ketsueki
+はなぢ;hanadi
+けっとう;kettou
+かいけつ;kaiketsu
+けっしん;kesshin
+けつれつ;ketsuretsu
+けんしゅう;kenshuu
+とぎかわ;togikawa
+けんきゅうしゃ;kenkyuusha
+みえけん;mieken
+けんりつ;kenritsu
+けんちょう;kenchou
+はつげん;hatsugen
+むごん;mugon
+しゃこ;shako
+そうこ;souko
+れいぞうこ;reizouko
+とおわだこ;toowadako
+こがん;kogan
+こすい;kosui
+こうきょう;koukyou
+こうへい;kouhei
+きしゅうこう;kishuukou
+こうじょう;koujou
+いこう;ikou
+まえむき;maemuki
+こううん;kouun
+ふこう;fukou
+こうふく;koufuku
+くうこう;kuukou
+にゅうこう;nyuukou
+みなとまち;minatomachi
+ばんごう;bangou
+ごうれい;gourei
+ごうきゅう;goukyuu
+こんぽん;konpon
+だいこん;daikon
+やね;yane
+さいじつ;saijitsu
+さいだん;saidan
+ゆきまつり;yukimatsuri
+さいく;saiku
+ほそながい;hosonagai
+こまか;komaka
+しごと;shigoto
+しかた;shikata
+しくみ;shikumi
+したい;shitai
+しきょ;shikyo
+わかじに;wakajini
+しよう;shiyou
+たいし;taishi
+こづかい;kodukai
+しじゅう;shijuu
+しどうき;shidouki
+しはじめる;shihajimeru
+しじ;shiji
+おやゆび;oyayubi
+さしず;sashizu
+しこん;shikon
+はいしゃ;haisha
+はぐるま;haguruma
+しじん;shijin
+してき;shiteki
+しじょう;shijou
+さんじ;sanji
+しだい;shidai
+あいついで;aitsuide
+だいじ;daiji
+こうず;kouzu
+できごと;dekigoto
+じさん;jisan
+もちぬし;mochinushi
+ながもち;nagamochi
+しんしき;shinshiki
+ほうしき;houshiki
+かいかいしき;kaikaishiki
+じっこう;jikkou
+じじつ;jijitsu
+みいり;miiri
+しゃしん;shashin
+しゃじつ;shajitsu
+ふくしゃき;fukushaki
+さくしゃ;sakusha
+こうしゃ;kousha
+わかもの;wakamono
+しゅじん;shujin
+じぬし;jinushi
+しゅよう;shuyou
+ほしゅ;hoshu
+るすばん;rusuban
+こもり;komori
+しゅとく;shutoku
+とりだす;toridasu
+ぎゅうじる;gyuujiru
+いんしゅ;inshu
+さかば;sakaba
+さけのみ;sakenomi
+じゅけんしゃ;jukensha
+うけとり;uketori
+うけつけ;uketsuke
+ほんしゅう;honshuu
+さす;sasu
+しゅうぎかい;shuugikai
+しゅうしゅう;shuushuu
+ひろいもの;hiroimono
+じゅういち;juuichi
+しゅうてん;shuuten
+しゅうし;shuushi
+おわり;owari
+れんしゅう;renshuu
+しゅうじ;shuuji
+みならい;minarai
+せんしゅう;senshuu
+にしゅうめ;nishuume
+しゅうだん;shuudan
+へんしゅう;henshuu
+しゅうちゅう;shuuchuu
+じゅうしょ;juusho
+じゅうたく;juutaku
+すみて;sumite
+じゅうだい;juudai
+おもさ;omosa
+みえ;mie
+ばしょ;basho
+しょゆう;shoyuu
+いどころ;idokoro
+こくしょ;kokusho
+ひしょち;hishochi
+あつさ;atsusa
+じょしゅ;joshu
+じょりょく;joryoku
+たすけあい;tasukeai
+しょうわ;shouwa
+しょうしょう;shoushou
+しょうだい;shoudai
+しょうひ;shouhi
+けしゴム;keshigomu
+しょうかき;shoukaki
+しょうぎょう;shougyou
+しょうにん;shounin
+しょうばい;shoubai
+きしょう;kishou
+ぶんしょう;bunshou
+しょうく;shouku
+しょうり;shouri
+しょうぶ;shoubu
+かちき;kachiki
+じょうせん;jousen
+じょうすう;jousuu
+のりもの;norimono
+しょくぶつ;shokubutsu
+たうえ;taue
+しょくみんち;shokuminchi
+しんこく;shinkoku
+もうしこむ;moushikomu
+もうしわけ;moushiwake
+しんたい;shintai
+じしん;jishin
+みぶん;mibun
+せいしん;seishin
+しんぷ;shinpu
+めがみ;megami
+しんえん;shin_en
+しんかい;shinkai
+ふかいり;fukairi
+ぜんしん;zenshin
+しんか;shinka
+しんげん;shingen
+せいき;seiki
+せわ;sewa
+よのなか;yononaka
+せいり;seiri
+せいび;seibi
+びちょうせい;bichousei
+だっせん;dassen
+こうせん;kousen
+ちょくせん;chokusen
+ぜんぶ;zenbu
+ぜんしん;zenshin
+あんぜん;anzen
+ほうそう;housou
+そうきん;soukin
+みおくる;miokuru
+きゅうそく;kyuusoku
+ためいき;tameiki
+むすこ;musuko
+かぞく;kazoku
+みんぞく;minzoku
+しゅぞく;shuzoku
+たにん;tanin
+たこく;takoku
+よそ;yoso
+だしゃ;dasha
+だげき;dageki
+うちかえす;uchikaesu
+たいしょう;taishou
+ついく;tsuiku
+たいき;taiki
+しょうたい;shoutai
+まちぶせ;machibuse
+せだい;sedai
+こうたい;koutai
+へやだい;heyadai
+だいにか;dainika
+しだいしょ;shidaisho
+きゅうだい;kyuudai
+だいめい;daimei
+わだい;wadai
+せきたん;sekitan
+たんそ;tanso
+すみび;sumibi
+たんしょ;tansho
+たんき;tanki
+てみじか;temijika
+とうちゃく;touchaku
+きもの;kimono
+ふなつき;funatsuki
+ちゅうもく;chuumoku
+ちゅうしゃ;chuusha
+ちゅうしゃく;chuushaku
+ちゅうせき;chuuseki
+でんちゅう;denchuu
+つらら;tsurara
+ていねい;teinei
+ちょうめ;choume
+てちょう;techou
+ちょうば;chouba
+かや;kaya
+ちょうせい;chousei
+ちょうさ;chousa
+ちょうし;choushi
+ちょくせつ;chokusetsu
+しょうじき;shoujiki
+ちょくりつ;chokuritsu
+ついきゅう;tsuikyuu
+ついほう;tsuihou
+おいはらう;oiharau
+ていき;teiki
+ふてい;futei
+けってい;kettei
+かてい;katei
+ていえん;teien
+にわし;niwashi
+てっぱん;teppan
+ちかてつ;chikatetsu
+こくてつ;kokutetsu
+てんそう;tensou
+うんてん;unten
+とし;toshi
+しゅと;shuto
+つごう;tsugou
+ていど;teido
+おんど;ondo
+いちど;ichido
+とうしゅ;toushu
+とうひょう;touhyou
+なげだす;nagedasu
+れっとう;rettou
+とうみん;toumin
+しまぐに;shimaguni
+せんとう;sentou
+ゆげ;yuge
+ちゃのゆ;chanoyu
+とうじょう;toujou
+とざん;tozan
+きのぼり;kinobori
+いっとう;ittou
+じょうとう;joutou
+とうあつせん;touatsusen
+じどうしゃ;jidousha
+うごきだす;ugokidasu
+どうわ;douwa
+じどう;jidou
+どうしん;doushin
+ないぶ;naibu
+うちき;uchiki
+ばにく;baniku
+にくや;nikuya
+にくがん;nikugan
+のうじょう;noujou
+のうみん;noumin
+のうぎょう;nougyou
+しゅうは;shuuha
+おんぱ;onpa
+なみのり;naminori
+しんぱい;shinpai
+はいたつ;haitatsu
+くばりて;kubarite
+ちゃばたけ;chabatake
+たはた;tahata
+むぎばたけ;mugibatake
+はっぴょう;happyou
+ほっそく;hossoku
+はつでんき;hatsudenki
+はんおう;han_ou
+はんかく;hankaku
+たんもの;tanmono
+きゅうはん;kyuuhan
+さかみち;sakamichi
+くだりざか;kudarizaka
+こくばん;kokuban
+いたがみ;itagami
+いたまえ;itamae
+ひふ;hifu
+ひにく;hiniku
+きのかわ;kinokawa
+ひげき;higeki
+ひめい;himei
+かなしさ;kanashisa
+びじん;bijin
+びじゅつ;bijutsu
+びがく;bigaku
+びおん;bion
+はなさき;hanasaki
+はなぐすり;hanagusuri
+ひょうげん;hyougen
+ひょうてん;hyouten
+こおりみず;koorimizu
+ひょうめん;hyoumen
+ひょうげん;hyougen
+じこくひょう;jikokuhyou
+にびょう;nibyou
+びょうしん;byoushin
+びょうそく;byousoku
+びょうき;byouki
+びょうにん;byounin
+らいびょう;raibyou
+しょうひん;shouhin
+ひんしつ;hinshitsu
+しなもの;shinamono
+ふしょう;fushou
+ふたん;futan
+まけぎらい;makegirai
+ぶぶん;bubun
+ぶぞく;buzoku
+ふくそう;fukusou
+ふくじゅう;fukujuu
+はっとり;hattori
+こうふく;koufuku
+ふくびき;fukubiki
+ふくいんしょ;fukuinsho
+じんぶつ;jinbutsu
+しょくもつ;shokumotsu
+たべもの;tabemono
+へいき;heiki
+びょうどう;byoudou
+ひらて;hirate
+へんじ;henji
+へんさい;hensai
+しかえし;shikaeshi
+きんべん;kinben
+べんがく;bengaku
+かいほう;kaihou
+ほうしゃ;housha
+てばなす;tebanasu
+ごまん;goman
+ばんじ;banji
+まんねんひつ;mannenhitsu
+いみ;imi
+きょうみ;kyoumi
+あじみ;ajimi
+めいれい;meirei
+せいめい;seimei
+いのちとり;inochitori
+がいめん;gaimen
+かめん;kamen
+はなづら;hanadura
+しつもん;shitsumon
+がくもん;gakumon
+とんや;ton_ya
+やくしゃ;yakusha
+へいえき;heieki
+やっきょく;yakkyoku
+かやく;kayaku
+くすりゆび;kusuriyubi
+ゆらい;yurai
+りゆう;riyuu
+じゆう;jiyuu
+ゆでん;yuden
+とうゆ;touyu
+あぶらえ;aburae
+しょゆうしゃ;shoyuusha
+うむ;umu
+ありがとう;arigatou
+ゆうらん;yuuran
+ゆさん;yusan
+あそびば;asobiba
+よやく;yoyaku
+よそう;yosou
+よてい;yotei
+せいようじん;seiyoujin
+たいせいよう;taiseiyou
+ようしょく;youshoku
+しんようじゅ;shin_youju
+はまき;hamaki
+はがき;hagaki
+ようきょく;youkyoku
+ようき;youki
+たいようけい;taiyoukei
+しよう;shiyou
+ありさま;arisama
+みなさま;minasama
+らっか;rakka
+おちば;ochiba
+おとしもの;otoshimono
+りゅうこう;ryuukou
+るふ;rufu
+ながれぎ;nagaregi
+りょこう;ryokou
+たびびと;tabibito
+りょひ;ryohi
+りょうほう;ryouhou
+りょうて;ryoute
+りょうがえ;ryougae
+じょうりょくじゅ;jouryokuju
+ろくしょう;rokushou
+みどりいろ;midoriiro
+しつれい;shitsurei
+れいふく;reifuku
+けいれい;keirei
+れっしゃ;ressha
+れつじ;retsuji
+ぜんれつ;zenretsu
+どうろ;douro
+せんろ;senro
+たびじ;tabiji
+へいわ;heiwa
+やまと;yamato
+わしょく;washoku
+あいじょう;aijou
+ぼせいあい;boseiai
+あいこくしゃ;aikokusha
+ていあん;teian
+あんがい;angai
+あんじょう;anjou
+いか;ika
+いがい;igai
+いふく;ifuku
+いるい;irui
+ころもがえ;koromogae
+ちい;chii
+がくい;gakui
+じゅうにぐらい;juunigurai
+しゅうい;shuui
+はんい;han_i
+かこいこむ;kakoikomu
+いいんかい;iinkai
+いにん;inin
+いたくきん;itakukin
+いえき;ieki
+いぶくろ;ibukuro
+いじゃく;ijaku
+いんさつ;insatsu
+いんばん;inban
+めじるし;mejirushi
+えいさい;eisai
+えいこく;eikoku
+えいご;eigo
+こうえい;kouei
+えいよう;eiyou
+はんえい;han_ei
+しょくえん;shokuen
+しおみず;shiomizu
+せいえんしょ;seiensho
+ちゅうおう;chuuou
+ちゅうおうぶ;chuuoubu
+ちゅうおうぐち;chuuouguchi
+におく;nioku
+じゅうおく;juuoku
+おくまんちょうじゃ;okumanchouja
+ぞうか;zouka
+さんか;sanka
+くわえざん;kuwaezan
+かもつせん;kamotsusen
+こうか;kouka
+ざっか;zakka
+かぜい;kazei
+かちょう;kachou
+だいにか;dainika
+はつが;hatsuga
+しんめ;shinme
+めばえる;mebaeru
+かいかく;kaikaku
+かいせい;kaisei
+あらためて;aratamete
+きかい;kikai
+きかい;kikai
+きかいか;kikaika
+そんがい;songai
+さつがい;satsugai
+ぼうがい;bougai
+かくえき;kakueki
+かっこく;kakkoku
+かくじ;kakuji
+じかく;jikaku
+めざめ;mezame
+おぼえがき;oboegaki
+かんせい;kansei
+みかん;mikan
+かんぜん;kanzen
+けいかん;keikan
+かんりょう;kanryou
+かんちょう;kanchou
+かんじ;kanji
+あっかん;akkan
+かんし;kanshi
+かんり;kanri
+きかん;kikan
+かんがっき;kangakki
+かんとう;kantou
+かんしん;kanshin
+せきのやま;sekinoyama
+かんこう;kankou
+かんさつ;kansatsu
+かんきゃく;kankyaku
+しがんしゃ;shigansha
+がんぼうてき;ganbouteki
+ねがいごと;negaigoto
+きぼう;kibou
+ききゅう;kikyuu
+きはく;kihaku
+きせつ;kisetsu
+しき;shiki
+きじょ;kijo
+きげん;kigen
+きこう;kikou
+にじゅうせいき;nijuuseiki
+きげき;kigeki
+かんき;kanki
+おおよろこび;ooyorokobi
+こっき;kokki
+はたもち;hatamochi
+かじき;kajiki
+きぐ;kigu
+しょっき;shokki
+きよう;kiyou
+きのう;kinou
+きかい;kikai
+はたおり;hataori
+ぎろん;giron
+かいぎ;kaigi
+ぎかい;gikai
+ようきゅう;youkyuu
+ついきゅう;tsuikyuu
+きゅうしょく;kyuushoku
+きゅうめいブイ;kyuumeibui
+きゅうえん;kyuuen
+すくいだす;sukuidasu
+きょうきゅう;kyoukyuu
+げっきゅう;gekkyuu
+きたまえ;kitamae
+きょしゅ;kyoshu
+せんきょ;senkyo
+いっきょ;ikkyo
+ぎょせん;gyosen
+りょうし;ryoushi
+ぎょぎょう;gyogyou
+きょうつう;kyoutsuu
+ともぐい;tomogui
+きょうさんしゅぎ;kyousanshugi
+きょうてい;kyoutei
+きょうりょく;kyouryoku
+きょうかい;kyoukai
+ぼうえんきょう;bouenkyou
+きょうだい;kyoudai
+てかがみ;tekagami
+きょうそう;kyousou
+けいば;keiba
+せりうり;seriuri
+ほっきょく;hokkyoku
+しごく;shigoku
+しょうきょく;shoukyoku
+くべつ;kubetsu
+ちく;chiku
+きたく;kitaku
+くうぐん;kuugun
+ぐんじん;gunjin
+べいこくぐん;beikokugun
+ぐんぶ;gunbu
+こおりやま;kooriyama
+わけぐん;wakegun
+げんけい;genkei
+おおがた;oogata
+てんけいてき;tenkeiteki
+こうけい;koukei
+けいき;keiki
+げいじゅつ;geijutsu
+しゅげい;shugei
+げいしゃ;geisha
+けっせきしゃ;kessekisha
+けってん;ketten
+かけめ;kakeme
+けっこん;kekkon
+けっか;kekka
+むすびめ;musubime
+けんせつ;kensetsu
+こんりゅう;konryuu
+たてもの;tatemono
+けんこう;kenkou
+けんぜん;kenzen
+けんぴつか;kenpitsuka
+しけん;shiken
+じっけん;jikken
+けいけん;keiken
+こたい;kotai
+きょうこ;kyouko
+かたまり;katamari
+せいこう;seikou
+こうざい;kouzai
+こうろう;kourou
+きこう;kikou
+こうほ;kouho
+そうろうぶん;souroubun
+こうくう;koukuu
+こうかい;koukai
+こうろ;kouro
+しょうこう;shoukou
+ふけんこう;fukenkou
+けんこうたい;kenkoutai
+こうこく;koukoku
+こうこく;koukoku
+こうこく;koukoku
+じしょ;jisho
+じしょく;jishoku
+しゅうじがく;shuujigaku
+しっぱい;shippai
+しっけい;shikkei
+しつぎょう;shitsugyou
+しゃっきん;shakkin
+しゃくや;shakuya
+かりぬし;karinushi
+いっしゅ;isshu
+じんしゅ;jinshu
+たねなし;tanenashi
+しゅうへん;shuuhen
+しゅうとう;shuutou
+いっしゅう;isshuu
+やどや;yadoya
+げしゅくにん;geshukunin
+じゅんじょ;junjo
+じゅうじゅん;juujun
+じゅんちょう;junchou
+はじめて;hajimete
+はつこい;hatsukoi
+ていしょう;teishou
+がっしょう;gasshou
+となえね;tonaene
+ねんしょう;nenshou
+やけあと;yakeato
+やきたて;yakitate
+さんしょう;sanshou
+たいしょう;taishou
+しょうめい;shoumei
+しょうひん;shouhin
+しょうさん;shousan
+いっとうしょう;ittoushou
+しんか;shinka
+しんみん;shinmin
+だいじん;daijin
+しんよう;shin_you
+めいしん;meishin
+かくしん;kakushin
+しんじつ;shinjitsu
+しゃしんき;shashinki
+まっしろ;masshiro
+せいぶん;seibun
+せいじん;seijin
+なりたち;naritachi
+はんせい;hansei
+しょうりゃく;shouryaku
+こうせいしょう;kouseishou
+せいけつ;seiketsu
+せいじょう;seijou
+しみず;shimizu
+せいりょく;seiryoku
+おおぜい;oozei
+いきおいよく;ikioiyoku
+せいし;seishi
+しずけさ;shizukesa
+じょうみゃく;joumyaku
+しゅっせき;shusseki
+けっせき;kesseki
+くうせき;kuuseki
+めんせき;menseki
+せきせつ;sekisetsu
+くっせつ;kussetsu
+おりめ;orime
+おりがみ;origami
+ちょうせつ;chousetsu
+かんせつ;kansetsu
+ふしあな;fushiana
+せつめい;setsumei
+しょうせつ;shousetsu
+がくせつ;gakusetsu
+せんぱく;senpaku
+あさせ;asase
+あさぎ;asagi
+たいせん;taisen
+せんじょう;senjou
+さくせん;sakusen
+とうせん;tousen
+せんしゅ;senshu
+えらびだす;erabidasu
+とうぜん;touzen
+てんねん;tennen
+しかるべく;shikarubeku
+せんそう;sensou
+いいあらそい;iiarasoi
+きょうそうしゃ;kyousousha
+そうだん;soudan
+あいて;aite
+しゅしょう;shushou
+せんそう;sensou
+そうこう;soukou
+くらに;kurani
+ちゃくそう;chakusou
+りそう;risou
+あいそう;aisou
+ぞうげ;zouge
+いんしょう;inshou
+しょうちょうてき;shouchouteki
+そっき;sokki
+じそく;jisoku
+こうそくどうろ;kousokudouro
+そくめん;sokumen
+みぎがわ;migigawa
+そばづかえ;sobadukae
+ぞくぞく;zokuzoku
+れんぞく;renzoku
+てつづき;tetsuduki
+そつぎょう;sotsugyou
+へいそつ;heisotsu
+そっきょ;sokkyo
+しそん;shison
+まごびき;magobiki
+まごむすめ;magomusume
+ちたい;chitai
+おびじ;obiji
+ねったいぎょ;nettaigyo
+へいたい;heitai
+ぐんたい;guntai
+ぶたい;butai
+はったつ;hattatsu
+たつじん;tatsujin
+ひとたち;hitotachi
+たんい;tan_i
+たんじゅん;tanjun
+たんどく;tandoku
+そうだんやく;soudan_yaku
+かいだん;kaidan
+だんわ;danwa
+せいじ;seiji
+ちあん;chian
+ちりょう;chiryou
+ほうち;houchi
+おきもの;okimono
+おきば;okiba
+ちょきん;chokin
+ちょぞう;chozou
+ちょすいち;chosuichi
+ちょうせん;chousen
+ちょうえん;chouen
+だいちょう;daichou
+さいてい;saitei
+ていり;teiri
+ていらく;teiraku
+かいてい;kaitei
+おくそこ;okusoko
+ていりゅう;teiryuu
+ていし;teishi
+ていしゃじょ;teishajo
+ていでん;teiden
+もくてき;mokuteki
+りそうてき;risouteki
+まとはずれ;matohazure
+じてん;jiten
+てんきょ;tenkyo
+てんけい;tenkei
+でんせつ;densetsu
+でんき;denki
+でんせんびょう;densenbyou
+とほしゃ;tohosha
+あだばな;adabana
+どりょく;doryoku
+どりょくか;doryokuka
+つとめて;tsutomete
+とうだい;toudai
+でんとう;dentou
+とうせん;tousen
+しょくどう;shokudou
+どうどう;doudou
+ろうどう;roudou
+はたらきて;hatarakite
+はたらきもの;hatarakimono
+ゆうどく;yuudoku
+きのどく;kinodoku
+しょくちゅうどく;shokuchuudoku
+ねったい;nettai
+ねつりきがく;netsurikigaku
+ねんりき;nenriki
+ねんいり;nen_iri
+ねんぶつ;nenbutsu
+はいせん;haisen
+はいそう;haisou
+はいぼくしゅぎ;haibokushugi
+ごばい;gobai
+ばいか;baika
+ばいすう;baisuu
+はかせ;hakase
+ばくと;bakuto
+はくぶつかん;hakubutsukan
+ひるめし;hirumeshi
+いいだ;iida
+ひこうき;hikouki
+ひご;higo
+とびだす;tobidasu
+ひよう;hiyou
+しょうひしゃ;shouhisha
+せいかつひ;seikatsuhi
+ひつよう;hitsuyou
+ひっし;hisshi
+ひつぜん;hitsuzen
+えんぴつ;enpitsu
+ひっしゃ;hissha
+ふでづかい;fudedukai
+ひょうけつ;hyouketsu
+とうひょう;touhyou
+でんぴょう;denpyou
+ひょうじゅん;hyoujun
+りていひょう;riteihyou
+ひょうしき;hyoushiki
+ふめい;fumei
+ふへい;fuhei
+ぶきみ;bukimi
+にんぷ;ninpu
+ふじん;fujin
+ふうふ;fuufu
+ふちゃく;fuchaku
+つきあう;tsukiau
+なづける;nadukeru
+せいふ;seifu
+ふけん;fuken
+きょうとふ;kyoutofu
+ふくぎょう;fukugyou
+ふくし;fukushi
+ふくりょうじ;fukuryouji
+かふん;kafun
+こなごな;konagona
+むぎこ;mugiko
+へいし;heishi
+ほへい;hohei
+へいき;heiki
+べつめい;betsumei
+とくべつ;tokubetsu
+わかれ;wakare
+へんきょう;henkyou
+きんぺん;kinpen
+かわべ;kawabe
+へんせい;hensei
+たいへん;taihen
+かわりもの;kawarimono
+べんじょ;benjo
+ゆうびん;yuubin
+こづつみ;kodutsumi
+ほうい;houi
+つつみがみ;tsutsumigami
+ほうがく;hougaku
+ふほう;fuhou
+しつぼう;shitsubou
+がんぼう;ganbou
+ぼうけん;bouken
+ぼくじょう;bokujou
+ほうぼく;houboku
+まきばとり;makibatori
+しゅうまつ;shuumatsu
+すえっこ;suekko
+せいきまつ;seikimatsu
+まんげつ;mangetsu
+まんぞく;manzoku
+まんちょう;manchou
+みゃっかん;myakkan
+こうみゃく;koumyaku
+さんみゃく;sanmyaku
+こくみん;kokumin
+みんかん;minkan
+みんしゅしゅぎ;minshushugi
+やくそく;yakusoku
+せつやく;setsuyaku
+やくごじゅうにん;yakugojuunin
+ゆうしゃ;yuusha
+ゆうき;yuuki
+いさみあし;isamiashi
+ふひつよう;fuhitsuyou
+ようてん;youten
+じゅうよう;juuyou
+ようせい;yousei
+えいようし;eiyoushi
+きょうよう;kyouyou
+よくしつ;yokushitsu
+にっこうよく;nikkouyoku
+みずあび;mizuabi
+りえき;rieki
+りよう;riyou
+ききめ;kikime
+りくぐん;rikugun
+じょうりく;jouriku
+たいりく;tairiku
+りょうしん;ryoushin
+かいりょう;kairyou
+よさ;yosa
+げんりょう;genryou
+りょうきん;ryoukin
+じゅうりょう;juuryou
+ぶんりょう;bunryou
+たいりょうせいさん;tairyouseisan
+しゃりん;sharin
+さんりんしゃ;sanrinsha
+わなげ;wanage
+しゅるい;shurui
+ぶんるい;bunrui
+るいじ;ruiji
+れいじょう;reijou
+めいれいほう;meireihou
+しれいかん;shireikan
+れいぞう;reizou
+れいせい;reisei
+ひえしょう;hieshou
+れいがい;reigai
+れいねん;reinen
+たとえば;tatoeba
+れきしか;rekishika
+けいれき;keireki
+へんれき;henreki
+れんらくせん;renrakusen
+れんじゅう;renjuu
+れんそう;rensou
+くんれん;kunren
+せんれん;senren
+ねりこ;neriko
+ろうじん;roujin
+ろうれん;rouren
+ろうれいねんきん;roureinenkin
+ろうどうしゃ;roudousha
+くろう;kurou
+ろうどうかんけい;roudoukankei
+きろく;kiroku
+じつろく;jitsuroku
+ろくおん;rokuon
+あつりょく;atsuryoku
+でんあつ;den_atsu
+あっとうてき;attouteki
+いじゅう;ijuu
+いみん;imin
+いどう;idou
+げんいん;gen_in
+しいん;shiin
+いんがかんけい;ingakankei
+えいぞく;eizoku
+えいじゅうしゃ;eijuusha
+けいえい;keiei
+えいぎょう;eigyou
+えいしょ;eisho
+えいせい;eisei
+しゅえい;shuei
+じえい;jiei
+ぼうえき;boueki
+えきしゃ;ekisha
+あんい;an_i
+ゆうえき;yuueki
+ますます;masumasu
+りえきはいとう;riekihaitou
+えきたい;ekitai
+えきか;ekika
+けつえきがた;ketsuekigata
+えんしゅつ;enshutsu
+しゅつえん;shutsuen
+えんぜつ;enzetsu
+おうとう;outou
+はんのう;hannou
+おうよう;ouyou
+おうふく;oufuku
+おうじ;ouji
+おうらい;ourai
+おんじん;onjin
+おんしらず;onshirazu
+おんがえし;ongaeshi
+かせつ;kasetsu
+かりに;karini
+けびょう;kebyou
+かち;kachi
+かかく;kakaku
+ぶっか;bukka
+せいか;seika
+くだもの;kudamono
+はたして;hatashite
+かこう;kakou
+ふぐ;fugu
+かば;kaba
+つうか;tsuuka
+かこけい;kakokei
+いいすぎ;iisugi
+がし;gashi
+ねんがじょう;nengajou
+しゅくがかい;shukugakai
+ふゆかい;fuyukai
+かいらく;kairaku
+かいかつ;kaikatsu
+かいせつ;kaisetsu
+りかい;rikai
+ぶんかい;bunkai
+しかく;shikaku
+せいかく;seikaku
+しょゆうかく;shoyuukaku
+せいかく;seikaku
+かくにん;kakunin
+かくじつ;kakujitsu
+きんがく;kingaku
+がくめん;gakumen
+ひたいぎわ;hitaigiwa
+かんこう;kankou
+にっかん;nikkan
+はっかん;hakkan
+かんせん;kansen
+かんぶ;kanbu
+かんじ;kanji
+かんれい;kanrei
+よなれた;yonareta
+かんげい;kangei
+かんらく;kanraku
+こうかん;koukan
+そうがんきょう;sougankyou
+にくがん;nikugan
+ちまなこ;chimanako
+きほん;kihon
+ききん;kikin
+きんし;kinshi
+きんえん;kin_en
+げんきん;genkin
+じく;jiku
+くぎり;kugiri
+もんく;monku
+くんよみ;kun_yomi
+くんれんし;kunrenshi
+きょうくんてき;kyoukunteki
+ぐんしゅう;gunshuu
+ぎょぐん;gyogun
+ぐんきょ;gunkyo
+けいざい;keizai
+けいせん;keisen
+けいか;keika
+けっぱく;keppaku
+けっぺき;keppeki
+いさぎよく;isagiyoku
+じけん;jiken
+ようけん;youken
+じょうけん;jouken
+りょけん;ryoken
+しょうけん;shouken
+ていきけん;teikiken
+けんあく;ken_aku
+ほけん;hoken
+けんそ;kenso
+けんとう;kentou
+たんけん;tanken
+けんさいん;kensain
+けんぷ;kenpu
+じんけん;jinken
+きぬもの;kinumono
+げんど;gendo
+げんかい;genkai
+むげん;mugen
+はつげん;hatsugen
+げんしょう;genshou
+げんじつ;genjitsu
+げんしょう;genshou
+かげん;kagen
+めべり;meberi
+こじ;koji
+こやまだし;koyamadashi
+こじん;kojin
+こせい;kosei
+いっこ;ikko
+べんごし;bengoshi
+ほご;hogo
+ごえい;goei
+こうか;kouka
+ゆうこう;yuukou
+ききめ;kikime
+ぶあつ;buatsu
+こうせい;kousei
+こうじょう;koujou
+こうち;kouchi
+こうさく;kousaku
+こううんき;kouunki
+こうぶつ;koubutsu
+こうせき;kouseki
+たんこう;tankou
+こうせい;kousei
+こころがまえ;kokorogamae
+こうぎ;kougi
+こうえん;kouen
+こうし;koushi
+こんけつ;konketsu
+こんらん;konran
+まぜもの;mazemono
+けんさ;kensa
+しんさ;shinsa
+さもん;samon
+さいせい;saisei
+さいかん;saikan
+さらいねん;sarainen
+さいなん;sainan
+さいがい;saigai
+かさい;kasai
+ごさい;gosai
+ふさい;fusai
+ひとづま;hitoduma
+さいよう;saiyou
+さいしゅう;saishuu
+さいしゅ;saishu
+じっさい;jissai
+まどぎわ;madogiwa
+そんざい;sonzai
+ざいりゅう;zairyuu
+ざいしょ;zaisho
+ざいさん;zaisan
+ざいだん;zaidan
+ざいせいてき;zaiseiteki
+はんざい;hanzai
+ざいあく;zaiaku
+つみぶかい;tsumibukai
+ざつだん;zatsudan
+ざつおん;zatsuon
+ぞうひょう;zouhyou
+さんぎょう;sangyou
+ようさん;yousan
+そらまめ;soramame
+さんそ;sanso
+さんせい;sansei
+えんさん;ensan
+さんせい;sansei
+さんびか;sanbika
+さんじ;sanji
+してん;shiten
+しじ;shiji
+してん;shiten
+いし;ishi
+しぼう;shibou
+ゆうし;yuushi
+きょうし;kyoushi
+しひょう;shihyou
+しだん;shidan
+しほん;shihon
+しりょう;shiryou
+しきん;shikin
+あんじ;anji
+てんじ;tenji
+しきょう;shikyou
+るいじひん;ruijihin
+えせ;ese
+にあう;niau
+こじ;koji
+しょうに;shouni
+じどうぶんがく;jidoubungaku
+じょうしき;joushiki
+いしき;ishiki
+ちしきじん;chishikijin
+ひんしつ;hinshitsu
+しちや;shichiya
+ひとじち;hitojichi
+しゅくしゃ;shukusha
+しゃえい;shaei
+いなかもの;inakamono
+しゃざい;shazai
+しゃれい;sharei
+かんしゃ;kansha
+じゅぎょう;jugyou
+じゅよ;juyo
+きょうじゅ;kyouju
+しゅうにゅう;shuunyuu
+しゅうえき;shuueki
+しゅうようりょく;shuuyouryoku
+しゅうり;shuuri
+しゅうせい;shuusei
+しゅうぎょう;shuugyou
+こうしゅう;koushuu
+たいしゅう;taishuu
+がっしゅうこく;gasshuukoku
+しゅくが;shukuga
+しゅくじ;shukuji
+いわいごと;iwaigoto
+ぜんじゅつ;zenjutsu
+じゅつご;jutsugo
+じょじゅつ;jojutsu
+ぎじゅつてき;gijutsuteki
+げいじゅつてき;geijutsuteki
+しゅじゅつ;shujutsu
+じゅんび;junbi
+すいじゅん;suijun
+じゅんけっしょう;junkesshou
+じょぶん;jobun
+じょれつ;joretsu
+じょすう;josuu
+じょきょ;jokyo
+めんじょ;menjo
+そうじ;souji
+しょうたい;shoutai
+しょうしゅう;shoushuu
+てまねく;temaneku
+しょうち;shouchi
+しょうにん;shounin
+けいしょうしゃ;keishousha
+しょうごう;shougou
+しょうさん;shousan
+めいしょう;meishou
+しょうにん;shounin
+ろんしょう;ronshou
+しょうめい;shoumei
+むじょうけん;mujouken
+じょうやく;jouyaku
+じょうてつ;joutetsu
+じょうたい;joutai
+げんじょう;genjou
+しょうたいじょう;shoutaijou
+ひじょう;hijou
+じょうれい;jourei
+にちじょう;nichijou
+どうじょう;doujou
+じょうせい;jousei
+なさけない;nasakenai
+しょっき;shokki
+そしきてき;soshikiteki
+おりもの;orimono
+しょくにん;shokunin
+しょくぎょう;shokugyou
+しょくいん;shokuin
+せいど;seido
+せいし;seishi
+きょうせい;kyousei
+だんせい;dansei
+せいてき;seiteki
+しょうぶん;shoubun
+ぎょうせい;gyousei
+せいじか;seijika
+ちゅうおうせいふ;chuuouseifu
+せいりょく;seiryoku
+せいみつ;seimitsu
+ぶしょう;bushou
+せいぞう;seizou
+せいせい;seisei
+にほんせい;nihonsei
+ぜいきん;zeikin
+ぜいむしょ;zeimusho
+しょとくぜい;shotokuzei
+せきにん;sekinin
+じせき;jiseki
+せきむ;sekimu
+せいせき;seiseki
+ぎょうせき;gyouseki
+ぼうせき;bouseki
+めんせつ;mensetsu
+せつぞく;setsuzoku
+つぎめ;tsugime
+せっち;secchi
+せっけい;sekkei
+せつりつ;setsuritsu
+ぜっせん;zessen
+したたらず;shitatarazu
+べんぜつ;benzetsu
+ぜつぼう;zetsubou
+ぜったいてき;zettaiteki
+たえず;taezu
+こぜに;kozeni
+きんせん;kinsen
+さいせん;saisen
+ぜんい;zen_i
+しんぜん;shinzen
+ぜんごさく;zengosaku
+そせん;sosen
+せんぞ;senzo
+そふぼ;sofubo
+げんそ;genso
+ようそ;youso
+すあし;suashi
+そうがく;sougaku
+そうごう;sougou
+そうりだいじん;souridaijin
+ぞうせん;zousen
+もくぞう;mokuzou
+じんぞう;jinzou
+そうぞう;souzou
+もくぞう;mokuzou
+げんぞう;genzou
+ぞうだい;zoudai
+ぞうぜい;zouzei
+ぞうふく;zoufuku
+きそくてき;kisokuteki
+ほうそく;housoku
+げんそく;gensoku
+そくてい;sokutei
+そくち;sokuchi
+はかりがたい;hakarigatai
+きんぞく;kinzoku
+ふぞく;fuzoku
+ぞくめい;zokumei
+そんしつ;sonshitsu
+そんがいだか;songaidaka
+いいそこない;iisokonai
+こうたい;koutai
+たいしょく;taishoku
+たいい;taii
+たいひ;taihi
+かしきん;kashikin
+かしや;kashiya
+たいど;taido
+たいせい;taisei
+わざわざ;wazawaza
+だんたい;dantai
+ふとん;futon
+だんけつ;danketsu
+せつだん;setsudan
+だんげん;dangen
+ことわりがき;kotowarigaki
+けんちく;kenchiku
+けんちくか;kenchikuka
+きずきなおす;kizukinaosu
+しゅちょう;shuchou
+かくちょう;kakuchou
+みはる;miharu
+ていしゅつ;teishutsu
+ぜんてい;zentei
+ちょうちん;chouchin
+ていど;teido
+かてい;katei
+ほどちかい;hodochikai
+てきとう;tekitou
+てきせい;tekisei
+てっき;tekki
+てきい;tekii
+むてき;muteki
+かたきうち;katakiuchi
+でんとう;dentou
+とうけい;toukei
+だいとうりょう;daitouryou
+どうぞう;douzou
+どうか;douka
+せいどう;seidou
+しどう;shidou
+しゅどうけん;shudouken
+でんどう;dendou
+とくちょう;tokuchou
+とくゆう;tokuyuu
+とくしょく;tokushoku
+とくてん;tokuten
+しょとく;shotoku
+ありうる;ariuru
+どうとく;doutoku
+とくぎ;tokugi
+とっくり;tokkuri
+どくえい;dokuei
+ひとりごと;hitorigoto
+どくりつ;dokuritsu
+にんめい;ninmei
+にんい;nin_i
+せきにんしゃ;sekininsha
+ねんりょう;nenryou
+ねんしょう;nenshou
+もえつく;moetsuku
+かのうせい;kanousei
+のうりょく;nouryoku
+のうめん;noumen
+はさん;hasan
+はそん;hason
+やぶれめ;yabureme
+はんにん;hannin
+はんい;han_i
+はんざいがく;hanzaigaku
+はんだん;handan
+はんじ;hanji
+はんこ;hanko
+しゅっぱんしゃ;shuppansha
+はんが;hanga
+はんけん;hanken
+ひれい;hirei
+ひかく;hikaku
+くらべもの;kurabemono
+ひりょう;hiryou
+ひまん;himan
+こえつち;koetsuchi
+ひにん;hinin
+ひごうりてき;higouriteki
+ひこう;hikou
+せつび;setsubi
+じゅんびちゅう;junbichuu
+そなえつけ;sonaetsuke
+いっぴょう;ippyou
+こめだわら;komedawara
+どひょう;dohyou
+ひょうか;hyouka
+ひょうばん;hyouban
+あくひょう;akuhyou
+ひんけつ;hinketsu
+ひんこん;hinkon
+びんぼうじん;binboujin
+はいふ;haifu
+もうふ;moufu
+ぬのじ;nunoji
+ふじん;fujin
+しゅふ;shufu
+ふちょう;fuchou
+ふゆう;fuyuu
+とみくじ;tomikuji
+ふじさん;fujisan
+ぶしどう;bushidou
+ぶき;buki
+むしゃ;musha
+ふっかつ;fukkatsu
+かいふく;kaifuku
+ちょうふく;choufuku
+ふくせい;fukusei
+ぶっきょう;bukkyou
+じょうぶつ;joubutsu
+のどぼとけ;nodobotoke
+へんしゅうしゃ;henshuusha
+へんせい;hensei
+あみもの;amimono
+べんとう;bentou
+べんろん;benron
+べんまく;benmaku
+かくほ;kakuho
+ほぞん;hozon
+せいめいほけん;seimeihoken
+ぼち;bochi
+ぼひょう;bohyou
+はかまいり;hakamairi
+ほうこく;houkoku
+でんぽう;denpou
+ほうしゅう;houshuu
+ほうさく;housaku
+ほうふ;houfu
+ほうまん;houman
+よぼう;yobou
+ぼうすい;bousui
+ぼうえい;bouei
+ぼうえきぎょう;bouekigyou
+ぼうえきふう;bouekifuu
+ぼうえきしゃ;bouekisha
+ぼうりょく;bouryoku
+ばくろ;bakuro
+あばれもの;abaremono
+みらい;mirai
+みち;michi
+まだまだ;madamada
+ぎむ;gimu
+じむしょ;jimusho
+しょくむ;shokumu
+むりょう;muryou
+ぶじ;buji
+めいろ;meiro
+めいむ;meimu
+まよいご;mayoigo
+もめん;momen
+わたげ;watage
+わたがし;watagashi
+ゆしゅつ;yushutsu
+ゆそう;yusou
+うんゆ;un_yu
+よぶん;yobun
+よけい;yokei
+ごじゅうあまり;gojuuamari
+よきん;yokin
+あずかりにん;azukarinin
+あずかりしょう;azukarishou
+びよういん;biyouin
+ないよう;naiyou
+けいようし;keiyoushi
+のうりつ;nouritsu
+とうそつ;tousotsu
+ぜいりつ;zeiritsu
+りゃくご;ryakugo
+りゃくせつ;ryakusetsu
+りゃくず;ryakuzu
+るすばん;rusuban
+とめがね;tomegane
+りょうじ;ryouji
+りょうど;ryoudo
+ようりょう;youryou
+いよう;iyou
+いじょう;ijou
+いじん;ijin
+いでん;iden
+いしつ;ishitsu
+ゆいごん;yuigon
+りょういき;ryouiki
+ちいき;chiiki
+くいき;kuiki
+いちまんえん;ichiman_en
+いっせん;issen
+にじゅういち;nijuuichi
+うちゅう;uchuu
+どうう;douu
+うちょうてん;uchouten
+うもう;umou
+はおり;haori
+いちわ;ichiwa
+えいがかん;eigakan
+はんえい;han_ei
+ゆうばえ;yuubae
+えんちょう;enchou
+えんき;enki
+のびのび;nobinobi
+えんがん;engan
+えんどう;endou
+えんせん;ensen
+かのう;kanou
+かけつ;kaketsu
+いうべき;iubeki
+じが;jiga
+わがまま;wagamama
+われわれ;wareware
+せっかい;sekkai
+はいいろ;haiiro
+かざんばい;kazanbai
+しがい;shigai
+かいどう;kaidou
+きゅうけつき;kyuuketsuki
+すいとる;suitoru
+きゅうそ;kyuuso
+なきむし;nakimushi
+なきだす;nakidasu
+ていきょう;teikyou
+ともまわり;tomomawari
+くよう;kuyou
+きょうぶ;kyoubu
+むなげ;munage
+どきょう;dokyou
+ぼうきょう;boukyou
+ごうし;goushi
+きょうど;kyoudo
+しゅっきん;shukkin
+きんべんせい;kinbensei
+つとめさき;tsutomesaki
+きんにく;kinniku
+すじみち;sujimichi
+すじがき;sujigaki
+かけい;kakei
+けいとう;keitou
+けいれつ;keiretsu
+ちょっけい;chokkei
+しょうけい;shoukei
+ちょくじょうけいこう;chokujoukeikou
+そんけい;sonkei
+けいご;keigo
+いけい;ikei
+けいかん;keikan
+けいこく;keikoku
+けいほう;keihou
+げきじょう;gekijou
+げきてき;gekiteki
+げきつう;gekitsuu
+けっきょじん;kekkyojin
+あなご;anago
+あなうめ;anaume
+けんぎょう;kengyou
+けんよう;ken_you
+しかねる;shikaneru
+けんり;kenri
+けんこう;kenkou
+ごんげ;gonge
+けんぽう;kenpou
+けんしょう;kenshou
+けんぺい;kenpei
+しげん;shigen
+げんせん;gensen
+げんじ;genji
+げんかく;genkaku
+げんぴ;genpi
+そうごん;sougon
+じこ;jiko
+ちき;chiki
+りこ;riko
+こきゅう;kokyuu
+てんこ;tenko
+よびもの;yobimono
+ごかい;gokai
+ごはん;gohan
+ごやく;goyaku
+こうごう;kougou
+こうひ;kouhi
+ごご;gogo
+こうい;koui
+こうだんし;koudanshi
+こうし;koushi
+こうこう;koukou
+ふこう;fukou
+こうたいし;koutaishi
+ほうおう;houou
+めいじてんのう;meijitennou
+こうよう;kouyou
+しんく;shinku
+こうちゃ;koucha
+こうう;kouu
+こうふく;koufuku
+のりおり;noriori
+こうてつ;koutetsu
+せいこうじょ;seikoujo
+はがねいろ;haganeiro
+じこく;jikoku
+こくいん;kokuin
+きざみめ;kizamime
+こくもつ;kokumotsu
+こくるい;kokurui
+こくそう;kokusou
+こっせつ;kossetsu
+ろうこつ;roukotsu
+ほねおる;honeoru
+こんなん;konnan
+こんく;konku
+こまらせる;komaraseru
+さきん;sakin
+じゃり;jari
+すなはま;sunahama
+ざせき;zaseki
+ざだんかい;zadankai
+ぎんざ;ginza
+けいざいがく;keizaigaku
+へんさい;hensai
+すまない;sumanai
+さいばん;saiban
+たちくず;tachikuzu
+たちかた;tachikata
+せいさく;seisaku
+たいさく;taisaku
+さくどうか;sakudouka
+さっし;sasshi
+にさつ;nisatsu
+たんざく;tanzaku
+しきゅう;shikyuu
+げし;geshi
+いたらない;itaranai
+しりつ;shiritsu
+わたしたち;watashitachi
+しじ;shiji
+しせい;shisei
+ようし;youshi
+すがたみ;sugatami
+しりょく;shiryoku
+しかく;shikaku
+どうし;doushi
+ことばがき;kotobagaki
+ほんし;honshi
+しゅうかんし;shuukanshi
+じしゃく;jishaku
+じき;jiki
+じりょく;jiryoku
+ちゅうしゃき;chuushaki
+いたおす;itaosu
+しゃげきじょう;shagekijou
+きしゃ;kisha
+すてご;sutego
+すておく;suteoku
+しゃくど;shakudo
+しゃくはち;shakuhachi
+せきち;sekichi
+かいしゃく;kaishaku
+しゃくほう;shakuhou
+しゃくめい;shakumei
+じゃくねん;jakunen
+もしくは;moshikuha
+わかもの;wakamono
+じゅよう;juyou
+ひつじゅひん;hitsujuhin
+じゅきゅう;jukyuu
+じゅし;jushi
+じゅりつ;juritsu
+じゅひ;juhi
+しゅうきょう;shuukyou
+そうけ;souke
+しゅうは;shuuha
+じょうじゅ;jouju
+について;nitsuite
+しゅうしょく;shuushoku
+じゅうぎょういん;juugyouin
+じゅうしゃ;juusha
+したがって;shitagatte
+じゅうせん;juusen
+ほうじゅう;houjuu
+たてがき;tategaki
+しゅくしょう;shukushou
+たんしゅく;tanshuku
+ちぢみどめ;chidimidome
+せいじゅく;seijuku
+はんじゅく;hanjuku
+じゅくれん;jukuren
+じゅんすい;junsui
+じゅんもう;junmou
+じゅんえき;jun_eki
+しょり;shori
+しょち;shochi
+しょしょ;shosho
+しょめい;shomei
+しょいん;shoin
+けいさつしょ;keisatsusho
+しょとう;shotou
+しょくん;shokun
+もろて;morote
+しょうらい;shourai
+しょうぐん;shougun
+まさに;masani
+くしょう;kushou
+わらいごえ;waraigoe
+えがお;egao
+ししょうしゃ;shishousha
+しょうがい;shougai
+きずつける;kizutsukeru
+しょうがい;shougai
+しょうじ;shouji
+さしさわる;sashisawaru
+じょうかまち;joukamachi
+ひめじじょう;himejijou
+しろあと;shiroato
+じょうき;jouki
+じょうりゅう;jouryuu
+むしあつい;mushiatsui
+ほうしん;houshin
+しんろ;shinro
+はりがね;harigane
+じんあい;jin_ai
+じんしゃ;jinsha
+におう;niou
+すいちょく;suichoku
+あまだれ;amadare
+たれかざり;tarekazari
+すいり;suiri
+すいせんしゃ;suisensha
+すいしんき;suishinki
+すんぽう;sunpou
+いっすん;issun
+すんぶん;sunbun
+ぜせい;zesei
+これら;korera
+せいしょ;seisho
+せいじん;seijin
+しんせい;shinsei
+せいい;seii
+せいじつ;seijitsu
+まことに;makotoni
+せんでん;senden
+せんこく;senkoku
+せんきょうし;senkyoushi
+せんもん;senmon
+せんよう;sen_you
+せんせい;sensei
+おんせんじょう;onsenjou
+せんすい;sensui
+ひせん;hisen
+せんれい;senrei
+てあらい;tearai
+せんしょく;senshoku
+そめもの;somemono
+しみこむ;shimikomu
+ばんそう;bansou
+そうがくどう;sougakudou
+そうじょう;soujou
+まどぐち;madoguchi
+でまど;demado
+どうそうかい;dousoukai
+そうぞう;souzou
+そうりつしゃ;souritsusha
+そうい;soui
+かそう;kasou
+そううん;souun
+こうそうびる;kousoubiru
+そうじゅうし;soujuushi
+せっそう;sessou
+あやつりにんぎょう;ayatsuriningyou
+ぞうしょ;zousho
+ぞうとく;zoutoku
+さかぐら;sakagura
+ぞうき;zouki
+ないぞう;naizou
+しんぞうがく;shinzougaku
+ぞくご;zokugo
+ぞっか;zokka
+ふうぞく;fuuzoku
+せいぞん;seizon
+ぞんじより;zonjiyori
+そんざいしゃ;sonzaisha
+そんちょう;sonchou
+そんのうか;sonnouka
+そんりょ;sonryo
+じたく;jitaku
+たくち;takuchi
+たんとう;tantou
+にないしょうにん;ninaishounin
+がくしゅうふたん;gakushuufutan
+たんち;tanchi
+たんきゅうしゃ;tankyuusha
+さぐりだす;saguridasu
+だんかい;dankai
+まわりかいだん;mawarikaidan
+てんらんかい;tenrankai
+てんぼう;tenbou
+とうぎ;tougi
+うちいる;uchiiru
+とうばつぐん;toubatsugun
+せいとう;seitou
+ろうどうとう;roudoutou
+とうは;touha
+さとう;satou
+とうい;toui
+とうぶん;toubun
+とどけしょ;todokesho
+とどけでる;todokederu
+ゆきとどく;yukitodoku
+なんみん;nanmin
+なんぎ;nangi
+みがたい;migatai
+にまんえん;niman_en
+にじゅう;nijuu
+にせん;nisen
+ぎゅうにゅう;gyuunyuu
+にゅうさん;nyuusan
+にゅうぼう;nyuubou
+にんしき;ninshiki
+にんか;ninka
+みとめいん;mitomein
+のうぜい;nouzei
+なや;naya
+すいとうぼ;suitoubo
+ずのう;zunou
+しゅのう;shunou
+のうしょうがい;noushougai
+はけん;haken
+たなかは;tanakaha
+れいはい;reihai
+はいぐ;haigu
+はいご;haigo
+せなか;senaka
+はいしん;haishin
+はいびょう;haibyou
+はいえん;haien
+はいぞう;haizou
+はいゆう;haiyuu
+はいく;haiku
+はいじん;haijin
+はんちょう;hanchou
+きゅうごはん;kyuugohan
+はんでん;handen
+ばんめし;banmeshi
+ばんか;banka
+こんばん;konban
+ひにん;hinin
+ひていご;hiteigo
+いなめない;inamenai
+ひはん;hihan
+ひひょう;hihyou
+ひじゅん;hijun
+ひみつ;himitsu
+ごくひ;gokuhi
+ひしょ;hisho
+ふくぶ;fukubu
+はらだち;haradachi
+ちゅうふく;chuufuku
+ふんき;funki
+ふんとう;funtou
+ふるいたつ;furuitatsu
+へいか;heika
+へいけん;heiken
+てんおうへいか;ten_ouheika
+へいてん;heiten
+へいこう;heikou
+しめだす;shimedasu
+だんぺん;danpen
+かたて;katate
+かたづける;katadukeru
+ほじょ;hojo
+ほじゅう;hojuu
+ほきょう;hokyou
+ほうせき;houseki
+ざいほう;zaihou
+こだから;kodakara
+ほうもん;houmon
+らいほうしゃ;raihousha
+たんぼう;tanbou
+しぼう;shibou
+もうじゃ;mouja
+ぼうめい;boumei
+ぼうきゃく;boukyaku
+ぼうおん;bouon
+わすれがち;wasuregachi
+しんぼう;shinbou
+ぼうぐらふ;bougurafu
+ぼうべに;boubeni
+いちまい;ichimai
+にまいじた;nimaijita
+にまいがい;nimaigai
+てんまく;tenmaku
+かいまく;kaimaku
+ばくふ;bakufu
+みつど;mitsudo
+みつゆ;mitsuyu
+めんみつ;menmitsu
+れんめい;renmei
+どうめい;doumei
+かめい;kamei
+もけい;mokei
+もしゃ;mosha
+きぼ;kibo
+やさき;yasaki
+やじるし;yajirushi
+いっし;isshi
+ほんやく;hon_yaku
+つうやく;tsuuyaku
+いいわけ;iiwake
+ゆうびん;yuubin
+ゆうそう;yuusou
+ゆうてい;yuutei
+ゆうしゅう;yuushuu
+ゆうせん;yuusen
+じょゆう;joyuu
+ようじ;youji
+おさなご;osanago
+ようひ;youhi
+ようすい;yousui
+ひつじかい;hitsujikai
+よくぼう;yokubou
+しょくよく;shokuyoku
+ものほしげ;monohoshige
+よくじつ;yokujitsu
+よくちょう;yokuchou
+よくよくねん;yokuyokunen
+らんぼう;ranbou
+はんらん;hanran
+みだれあし;midareashi
+らんおう;ran_ou
+さんらん;sanran
+なまたまご;namatamago
+ごらん;goran
+かいらん;kairan
+かんらん;kanran
+りめん;rimen
+うらけ;urake
+うらづける;uradukeru
+きりつ;kiritsu
+りちぎ;richigi
+りんじ;rinji
+りんかい;rinkai
+りんせき;rinseki
+めいろう;meirou
+ろうほう;rouhou
+ろうどくほう;roudokuhou
+ろんぶん;ronbun
+りろん;riron
+ろんり;ronri
+あねったい;anettai
+おうあ;oua
+ありゅう;aryuu
+ひあい;hiai
+あいか;aika
+もののあわれ;mononoaware
+あくしゅ;akushu
+にぎりや;nigiriya
+にぎりめし;nigirimeshi
+とりあつかい;toriatsukai
+こきつかう;kokitsukau
+きゃくあつかい;kyakuatsukai
+いらい;irai
+いぜん;izen
+えこじ;ekoji
+いりょく;iryoku
+いげん;igen
+おどしもんく;odoshimonku
+こうい;koui
+ためすじ;tamesuji
+しすぎる;shisugiru
+たいい;taii
+しょうい;shoui
+いかん;ikan
+いだい;idai
+いじん;ijin
+えらぶつ;erabutsu
+そうい;soui
+いはん;ihan
+いいちがい;iichigai
+いじ;iji
+いしん;ishin
+せんい;sen_i
+いもん;imon
+いあん;ian
+なぐさみもの;nagusamimono
+いど;ido
+けいいぎ;keiigi
+ぬきいと;nukiito
+いっぴん;ippin
+それや;soreya
+いっしゅつ;isshutsu
+さといも;satoimo
+いもがい;imogai
+やきいも;yakiimo
+こんいん;kon_in
+いんせき;inseki
+いんぞくばつ;inzokubatsu
+いんき;inki
+いんぶ;inbu
+かげぐち;kageguchi
+いんきょ;inkyo
+いんじゃ;inja
+かくれが;kakurega
+いんぶん;inbun
+いんりつ;inritsu
+おんいん;on_in
+えいか;eika
+えいそう;eisou
+えいし;eishi
+えいきょう;eikyou
+えいぞう;eizou
+かげむしゃ;kagemusha
+えいり;eiri
+えいかく;eikaku
+せいえい;seiei
+ぼうえき;boueki
+あくえき;akueki
+やくびょう;yakubyou
+きえつ;kietsu
+えつらく;etsuraku
+まんえつ;man_etsu
+ゆうえつ;yuuetsu
+えっきょう;ekkyou
+おいこす;oikosu
+はいえつ;haietsu
+えっけん;ekken
+えっけんしつ;ekkenshitsu
+えっぺい;eppei
+けんえつ;ken_etsu
+えつらんしつ;etsuranshitsu
+かえん;kaen
+のうえん;nouen
+えんてん;enten
+えんかい;enkai
+えんらく;enraku
+しゅえん;shuen
+えんじょ;enjo
+おうえん;ouen
+せいえん;seien
+えんとつ;entotsu
+きんえん;kin_en
+たばこ;tabako
+るいじんえん;ruijin_en
+やえん;yaen
+さるまねや;sarumaneya
+あえん;aen
+こくえん;kokuen
+えんぴついれ;enpitsuire
+えんがわ;engawa
+ふちぬい;fuchinui
+えんだん;endan
+おせん;osen
+おしょく;oshoku
+よごれもの;yogoremono
+おうめん;oumen
+くぼち;kubochi
+へこみ;hekomi
+おうしゅう;oushuu
+おしいれ;oshiire
+ておしぐるま;teoshiguruma
+おうしゅう;oushuu
+おうべい;oubei
+おうしかん;oushikan
+おうだ;ouda
+なぐりこみ;nagurikomi
+なぐりあう;naguriau
+おうとう;outou
+さくらいろ;sakurairo
+さくらにく;sakuraniku
+ろうおう;rouou
+そんおう;son_ou
+げんおきな;gen_okina
+おくそこ;okusoko
+おくさま;okusama
+おくぎ;okugi
+きおく;kioku
+ついおく;tsuioku
+おくそく;okusoku
+ゆうぐ;yuugu
+ふぐ;fugu
+ぐびじんそう;gubijinsou
+おつしゅ;otsushu
+おとめ;otome
+おつに;otsuni
+おろしうり;oroshiuri
+おろししょう;oroshishou
+おろしだいこん;oroshidaikon
+おんわ;onwa
+おんとう;ontou
+へいおん;heion
+かじん;kajin
+ぜっか;zekka
+かさく;kasaku
+かどうきょう;kadoukyou
+しょか;shoka
+かくう;kakuu
+かび;kabi
+ちゅうか;chuuka
+はなばなしい;hanabanashii
+せいか;seika
+みずがし;mizugashi
+うずまき;uzumaki
+かせん;kasen
+かちゅう;kachuu
+はなよめ;hanayome
+かし;kashi
+てんか;tenka
+きゅうか;kyuuka
+よか;yoka
+ひまどる;himadoru
+かふく;kafuku
+さいか;saika
+かこん;kakon
+せいか;seika
+くつした;kutsushita
+ながぐつ;nagagutsu
+かもく;kamoku
+かふ;kafu
+かげん;kagen
+かじょうがき;kajougaki
+かしょ;kasho
+いっこ;ikko
+かぎょう;kagyou
+かせぎて;kasegite
+ともかせぎ;tomokasegi
+かばり;kabari
+ががんぼ;gaganbo
+かやりび;kayaribi
+ゆうが;yuuga
+がごう;gagou
+がしゅ;gashu
+きが;kiga
+がき;gaki
+がし;gashi
+かいにゅう;kainyuu
+かいかく;kaikaku
+じこしょうかい;jikoshoukai
+けいかい;keikai
+かいりつ;kairitsu
+かいぎょう;kaigyou
+かいだん;kaidan
+かいぶつ;kaibutsu
+あやしげ;ayashige
+かいたいしゃ;kaitaisha
+ゆうかい;yuukai
+かいじょう;kaijou
+こうかい;koukai
+くやしさ;kuyashisa
+くやみじょう;kuyamijou
+かいさい;kaisai
+かいむ;kaimu
+みなさま;minasama
+きんかい;kinkai
+かいこう;kaikou
+さんかい;sankai
+はかい;hakai
+かいめつ;kaimetsu
+かいけつびょう;kaiketsubyou
+かいちゅう;kaichuu
+ふところで;futokorode
+じゅっかい;jukkai
+だんがいしゃ;dangaisha
+だんがい;dangai
+がいそう;gaisou
+しょうがい;shougai
+さいがい;saigai
+てんがい;tengai
+がいたん;gaitan
+かんがい;kangai
+がいぜん;gaizen
+がいとう;gaitou
+とうがい;tougai
+がいはく;gaihaku
+がいねん;gainen
+がいりゃく;gairyaku
+たいがい;taigai
+かきね;kakine
+いけがき;ikegaki
+かいまみる;kaimamiru
+かくしん;kakushin
+けっかく;kekkaku
+かくへいき;kakuheiki
+かいがら;kaigara
+こうかく;koukaku
+ちかく;chikaku
+りんかく;rinkaku
+じょうかく;joukaku
+ゆうかく;yuukaku
+ひかく;hikaku
+こうりょう;kouryou
+たいこう;taikou
+かくり;kakuri
+かんかく;kankaku
+かくしゅう;kakushuu
+かくとく;kakutoku
+ぎょかく;gyokaku
+えもの;emono
+いかく;ikaku
+かくど;kakudo
+いかくてき;ikakuteki
+しゅうかく;shuukaku
+たかく;takaku
+しゅうかくだか;shuukakudaka
+さんがく;sangaku
+がくふ;gakufu
+うんぜんだけ;unzendake
+かかりびと;kakaribito
+みかけ;mikake
+こしかける;koshikakeru
+ひがた;higata
+せきこ;sekiko
+にいがたし;niigatashi
+いっかつ;ikkatsu
+かっこ;kakko
+ほうかつてき;houkatsuteki
+かっさい;kassai
+きょうかつ;kyoukatsu
+いっかつ;ikkatsu
+かっすい;kassui
+かつぼう;katsubou
+かわき;kawaki
+えんかつ;enkatsu
+かっそうろ;kassouro
+すべりやすい;suberiyasui
+かっしょく;kasshoku
+かったん;kattan
+かっぷ;kappu
+しょかつ;shokatsu
+かんかつ;kankatsu
+とうかつ;toukatsu
+かつまた;katsumata
+かつ;katsu
+こうしょ;kousho
+かりいれ;kariire
+かりこむ;karikomu
+くさかりき;kusakariki
+あまざけ;amazake
+かんげん;kangen
+あまえ;amae
+はっかん;hakkan
+かんがん;kangan
+あせみず;asemizu
+かんづめ;kandume
+かんきり;kankiri
+きかん;kikan
+かんぞう;kanzou
+かんじん;kanjin
+きもったま;kimottama
+おうかん;oukan
+えいかん;eikan
+かんもう;kanmou
+かんぼつ;kanbotsu
+けっかん;kekkan
+かんらく;kanraku
+かんでんち;kandenchi
+かんそうき;kansouki
+かわいた;kawaita
+かんべん;kanben
+かんじょう;kanjou
+かんちがい;kanchigai
+かんじゃ;kanja
+かんぶ;kanbu
+ながわずらい;nagawazurai
+かんつう;kantsuu
+じゅうかん;juukan
+かんりゅう;kanryuu
+かんもん;kanmon
+きょうかん;kyoukan
+わめきごえ;wamekigoe
+かんにん;kannin
+たんのう;tannou
+たえがたい;taegatai
+かんき;kanki
+かえぎ;kaegi
+こうかんがくせい;koukangakusei
+ゆうかん;yuukan
+かんぜん;kanzen
+あえなく;aenaku
+かんおけ;kan_oke
+せっかん;sekkan
+ひつぎだい;hitsugidai
+しゃっかん;shakkan
+らっかん;rakkan
+かんたい;kantai
+かんせい;kansei
+かんさん;kansan
+かんじん;kanjin
+かんだい;kandai
+かんよう;kan_you
+かんい;kan_i
+かんし;kanshi
+そうかん;soukan
+かんきん;kankin
+かんわ;kanwa
+かんりゅう;kanryuu
+ゆるゆる;yuruyuru
+いかん;ikan
+かんこん;kankon
+うらみ;urami
+かんげん;kangen
+せいかんしゃ;seikansha
+へんかん;henkan
+ゆびわ;yubiwa
+かんじょうせん;kanjousen
+かんきょう;kankyou
+ぐんかん;gunkan
+かんたい;kantai
+かんしゅ;kanshu
+ねんかん;nenkan
+かんしょう;kanshou
+かんがみて;kangamite
+ほうがん;hougan
+がんゆうりょう;gan_yuuryou
+ふくめて;fukumete
+がんこ;ganko
+がんけん;ganken
+きぎょう;kigyou
+きかく;kikaku
+くわだて;kuwadate
+きろ;kiro
+ぶんき;bunki
+たき;taki
+きちゅう;kichuu
+きんき;kinki
+いみきらう;imikirau
+きすう;kisuu
+しんき;shinki
+きけい;kikei
+きねん;kinen
+きとう;kitou
+いのりあう;inoriau
+きどう;kidou
+むきどう;mukidou
+じょうき;jouki
+きせい;kisei
+きこん;kikon
+きてい;kitei
+きかん;kikan
+うえじに;uejini
+きがこうしん;kigakoushin
+きかい;kikai
+きせき;kiseki
+おにごっこ;onigokko
+きかがく;kikagaku
+きし;kishi
+しょうぎ;shougi
+きてき;kiteki
+ほうき;houki
+きけん;kiken
+きじ;kiji
+こうき;kouki
+きせき;kiseki
+かがやき;kagayaki
+きし;kishi
+きへい;kihei
+いっきうち;ikkiuchi
+てきぎ;tekigi
+べんぎ;bengi
+よろしく;yoroshiku
+にせもの;nisemono
+ぎぜん;gizen
+いつわりもの;itsuwarimono
+さぎ;sagi
+ぎまん;giman
+あざむきとる;azamukitoru
+ぎしき;gishiki
+ぎてん;giten
+れいぎ;reigi
+ゆうぎてき;yuugiteki
+ぎが;giga
+たわごと;tawagoto
+もぎ;mogi
+ぎせい;gisei
+ぎせいご;giseigo
+ぎせい;gisei
+ぎだ;gida
+ぎせいせいど;giseiseido
+のぎく;nogiku
+きっか;kikka
+きくばん;kikuban
+きちにち;kichinichi
+きっぽう;kippou
+ふきつ;fukitsu
+きつえん;kitsuen
+きっすいせん;kissuisen
+きつもん;kitsumon
+つまり;tsumari
+つめこむ;tsumekomu
+きゃっか;kyakka
+たいきゃく;taikyaku
+さて;sate
+きゃっか;kyakka
+きゃたつ;kyatatsu
+あしに;ashini
+ぎゃくさつ;gyakusatsu
+ぎゃくたい;gyakutai
+ざんぎゃく;zangyaku
+きゅうだいてん;kyuudaiten
+ついきゅう;tsuikyuu
+およびごし;oyobigoshi
+さきゅう;sakyuu
+きゅうしん;kyuushin
+おかべ;okabe
+ろうきゅう;roukyuu
+ふきゅう;fukyuu
+くちば;kuchiba
+ふんきゅう;funkyuu
+きゅうだん;kyuudan
+きゅうめい;kyuumei
+きゅうきょく;kyuukyoku
+きゅうきょう;kyuukyou
+きゅうくつ;kyuukutsu
+きょじん;kyojin
+きょだい;kyodai
+きょひ;kyohi
+きょぜつ;kyozetsu
+きょひ;kyohi
+きょし;kyoshi
+こんきょ;konkyo
+しょうこ;shouko
+よりどころ;yoridokoro
+きょぎ;kyogi
+こくう;kokuu
+きょむしゅぎ;kyomushugi
+きょり;kyori
+きょこつ;kyokotsu
+そっきょぎ;sokkyogi
+ぎょしゃ;gyosha
+ごよう;goyou
+おんちゅう;onchuu
+きょうあく;kyouaku
+きょうさく;kyousaku
+きっきょう;kikkyou
+ぜっきょう;zekkyou
+さけびごえ;sakebigoe
+さけびだす;sakebidasu
+きょうじん;kyoujin
+きょうげん;kyougen
+くるった;kurutta
+きょうじゅしゃ;kyoujusha
+きょうゆう;kyouyuu
+きょうらく;kyouraku
+じょうきょう;joukyou
+じっきょう;jikkyou
+いわんや;iwan_ya
+きょうこく;kyoukoku
+ちきょう;chikyou
+かいきょう;kaikyou
+きょうげき;kyougeki
+いたばさみ;itabasami
+はさみむし;hasamimushi
+きょうぎ;kyougi
+こうきょう;koukyou
+せまくるしい;semakurushii
+きょうふ;kyoufu
+きょうえいびょう;kyoueibyou
+おそれいる;osoreiru
+きょうじゅん;kyoujun
+きょうけい;kyoukei
+きょうけん;kyouken
+きょうはく;kyouhaku
+きょうい;kyoui
+おどかして;odokashite
+きょうせいてき;kyouseiteki
+ききょう;kikyou
+ためなおす;tamenaosu
+ひびきわたる;hibikiwataru
+あくえいきょう;akueikyou
+こうきょうきょく;koukyoukyoku
+きょうい;kyoui
+きょうがく;kyougaku
+おどろくべき;odorokubeki
+ぎょうてん;gyouten
+しんこう;shinkou
+おおせだす;oosedasu
+ぎょうてん;gyouten
+つうぎょう;tsuugyou
+ぎょうせい;gyousei
+ぎょうし;gyoushi
+こりしょう;korishou
+こった;kotta
+きんりょう;kinryou
+きんめ;kinme
+ふきん;fukin
+さいきん;saikin
+きんるい;kinrui
+ほきんしゃ;hokinsha
+てふうきん;tefuukin
+きんせん;kinsen
+ことづめ;kotodume
+きんちょう;kinchou
+きんきゅう;kinkyuu
+きんみつ;kinmitsu
+きんげん;kingen
+きんけい;kinkei
+つつしんで;tsutsushinde
+きょうきん;kyoukin
+きんど;kindo
+えりくび;erikubi
+ぎんえい;gin_ei
+ぎんみ;ginmi
+ぎんゆうしじん;gin_yuushijin
+せんくしゃ;senkusha
+かりだす;karidasu
+かけおち;kakeochi
+ぐじん;gujin
+ぐずる;guzuru
+ぐこう;gukou
+ぐうぜん;guuzen
+ぐうぞう;guuzou
+はいぐうしゃ;haiguusha
+きぐう;kiguu
+たいぐう;taiguu
+ふぐう;fuguu
+いちぐう;ichiguu
+すみいし;sumiishi
+かたすみ;katasumi
+くっぷく;kuppuku
+ふくつ;fukutsu
+くっせつ;kussetsu
+はっくつ;hakkutsu
+ほりだす;horidasu
+さいくつ;saikutsu
+くりいと;kuriito
+くりこす;kurikosu
+くりかえす;kurikaesu
+くんしょう;kunshou
+しゅくん;shukun
+くんい;kun_i
+くんこう;kunkou
+くんいく;kun_iku
+くんぷう;kunpuu
+しょけい;shokei
+しけい;shikei
+けいじ;keiji
+きゅうけい;kyuukei
+ちかけい;chikakei
+はぐき;haguki
+けいやく;keiyaku
+けいき;keiki
+けいいん;keiin
+けいよ;keiyo
+ちえ;chie
+めぐみぶかい;megumibukai
+けいはつ;keihatsu
+けいじ;keiji
+はいけい;haikei
+けいじばん;keijiban
+ぜんけい;zenkei
+けいよう;keiyou
+けいこく;keikoku
+せっけい;sekkei
+けいりゅう;keiryuu
+けいこう;keikou
+けいせつ;keisetsu
+ほたるがり;hotarugari
+けいこう;keikou
+けいとう;keitou
+けいしゃど;keishado
+けいたい;keitai
+ていけい;teikei
+ひっけい;hikkei
+けいぞく;keizoku
+ままこ;mamako
+つぎたし;tsugitashi
+けいしゅく;keishuku
+けいじ;keiji
+けいが;keiga
+きゅうけい;kyuukei
+しょうけい;shoukei
+いこい;ikoi
+けいらん;keiran
+けいしゃ;keisha
+けいめい;keimei
+かんげいかい;kangeikai
+げいごう;geigou
+むかえざけ;mukaezake
+げいゆ;geiyu
+ほげい;hogei
+ざとうくじら;zatoukujira
+そげき;sogeki
+こうげき;kougeki
+はやうち;hayauchi
+かんげき;kangeki
+げっか;gekka
+はげしさ;hageshisa
+けっし;kesshi
+けっしゅつ;kesshutsu
+けっさく;kessaku
+けんしょう;kenshou
+ひけん;hiken
+かたがき;katagaki
+けんやく;ken_yaku
+せっけん;sekken
+きんけん;kinken
+けんどう;kendou
+けんぶ;kenbu
+たんけん;tanken
+いっけん;ikken
+けんとう;kentou
+のきさき;nokisaki
+せいそうけん;seisouken
+けんがい;kengai
+きょうさんけん;kyousanken
+けんじつ;kenjitsu
+けんご;kengo
+ちゅうけん;chuuken
+けんお;ken_o
+きげん;kigen
+いやいや;iyaiya
+けんじょう;kenjou
+こんだて;kondate
+けんしん;kenshin
+はけん;haken
+こづかい;kodukai
+やりなおす;yarinaosu
+けんじゃ;kenja
+けんめい;kenmei
+かしこだて;kashikodate
+けんそん;kenson
+けんきょ;kenkyo
+けんじょう;kenjou
+けんちゅう;kenchuu
+おおまゆ;oomayu
+からまゆ;karamayu
+けんちょ;kencho
+けんよう;ken_you
+けんびきょう;kenbikyou
+けんめい;kenmei
+けねん;kenen
+いのちがけ;inochigake
+げんそう;gensou
+げんぞう;genzou
+げんじゅつ;genjutsu
+げんみょう;genmyou
+げんかん;genkan
+くろうと;kurouto
+せいげん;seigen
+ゆみづる;yumiduru
+げんがっき;gengakki
+こじいん;kojiin
+こどく;kodoku
+こりつ;koritsu
+こけい;kokei
+こじょう;kojou
+ことう;kotou
+こし;koshi
+ふゆがれ;fuyugare
+かれは;kareha
+こよう;koyou
+やといにん;yatoinin
+かいこ;kaiko
+こだい;kodai
+こじ;koji
+ほこりがお;hokorigao
+こどう;kodou
+たいこ;taiko
+こつづみ;kotsudumi
+こりょ;koryo
+かいこ;kaiko
+こもん;komon
+そうご;sougo
+ごじょ;gojo
+たがいちがい;tagaichigai
+ごふく;gofuku
+くれぐれも;kureguremo
+くれて;kurete
+ごらく;goraku
+かんご;kango
+ごらくひん;gorakuhin
+ごせい;gosei
+かくご;kakugo
+さとり;satori
+ごいし;goishi
+ごばん;goban
+ごうち;gouchi
+びこう;bikou
+きこう;kikou
+こうし;koushi
+ぎこう;gikou
+こうげん;kougen
+せいこう;seikou
+こうちゅう;kouchuu
+こうしゅ;koushu
+かんだかい;kandakai
+いりえ;irie
+こうこ;kouko
+えど;edo
+たんこう;tankou
+こうふ;koufu
+たいこう;taikou
+こうぎ;kougi
+こうそう;kousou
+こうげきしゃ;kougekisha
+せんこう;senkou
+せめいる;semeiru
+こうしん;koushin
+いまさら;imasara
+よふけ;yofuke
+こうそく;kousoku
+こういん;kouin
+かかわらず;kakawarazu
+しゅこう;shukou
+こうてい;koutei
+こうけい;koukei
+こうじょう;koujou
+こうきゅう;koukyuu
+こうれい;kourei
+こうずい;kouzui
+こうせきそう;kousekisou
+こうだい;koudai
+こうてん;kouten
+あれち;arechi
+あらなみ;aranami
+こうがい;kougai
+きんこう;kinkou
+こうや;kouya
+こうすい;kousui
+こうき;kouki
+いろか;iroka
+こうしゃく;koushaku
+おおたこう;ootakou
+おうこう;oukou
+こうけん;kouken
+ねんぐ;nengu
+みつぎもの;mitsugimono
+ひかえじょ;hikaejo
+こうそ;kouso
+ひかえがき;hikaegaki
+きょうこう;kyoukou
+おおあわて;ooawate
+あわてもの;awatemono
+こうか;kouka
+こうか;kouka
+こうすい;kousui
+こうしゅだい;koushudai
+しめころす;shimekorosu
+しぼりだす;shiboridasu
+こうもく;koumoku
+じこう;jikou
+じょうこう;joukou
+げすいこう;gesuikou
+みぞきり;mizokiri
+どぶねずみ;dobunezumi
+ようこう;youkou
+たいこう;taikou
+つなびき;tsunabiki
+こうぼ;koubo
+こうそ;kouso
+はっこう;hakkou
+げんこう;genkou
+とうこう;toukou
+そうこう;soukou
+きんこう;kinkou
+へいこう;heikou
+こうき;kouki
+こうにゅう;kounyuu
+こうばい;koubai
+こうどく;koudoku
+ごうもん;goumon
+ごうせき;gouseki
+ごうもんだい;goumondai
+ごうけん;gouken
+ごうもう;goumou
+ごうちょく;gouchoku
+ごうう;gouu
+ごうそう;gousou
+ごうしゅう;goushuu
+こくふく;kokufuku
+こっき;kokki
+こくめい;kokumei
+こくし;kokushi
+ざんこく;zankoku
+こくしょ;kokusho
+ごくもん;gokumon
+じごく;jigoku
+ぎごく;gigoku
+みこみ;mikomi
+ひとごみ;hitogomi
+こめもの;komemono
+こんちゅう;konchuu
+こんぶ;konbu
+こうこん;koukon
+かいこん;kaikon
+いこん;ikon
+うらみごと;uramigoto
+こんやく;kon_yaku
+けっこんしき;kekkonshiki
+しんこんふうふ;shinkonfuufu
+こんいろ;kon_iro
+こんや;kon_ya
+のうこん;noukon
+れいこん;reikon
+しょうこん;shoukon
+たまげる;tamageru
+かいこん;kaikon
+こんでん;konden
+みかいこんち;mikaikonchi
+こんだん;kondan
+こんがん;kongan
+こんい;kon_i
+ほさ;hosa
+さかん;sakan
+たいさ;taisa
+しさ;shisa
+きょうさ;kyousa
+きょうさしゃ;kyousasha
+さぎし;sagishi
+さしゅ;sashu
+さしょう;sashou
+さこく;sakoku
+れんさ;rensa
+くさりどめ;kusaridome
+さいひょうせん;saihyousen
+さいへん;saihen
+くだけた;kudaketa
+しゅさいしゃ;shusaisha
+さいりょう;sairyou
+さいしょう;saishou
+さいばい;saibai
+ぼんさい;bonsai
+せんざい;senzai
+しきさい;shikisai
+たんさい;tansai
+さいうん;saiun
+さいかい;saikai
+しょさい;shosai
+けっさい;kessai
+さいむ;saimu
+さいけん;saiken
+さいけんしゃ;saikensha
+しゅさい;shusai
+さいそく;saisoku
+さいみん;saimin
+にさい;nisai
+さいひ;saihi
+せいぼ;seibo
+せきさい;sekisai
+けいさい;keisai
+きさい;kisai
+やくざいし;yakuzaishi
+やくざい;yakuzai
+かんげざい;kangezai
+ながさき;nagasaki
+しまざき;shimazaki
+きく;kiku
+さくじょ;sakujo
+さくげん;sakugen
+けずりとる;kezuritoru
+さくいん;sakuin
+しさく;shisaku
+てっさく;tessaku
+さくさん;sakusan
+すのもの;sunomono
+すづけ;suduke
+さくしゅ;sakushu
+あっさく;assaku
+しぼりとる;shiboritoru
+さくご;sakugo
+さっかく;sakkaku
+とうさく;tousaku
+しきざき;shikizaki
+おそざき;osozaki
+さきのこる;sakinokoru
+さついれ;satsuire
+なふだ;nafuda
+せんえんさつ;sen_ensatsu
+さつえい;satsuei
+とりなおす;torinaosu
+つまみぐい;tsumamigui
+さっかしょう;sakkashou
+すれちがう;surechigau
+すりこむ;surikomu
+はいざら;haizara
+おおざら;oozara
+さらあらい;saraarai
+さんばし;sanbashi
+さじき;sajiki
+さんどう;sandou
+さんげき;sangeki
+ざんさつ;zansatsu
+ひさん;hisan
+さんか;sanka
+あまがさ;amagasa
+ひがさ;higasa
+ざんていてき;zanteiteki
+ざんじ;zanji
+しばらくして;shibarakushite
+ようし;youshi
+しゅし;shushi
+うまうまと;umaumato
+うかがいごと;ukagaigoto
+しこう;shikou
+うかがいさぐる;ukagaisaguru
+めいし;meishi
+さしみ;sashimi
+とげぬき;togenuki
+したい;shitai
+えだづの;edaduno
+かれえだ;kareeda
+しふく;shifuku
+ふくし;fukushi
+ふくしこっか;fukushikokka
+したい;shitai
+かし;kashi
+せんたくし;sentakushi
+しせつ;shisetsu
+じっし;jisshi
+せやく;seyaku
+しぼう;shibou
+あぶらけ;aburake
+やにめ;yanime
+しえん;shien
+むらさきいろ;murasakiiro
+しがいせん;shigaisen
+しし;shishi
+こうし;koushi
+こうし;koushi
+しいく;shiiku
+かいぬし;kainushi
+かいいぬ;kaiinu
+しゆう;shiyuu
+めうし;meushi
+めいぬ;meinu
+しか;shika
+おんし;onshi
+たまもの;tamamono
+しじゅん;shijun
+しもん;shimon
+しもんきかん;shimonkikan
+じじゅう;jijuu
+じじょ;jijo
+じそう;jisou
+じよう;jiyou
+じみ;jimi
+じう;jiu
+じひ;jihi
+じぜん;jizen
+じあい;jiai
+ぎょじ;gyoji
+こくじ;kokuji
+いんじ;inji
+しゃじく;shajiku
+ちじく;chijiku
+じくもの;jikumono
+しっかん;shikkan
+しっそう;shissou
+とっくに;tokkuni
+しっぴつ;shippitsu
+しゅうねん;shuunen
+とりなす;torinasu
+しつど;shitsudo
+しっち;shicchi
+しめっぽい;shimeppoi
+しっき;shikki
+しっこく;shikkoku
+うるしぬり;urushinuri
+しばふ;shibafu
+しばい;shibai
+しばかりき;shibakariki
+ようしゃ;yousha
+しゃめん;shamen
+おんしゃ;onsha
+しゃめん;shamen
+しゃほうけい;shahoukei
+ななめつぎ;nanametsugi
+しゃふつ;shafutsu
+なまにえ;namanie
+にたてる;nitateru
+しゃにむに;shanimuni
+しゃこうまく;shakoumaku
+しゃだんき;shadanki
+じゃあく;jaaku
+むじゃき;mujaki
+かぜ;kaze
+じゃかん;jakan
+だこう;dakou
+へびかわ;hebikawa
+いっしゃく;isshaku
+さんしゃく;sanshaku
+じっしゃく;jisshaku
+しゃくふ;shakufu
+ばんしゃく;banshaku
+しゃくりょう;shakuryou
+しゃくい;shakui
+じゅしゃく;jushaku
+だんしゃく;danshaku
+せいじゃく;seijaku
+せきばく;sekibaku
+さびしさ;sabishisa
+しゅいろ;shuiro
+しゅにく;shuniku
+しゅひつ;shuhitsu
+しゅりょう;shuryou
+かりいぬ;kariinu
+かりこみ;karikomi
+とくしゅ;tokushu
+しゅしょう;shushou
+ことさら;kotosara
+しゅぎょく;shugyoku
+しんじゅ;shinju
+じゅず;juzu
+しゅみ;shumi
+しゅい;shui
+しゅこう;shukou
+じゅみょう;jumyou
+ちょうじゅ;chouju
+べいじゅ;beiju
+じゅきょう;jukyou
+じゅしゃ;jusha
+じゅがく;jugaku
+しゅうじん;shuujin
+しゅうえき;shuueki
+しけいしゅう;shikeishuu
+しゅうこう;shuukou
+ふなあそび;funaasobi
+こぶね;kobune
+しゅうさい;shuusai
+しゅういつ;shuuitsu
+しゅうび;shuubi
+しゅうき;shuuki
+ぞくしゅう;zokushuu
+くさみ;kusami
+しゅうしょう;shuushou
+あいしゅう;aishuu
+うれいがお;ureigao
+ほうしゅう;houshuu
+おうしゅう;oushuu
+けんしゅう;kenshuu
+しゅうあく;shuuaku
+しゅうぶん;shuubun
+みにくさ;minikusa
+しゅうらい;shuurai
+くうしゅう;kuushuu
+せしゅう;seshuu
+かじゅう;kajuu
+ぼくじゅう;bokujuu
+みそしる;misoshiru
+じゅうぶん;juubun
+じゅうじつ;juujitsu
+あてがう;ategau
+じゅうどう;juudou
+にゅうじゃく;nyuujaku
+やわらかもの;yawarakamono
+じゅうたい;juutai
+しぶみ;shibumi
+しぶしぶ;shibushibu
+しょうじゅう;shoujuu
+じゅうけん;juuken
+じゅうか;juuka
+じゅうい;juui
+じゅうてき;juuteki
+ちょうじゅう;choujuu
+おじ;oji
+おば;oba
+はくしゅく;hakushuku
+ていしゅく;teishuku
+しゅくじょ;shukujo
+ししゅく;shishuku
+しゅくぜん;shukuzen
+じしゅく;jishuku
+げんしゅく;genshuku
+じゅくせい;jukusei
+じゅくそく;jukusoku
+しじゅく;shijuku
+しゅんさい;shunsai
+しゅんけつ;shunketsu
+しゅんどう;shundou
+いっしゅん;isshun
+しゅんかん;shunkan
+またたくまに;matatakumani
+じょうじゅん;joujun
+ちゅうじゅん;chuujun
+げじゅん;gejun
+じゅんかい;junkai
+じゅんさ;junsa
+ひとめぐり;hitomeguri
+むじゅん;mujun
+うしろだて;ushirodate
+たてつく;tatetsuku
+じゅんい;jun_i
+ひじゅん;hijun
+じゅんきょ;junkyo
+じゅんし;junshi
+じゅんきょうしゃ;junkyousha
+じゅんしょく;junshoku
+いんじゅん;injun
+じゅんかん;junkan
+あくじゅんかん;akujunkan
+じゅんかつ;junkatsu
+りじゅん;rijun
+じゅんたく;juntaku
+じゅんしゅ;junshu
+じゅんぽう;junpou
+じゅんぽう;junpou
+しょみん;shomin
+しょむ;shomu
+しょし;shoshi
+たんしょ;tansho
+はなお;hanao
+じょじょう;jojou
+にょじつ;nyojitsu
+じょじゅつ;jojutsu
+じょじょうてき;jojouteki
+じょくん;jokun
+じょこう;jokou
+じょじょに;jojoni
+じょほ;joho
+ますめ;masume
+にしょう;nishou
+いっしょうびん;isshoubin
+しょうしゅう;shoushuu
+しょうかん;shoukan
+めしつかい;meshitsukai
+ししょう;shishou
+きょしょう;kyoshou
+いしょう;ishou
+びょうしょう;byoushou
+ゆかはり;yukahari
+とこのま;tokonoma
+しょうほん;shouhon
+ししょう;shishou
+しょうやく;shouyaku
+しょうぞう;shouzou
+ふしょう;fushou
+あやかりもの;ayakarimono
+しょうそう;shousou
+こうしょう;koushou
+なおなお;naonao
+しょうしん;shoushin
+じょうしょう;joushou
+しょうこうき;shoukouki
+まつば;matsuba
+まつばら;matsubara
+しょうちくばい;shouchikubai
+しょうき;shouki
+しょうたく;shoutaku
+ぬまち;numachi
+てっしょう;tesshou
+よいづき;yoiduki
+よいごし;yoigoshi
+しょうじょう;shoujou
+えんしょう;enshou
+きょうふしょう;kyoufushou
+はっしょうち;hasshouchi
+きっしょう;kisshou
+ふしょうじ;fushouji
+こうしょう;koushou
+かんしょう;kanshou
+しょうがい;shougai
+しょうかい;shoukai
+しょうかいしゃ;shoukaisha
+しょうかいじょう;shoukaijou
+そしょう;soshou
+そしょうにん;soshounin
+そしょうひよう;soshouhiyou
+しょうちゅう;shouchuu
+しゃしょう;shashou
+しょくしょう;shokushou
+すいしょう;suishou
+しょうか;shouka
+けっしょう;kesshou
+しょうど;shoudo
+しょうしん;shoushin
+くろこげ;kurokoge
+しょうさん;shousan
+しょうやく;shouyaku
+がらす;garasu
+けしょう;keshou
+けしょうひん;keshouhin
+けしょうしつ;keshoushitsu
+しょうしょ;shousho
+しょうれい;shourei
+たいしょう;taishou
+しょうれい;shourei
+すいしょう;suishou
+しょうがくきん;shougakukin
+しょうさい;shousai
+みしょう;mishou
+くわしく;kuwashiku
+ひょうしょう;hyoushou
+けんしょう;kenshou
+しょうとく;shoutoku
+しょうとつ;shoutotsu
+しょうどう;shoudou
+せっしょう;sesshou
+しょうきん;shoukin
+しょうきゃく;shoukyaku
+べんしょう;benshou
+がんしょう;ganshou
+あんしょう;anshou
+さんごしょう;sangoshou
+けいしょう;keishou
+つりがねどう;tsuriganedou
+しょうにゅうせき;shounyuuseki
+せたけ;setake
+ほうじょう;houjou
+じょうだん;joudan
+じょうちょう;jouchou
+じょうご;jougo
+じょうか;jouka
+ふじょう;fujou
+じょうすい;jousui
+じょうよ;jouyo
+よじょう;yojou
+かじょう;kajou
+じょうく;jouku
+にじょう;nijou
+たたみこむ;tatamikomu
+おきなわ;okinawa
+なわばり;nawabari
+じじょうじばく;jijoujibaku
+どじょう;dojou
+じょうど;joudo
+てんじょう;tenjou
+れいじょう;reijou
+あいじょう;aijou
+じょうまえ;joumae
+てじょう;tejou
+じょうざい;jouzai
+じょうほ;jouho
+じょうと;jouto
+おやゆずり;oyayuzuri
+じょうぞう;jouzou
+じょうせい;jousei
+かもしだす;kamoshidasu
+せいしょく;seishoku
+りしょく;rishoku
+ふえだか;fuedaka
+そうしょく;soushoku
+くびかざり;kubikazari
+かざりもの;kazarimono
+しょくしゅ;shokushu
+せっしょく;sesshoku
+ふれあう;fureau
+いしょく;ishoku
+しょくぼう;shokubou
+しょくたく;shokutaku
+ぶじょく;bujoku
+くつじょく;kutsujoku
+せつじょく;setsujoku
+しんしゅく;shinshuku
+ついしん;tsuishin
+せのび;senobi
+しんく;shinku
+からみ;karami
+かろうじて;karoujite
+しんにゅう;shinnyuu
+しんがい;shingai
+しんりゃく;shinryaku
+しんしん;shinshin
+つなみ;tsunami
+つつうらうら;tsutsuuraura
+しんおん;shin_on
+こうしん;koushin
+こうしん;koushin
+にんしん;ninshin
+にんしんかのう;ninshinkanou
+にんしんけんさ;ninshinkensa
+しんどう;shindou
+ふりきる;furikiru
+にねんぶり;ninenburi
+しんしょく;shinshoku
+しんすい;shinsui
+みずびたし;mizubitashi
+しんし;shinshi
+しんしょう;shinshou
+しんしろく;shinshiroku
+しんだん;shindan
+しんさつ;shinsatsu
+おうしん;oushin
+しんしつ;shinshitsu
+ねいる;neiru
+ねかしもの;nekashimono
+しんちょう;shinchou
+きんしん;kinshin
+つつしみぶかい;tsutsushimibukai
+しんぎ;shingi
+ふしん;fushin
+しんぱん;shinpan
+じしん;jishin
+みぶるい;miburui
+ふるえごえ;furuegoe
+しんたん;shintan
+たきぎこや;takigikoya
+まきわり;makiwari
+はくじん;hakujin
+はもの;hamono
+りょうば;ryouba
+じんりょく;jinryoku
+じんみらい;jinmirai
+こころづくし;kokorodukushi
+じんそく;jinsoku
+じんらい;jinrai
+ふんじん;funjin
+じんだい;jindai
+じんろく;jinroku
+こうじん;koujin
+じんとう;jintou
+じんち;jinchi
+じんつう;jintsuu
+じんもん;jinmon
+じんじょう;jinjou
+たずねだす;tazunedasu
+こすい;kosui
+ふぶき;fubuki
+ふきたおす;fukitaosu
+すいじ;suiji
+めしたき;meshitaki
+じすい;jisui
+とうすい;tousui
+げんすい;gensui
+しょうすい;shousui
+すいび;suibi
+いきごと;ikigoto
+すいじん;suijin
+すいじゃく;suijaku
+ろうすい;rousui
+せいすい;seisui
+ますい;masui
+よっぱらい;yopparai
+ふなよい;funayoi
+すいこう;suikou
+みすい;misui
+しとげる;shitogeru
+すいみん;suimin
+じゅくすい;jukusui
+ごすい;gosui
+すいじょう;suijou
+いなほ;inaho
+ほさき;hosaki
+ぼうすい;bousui
+どくせん;dokusen
+うらないしゃ;uranaisha
+しめた;shimeta
+せんす;sensu
+せんぷうき;senpuuki
+せんけい;senkei
+せんぬき;sennuki
+きゅうすいせん;kyuusuisen
+しょうかせん;shoukasen
+せんかい;senkai
+せんばん;senban
+しゅうせん;shuusen
+じっせん;jissen
+じっせんてき;jissenteki
+じっせんしゅぎ;jissenshugi
+せんてつ;sentetsu
+せんこう;senkou
+ようせん;yousen
+せんざい;senzai
+せんすい;sensui
+もぐりこむ;mogurikomu
+せんえん;sen_en
+へんせん;hensen
+せんげ;senge
+すいせん;suisen
+せんこつ;senkotsu
+じせん;jisen
+せんい;sen_i
+せんさい;sensai
+せんもう;senmou
+せんぎょ;sengyo
+せんめい;senmei
+ちょうせん;chousen
+ざぜん;zazen
+ぜんしゅう;zenshuu
+ぜんでら;zendera
+デパート;depaato
+ほっかいどう;hokkaidou
+ほんしゅう;honshuu
+しこく;shikoku
+インド;indo
+アメリカ;amerika
+それん;soren
+くらい;kurai
+たいへん;taihen
+まんいん;man_in
+もう;mou
+きのう;kinou
+あさ;asa
+ひる;hiru
+よる;yoru
+けさ;kesa
+さくや;sakuya
+いっしょに;isshoni
+ぜんたいで;zentaide
+ぜんたいで;zentaide
+へいほうキロメートル;heihoukiromeetoru
+かい;kai
+キロ;kiro
+おりる;oriru
+ねる;neru
+でる;deru
+うまれる;umareru
+かう;kau
+はいる;hairu
+あめがふる;amegafuru
+ゆきがふる;yukigafuru
+さく;saku
+ふろにはいる;furonihairu
+けっこんする;kekkonsuru
+てら;tera
+ちゃみせ;chamise
+やまみち;yamamichi
+そら;sora
+みどり;midori
+ちょうじゅう;choujuu
+ぎが;giga
+はいく;haiku
+あし;ashi
+はなし;hanashi
+しけん;shiken
+てつづき;tetsuduki
+にわ;niwa
+びょうき;byouki
+じゅぎょう;jugyou
+けんぶつ;kenbutsu
+えはがき;ehagaki
+めいしょ;meisho
+だいぶつ;daibutsu
+たいしゃ;taisha
+じんじゃ;jinja
+しか;shika
+こじか;kojika
+ぎょうじ;gyouji
+かてい;katei
+しょうがつ;shougatsu
+かどまつ;kadomatsu
+しめなわ;shimenawa
+もち;mochi
+せつぶん;setsubun
+まめ;mame
+おに;oni
+ふくのかみ;fukunokami
+ひなまつり;hinamatsuri
+ひなにんぎょう;hinaningyou
+たんごのせっく;tangonosekku
+はじめ;hajime
+まつり;matsuri
+こいのぼり;koinobori
+たなばた;tanabata
+ほし;hoshi
+うしかい;ushikai
+うし;ushi
+でんせつ;densetsu
+あまのがわ;amanogawa
+おりひめ;orihime
+ハイキング;haikingu
+まつおばしょう;matsuobashou
+つめたい;tsumetai
+みじかい;mijikai
+たのしい;tanoshii
+かわいらしい;kawairashii
+あおい;aoi
+さいわい;saiwai
+かんたん;kantan
+ふしんせつ;fushinsetsu
+げんき;genki
+ロマンチック;romanchikku
+びょうき;byouki
+いくつか;ikutsuka
+ごぜん;gozen
+ど;do
+こいのぼりおたてる;koinoboriotateru
+はしる;hashiru
+ハイキングにいく;haikinguniiku
+はいくをつくる;haikuwotsukuru
+しゃしんをとる;shashinwotoru
+おくる;okuru
+かざる;kazaru
+まく;maku
+おいだす;oidasu
+まねく;maneku
+わたる;wataru
+あう;au
+けんぶつする;kenbutsusuru
+くる;kuru
+おおぜい;oozei
+ことり;kotori
+いけ;ike
+はし;hashi
+こい;koi
+しゃせい;shasei
+ちゅうがくせい;chuugakusei
+ぶらんこ;buranko
+こかげ;kokage
+だんじょ;danjo
+ひかり;hikari
+べんとう;bentou
+かだん;kadan
+おか;oka
+とおく;tooku
+すもう;sumou
+かね;kane
+くるま;kuruma
+でんわばんごう;denwabangou
+いけばな;ikebana
+でし;deshi
+おぼん;obon
+せんぞ;senzo
+たましい;tamashii
+まんげつ;mangetsu
+おつきみ;otsukimi
+うんどうかい;undoukai
+ひとびと;hitobito
+こめ;kome
+とりいれ;toriire
+ほうさく;housaku
+むら;mura
+あきまつり;akimatsuri
+しちごさん;shichigosan
+とし;toshi
+とし;toshi
+おおそうじ;oosouji
+おおみそか;oomisoka
+よなか;yonaka
+じょやのかね;joyanokane
+ベンチ;benchi
+ハーモニカ;haamonika
+ボール;booru
+ハンカチ;hankachi
+デパート;depaato
+ジャズ;jazu
+スポーツ;supootsu
+シーズン;shiizun
+サイクリング;saikuringu
+だいもんじ;daimonji
+かんとう;kantou
+かんさい;kansai
+くろい;kuroi
+あかるい;akarui
+ふべん;fuben
+じょうず;jouzu
+モダン;modan
+さいご;saigo
+さい;sai
+おちる;ochiru
+なげる;nageru
+おしえる;oshieru
+おちゃをたてる;ochawotateru
+コーヒーをいれる;koohiiwoireru
+あつめる;atsumeru
+むかえる;mukaeru
+ひをつける;hiwotsukeru
+さく;saku
+あそぶ;asobu
+うたう;utau
+はしがかかる;hashigakakaru
+ぶらんこにのる;burankoninoru
+はなす;hanasu
+もつ;motsu
+まわる;mawaru
+ハーモニカをふく;haamonikawofuku
+すもうをとる;sumouwotoru
+みおろす;miorosu
+ひかる;hikaru
+にすむ;nisumu
+しる;shiru
+ひらく;hiraku
+しまる;shimaru
+まがる;magaru
+ふとる;futoru
+ピアノをひく;pianowohiku
+シャツをぬぐ;shatsuwonugu
+とおる;tooru
+すむ;sumu
+いわう;iwau
+にまいる;nimairu
+もちをつく;mochiwotsuku
+おじゃまする;ojamasuru
+しょうかいする;shoukaisuru
+つゆ;tsuyu
+つゆあけ;tsuyuake
+なつやすみ;natsuyasumi
+はれ;hare
+なつやま;natsuyama
+こうざんしょくぶつ;kouzanshokubutsu
+くも;kumo
+はんとう;hantou
+かいがん;kaigan
+ぶんか;bunka
+せいじ;seiji
+さんぎょう;sangyou
+ちゅうしん;chuushin
+しぜん;shizen
+みずうみ;mizuumi
+のはら;nohara
+ちへいせん;chiheisen
+ゆうひ;yuuhi
+しゅうかく;shuukaku
+もの;mono
+さかな;sakana
+ていりゅうじょ;teiryuujo
+かぜ;kaze
+こけ;koke
+やまごや;yamagoya
+せいき;seiki
+れきし;rekishi
+きもの;kimono
+ぬの;nuno
+あな;ana
+あたま;atama
+こふん;kofun
+はにわ;haniwa
+ふくそう;fukusou
+ころ;koro
+はかま;hakama
+へいあんじだい;heianjidai
+かまくらじだい;kamakurajidai
+むろまちじだい;muromachijidai
+ぜんじ;zenji
+ぜんしんてき;zenshinteki
+とうぜん;touzen
+しゅうぜん;shuuzen
+しゅうぜんこう;shuuzenkou
+つくろいかざる;tsukuroikazaru
+そし;soshi
+そがい;sogai
+けんそ;kenso
+そぜい;sozei
+そしゃく;soshaku
+そしゃっけん;soshakken
+そち;sochi
+そじ;soji
+きょそ;kyoso
+そまつ;somatsu
+そとう;sotou
+あらすじ;arasuji
+そかく;sokaku
+そかいしゃ;sokaisha
+うとうとしい;utoutoshii
+そしょうじけん;soshoujiken
+こくそ;kokuso
+あいそ;aiso
+そぞう;sozou
+ちょうそ;chouso
+かそせい;kasosei
+そせき;soseki
+きそ;kiso
+きそてき;kisoteki
+そうほう;souhou
+むそう;musou
+ふたご;futago
+そうだい;soudai
+きょうそう;kyousou
+そうしゃ;sousha
+そうごん;sougon
+しょうえん;shouen
+べっそう;bessou
+そうさ;sousa
+そうさく;sousaku
+さがしだす;sagashidasu
+そうにゅう;sounyuu
+そうわ;souwa
+さしえ;sashie
+そうえん;souen
+くわいろ;kuwairo
+くわばたけ;kuwabatake
+そうじき;soujiki
+いっそう;issou
+はきだす;hakidasu
+ほうそう;housou
+ぐんそう;gunsou
+そうし;soushi
+きそう;kisou
+すばこ;subako
+すだつ;sudatsu
+そうしつ;soushitsu
+もふく;mofuku
+もちゅう;mochuu
+そうしき;soushiki
+そうぎや;sougiya
+そうか;souka
+そうち;souchi
+いしょう;ishou
+へんそう;hensou
+そういん;souin
+こうそう;kousou
+そうしょく;soushoku
+そうぐう;souguu
+そうなん;sounan
+そうなんしんごう;sounanshingou
+すいそう;suisou
+よくそう;yokusou
+しそう;shisou
+かんそう;kansou
+しょうそう;shousou
+こうそうち;kousouchi
+そうがい;sougai
+しもよ;shimoyo
+しもふりにく;shimofuriniku
+そうおん;souon
+そうどう;soudou
+おおさわぎ;oosawagi
+もぬけ;monuke
+かいそう;kaisou
+しそう;shisou
+ぞうお;zouo
+にくらしい;nikurashii
+にくみあう;nikumiau
+ぞうよ;zouyo
+きぞう;kizou
+おくりもの;okurimono
+そくい;sokui
+そっこく;sokkoku
+そくせき;sokuseki
+けっそく;kessoku
+はなたば;hanataba
+つかのま;tsukanoma
+そくしん;sokushin
+さいそく;saisoku
+そくせい;sokusei
+かいぞく;kaizoku
+とうぞく;touzoku
+ぞくぐん;zokugun
+だとう;datou
+だきょう;dakyou
+だけつ;daketsu
+だらく;daraku
+だたい;datai
+だらくぼうず;darakubouzu
+だりょく;daryoku
+たいだ;taida
+だき;daki
+だもの;damono
+だば;daba
+むだ;muda
+たいきゅう;taikyuu
+たいか;taika
+たえがたい;taegatai
+たいぎょう;taigyou
+なまけもの;namakemono
+おこたりがち;okotarigachi
+たいじ;taiji
+じゅたい;jutai
+たいばん;taiban
+たいぜん;taizen
+あんたい;antai
+たいせい;taisei
+ゆうたい;yuutai
+ゆうたいるい;yuutairui
+てぶくろ;tebukuro
+たいほ;taiho
+たいほしゃ;taihosha
+たいや;taiya
+だいたい;daitai
+りょうがえ;ryougae
+とりかえ;torikae
+たいざい;taizai
+ていたい;teitai
+たいのう;tainou
+きよたき;kiyotaki
+たきがわ;takigawa
+けごんだき;kegondaki
+さいたく;saitaku
+せんたく;sentaku
+せんたくかもく;sentakukamoku
+こうたく;koutaku
+さわち;sawachi
+たっきゅう;takkyuu
+たくえつ;takuetsu
+しょくたく;shokutaku
+たくしょく;takushoku
+かいたく;kaitaku
+ぎょたく;gyotaku
+たくせん;takusen
+たくそう;takusou
+いたく;itaku
+せんたくき;sentakuki
+せんたくもの;sentakumono
+じゅだく;judaku
+しょうだく;shoudaku
+かいだく;kaidaku
+だくりゅう;dakuryuu
+だくおん;dakuon
+にごりえ;nigorie
+ただしがき;tadashigaki
+ただしづき;tadashiduki
+たじま;tajima
+だつい;datsui
+だっぴ;dappi
+だっしゅつ;dasshutsu
+だっしゅ;dasshu
+だっかい;dakkai
+うばいさる;ubaisaru
+とだな;todana
+ほんだな;hondana
+ぶどうだな;budoudana
+たんねん;tannen
+たんせい;tansei
+にぬり;ninuri
+だいたん;daitan
+たんせき;tanseki
+らくたん;rakutan
+たんすい;tansui
+たんしょく;tanshoku
+あわゆき;awayuki
+たんそく;tansoku
+きょうたん;kyoutan
+なげきさけぶ;nagekisakebu
+きょくたん;kyokutan
+たんせい;tansei
+みちばた;michibata
+たんじょうび;tanjoubi
+こうたん;koutan
+こうたん;koutan
+たんこうじょ;tankoujo
+たんれん;tanren
+たんきん;tankin
+だんやく;dan_yaku
+だんりょく;danryoku
+ひきて;hikite
+かだん;kadan
+だんじょう;danjou
+どたんば;dotanba
+ちじょく;chijoku
+むち;muchi
+はじいる;hajiiru
+いっち;icchi
+ちめいてき;chimeiteki
+いたしかた;itashikata
+ちこく;chikoku
+ちち;chichi
+おそざき;osozaki
+はくち;hakuchi
+ぐち;guchi
+ちじょう;chijou
+ちぎょ;chigyo
+ちせつ;chisetsu
+ようちえん;youchien
+かちく;kachiku
+ちくしょう;chikushou
+ちくさん;chikusan
+くちく;kuchiku
+ちくいち;chikuichi
+ちくごてき;chikugoteki
+ちょちく;chochiku
+ちくでん;chikuden
+ちくせき;chikuseki
+ちつじょ;chitsujo
+かんちつ;kanchitsu
+ちつろく;chitsuroku
+ちっし;chisshi
+ちっそく;chissoku
+ちっそ;chisso
+ちゃくし;chakushi
+はいちゃく;haichaku
+ちゃくさい;chakusai
+ちゅうてん;chuuten
+おきあい;okiai
+おきづり;okiduri
+ちゅうしゅつ;chuushutsu
+ちゅうしょう;chuushou
+ちゅうせん;chuusen
+せっちゅう;secchuu
+ちゅうしん;chuushin
+くちゅう;kuchuu
+ちゅうぞう;chuuzou
+ちゅうてつ;chuutetsu
+いがた;igata
+ちゅうしゃ;chuusha
+ちゅうざい;chuuzai
+ちゅうにち;chuunichi
+けいちょう;keichou
+ちょうもん;choumon
+とむらいがっせん;tomuraigassen
+ちょうはつ;chouhatsu
+ちょうせん;chousen
+ちょうせんてき;chousenteki
+ちょうこく;choukoku
+ちょうぞう;chouzou
+てぼり;tebori
+ちょうぼう;choubou
+ながめ;nagame
+ちょうぼうぜっけい;choubouzekkei
+つりば;tsuriba
+ちょうぎょ;chougyo
+つりせん;tsurisen
+ぼうちょう;bouchou
+ふくれっつら;fukurettsura
+ふくらしこ;fukurashiko
+ちょうじん;choujin
+ちょうか;chouka
+にゅうちょう;nyuuchou
+ちょうやく;chouyaku
+とびいた;tobiita
+はねかえる;hanekaeru
+しょうちょう;shouchou
+ちょうしゅう;choushuu
+とくちょう;tokuchou
+せいちょう;seichou
+すみきる;sumikiru
+すましがお;sumashigao
+ちょうこう;choukou
+とうちょう;touchou
+ちょうしんき;choushinki
+ちょうばつ;choubatsu
+ちょうかい;choukai
+こりごり;korigori
+ちょくご;chokugo
+ちょくし;chokushi
+ちょくにん;chokunin
+ちんぼつ;chinbotsu
+ちんたい;chintai
+ちんか;chinka
+ちんき;chinki
+ちんぴん;chinpin
+ちんぽん;chinpon
+ちん;chin
+ちんの;chinno
+ちんとく;chintoku
+ちんじょう;chinjou
+ちんれつ;chinretsu
+しんちんたいしゃ;shinchintaisha
+ちんつうざい;chintsuuzai
+ちんせい;chinsei
+ぶんちん;bunchin
+ついらく;tsuiraku
+げきつい;gekitsui
+ついし;tsuishi
+かいづか;kaiduka
+つかあな;tsukaana
+たからづか;takaraduka
+つけもの;tsukemono
+ちゃづけ;chaduke
+しおづけ;shioduke
+たてつぼ;tatetsubo
+ごつぼ;gotsubo
+つぼすう;tsubosuu
+きゅうてい;kyuutei
+ほうてい;houtei
+ていしん;teishin
+ていじょう;teijou
+ぞうてい;zoutei
+しんてい;shintei
+ていこう;teikou
+ていとう;teitou
+ていたく;teitaku
+ていない;teinai
+かんてい;kantei
+ていしゅ;teishu
+りょてい;ryotei
+りょうてい;ryoutei
+ていそう;teisou
+ていせつ;teisetsu
+ていじつ;teijitsu
+ていこく;teikoku
+ていおう;teiou
+ていおうせっかい;teiousekkai
+ていせい;teisei
+かいてい;kaitei
+かいていばん;kaiteiban
+ていそう;teisou
+ていしん;teishin
+ていじ;teiji
+たんてい;tantei
+ないてい;naitei
+ていさつ;teisatsu
+ぼうはてい;bouhatei
+ていぼう;teibou
+ていぼうづたい;teiboudutai
+かんてい;kantei
+ていこ;teiko
+きゅうめいてい;kyuumeitei
+しめきり;shimekiri
+ていやく;teiyaku
+しめだし;shimedashi
+でいど;deido
+こうでい;koudei
+どろあし;doroashi
+きてき;kiteki
+てきしゅ;tekishu
+くちぶえ;kuchibue
+てきよう;tekiyou
+てきはつ;tekihatsu
+つみとる;tsumitoru
+すいてき;suiteki
+いってき;itteki
+てきか;tekika
+こうてつ;koutetsu
+てつりつ;tetsuritsu
+てっき;tekki
+てつがく;tetsugaku
+てつじん;tetsujin
+せんてつ;sentetsu
+てつや;tetsuya
+てっていてき;tetteiteki
+かんてつ;kantetsu
+てっしゅう;tesshuu
+てっきょ;tekkyo
+てっかい;tekkai
+てんか;tenka
+てんぷ;tenpu
+そえぎ;soegi
+きゅうでん;kyuuden
+ごてん;goten
+とのさま;tonosama
+ほくとせい;hokutosei
+としゅ;toshu
+たいと;taito
+とざい;tozai
+はきけ;hakike
+といき;toiki
+とちゅう;tochuu
+とたん;totan
+ぜんと;zento
+とこう;tokou
+とせい;tosei
+いいわたす;iiwatasu
+ぬりもの;nurimono
+とそう;tosou
+ぬりぐすり;nurigusuri
+どれい;dorei
+やつら;yatsura
+やっこさん;yakkosan
+どき;doki
+どなる;donaru
+いかりぐるう;ikariguruu
+とうふ;toufu
+だいず;daizu
+まめほん;mamehon
+とうらい;tourai
+とうたつ;toutatsu
+とうてい;toutei
+とうぼうしゃ;toubousha
+みのがす;minogasu
+にげみち;nigemichi
+とうさん;tousan
+めんどう;mendou
+とうち;touchi
+れいとうざい;reitouzai
+とうけつ;touketsu
+こおりつく;kooritsuku
+とうほん;touhon
+けとうじん;ketoujin
+からて;karate
+はくとう;hakutou
+ももいろ;momoiro
+とうげんきょう;tougenkyou
+とうめい;toumei
+とうしゃ;tousha
+すきとおる;sukitooru
+あいとう;aitou
+ついとう;tsuitou
+いたむべき;itamubeki
+とうよう;touyou
+ごうとう;goutou
+ぬすびと;nusubito
+とうき;touki
+くんとう;kuntou
+とうぜん;touzen
+せきとう;sekitou
+そとば;sotoba
+ごじゅうのとう;gojuunotou
+とうさい;tousai
+とうじょう;toujou
+とうじょうけん;toujouken
+びょうとう;byoutou
+むなぎ;munagi
+べつむね;betsumune
+てんねんとう;tennentou
+すいとう;suitou
+しゅとう;shutou
+えんとう;entou
+つつぬけ;tsutsunuke
+つつがた;tsutsugata
+すいとう;suitou
+いなさく;inasaku
+わせだ;waseda
+とうは;touha
+ふみこむ;fumikomu
+あしぶみ;ashibumi
+とうほん;touhon
+とうしゃ;tousha
+とうしゃき;toushaki
+とうし;toushi
+とうし;toushi
+せんとうき;sentouki
+とうき;touki
+とうらく;touraku
+ぼうとう;boutou
+どうさつ;dousatsu
+くうどう;kuudou
+どうくつ;doukutsu
+どうたい;doutai
+そうどうせん;soudousen
+どうまわり;doumawari
+とうげみち;tougemichi
+うすいとうげ;usuitouge
+よんじゅうのとうげ;yonjuunotouge
+とくめい;tokumei
+いんとく;intoku
+ひとく;hitoku
+かんとく;kantoku
+とくれい;tokurei
+とくそく;tokusoku
+とくし;tokushi
+きとく;kitoku
+とくと;tokuto
+とつめん;totsumen
+でこぼこ;dekoboko
+おうとつ;outotsu
+とつぜん;totsuzen
+とつにゅう;totsunyuu
+つっこむ;tsukkomu
+とんえい;ton_ei
+ちゅうとん;chuuton
+ちゅうとんち;chuutonchi
+とんもう;tonmou
+ぶたにく;butaniku
+とんカツ;tonkatsu
+どんかん;donkan
+どんさい;donsai
+にびいろ;nibiiro
+どんてん;donten
+くもりがち;kumorigachi
+はなぐもり;hanagumori
+なんか;nanka
+なんすい;nansui
+なんじゃく;nanjaku
+にそう;nisou
+あまでら;amadera
+びくに;bikuni
+とうにょうびょう;tounyoubyou
+にょうそ;nyouso
+にょうい;nyoui
+にんぷ;ninpu
+ふにんしょう;funinshou
+にんしんちょうせつ;ninshinchousetsu
+にんたい;nintai
+にんじゃ;ninja
+しのびこむ;shinobikomu
+あんねい;annei
+ていねい;teinei
+ねいじつ;neijitsu
+ねんど;nendo
+ねんちゃく;nenchaku
+ねばりづよい;nebariduyoi
+くのう;kunou
+のうさつ;nousatsu
+おうのう;ounou
+のうか;nouka
+のうこう;noukou
+あぶらっこい;aburakkoi
+はあく;haaku
+はじゅう;hajuu
+とって;totte
+はけん;haken
+はき;haki
+せいは;seiha
+ろうば;rouba
+さんば;sanba
+おにばば;onibaba
+ぎょくはい;gyokuhai
+さかずきごと;sakazukigoto
+はいじょ;haijo
+はいすい;haisui
+はいきガス;haikigasu
+はいし;haishi
+はいじ;haiji
+すたりもの;sutarimono
+わがはい;wagahai
+せんぱい;senpai
+はいしゅつ;haishutsu
+ばいか;baika
+うめしゅ;umeshu
+つゆ;tsuyu
+ばいよう;baiyou
+さいばいしゃ;saibaisha
+ばいち;baichi
+ばいせきしゃ;baisekisha
+ばいしん;baishin
+ばいおん;baion
+ばいかい;baikai
+しょくばい;shokubai
+ばいたい;baitai
+ばいしょう;baishou
+ばいしょうきん;baishoukin
+そんがいばいしょう;songaibaishou
+はくしゃく;hakushaku
+おじ;oji
+がはく;gahaku
+はくしゅ;hakushu
+ひょうし;hyoushi
+はくしゃ;hakusha
+しゅくはく;shukuhaku
+とまりばん;tomariban
+いっぱく;ippaku
+はくがい;hakugai
+はくりょく;hakuryoku
+せっぱく;seppaku
+せんぱく;senpaku
+はくらい;hakurai
+はくよう;hakuyou
+うすぎ;usugi
+けいはく;keihaku
+うすかわ;usukawa
+ばくぜん;bakuzen
+ばくばく;bakubaku
+さばく;sabaku
+そくばく;sokubaku
+ほばく;hobaku
+しばりくび;shibarikubi
+ばくはつ;bakuhatsu
+ばくだん;bakudan
+げんばく;genbaku
+こばこ;kobako
+はこぶね;hakobune
+はこいり;hakoiri
+はだいろ;hadairo
+すはだ;suhada
+きめ;kime
+うえきばち;uekibachi
+はちまき;hachimaki
+いはつ;ihatsu
+とうはつ;touhatsu
+さんぱつ;sanpatsu
+かみがた;kamigata
+ばっさい;bassai
+せいばつ;seibatsu
+さつばつ;satsubatsu
+ばつぐん;batsugun
+ぬけあな;nukeana
+てぬかり;tenukari
+ばっきん;bakkin
+しょばつ;shobatsu
+ばちあたり;bachiatari
+もんばつ;monbatsu
+ばつぞく;batsuzoku
+ざいばつ;zaibatsu
+はんせん;hansen
+ほばしら;hobashira
+ほかける;hokakeru
+どうはんしゃ;douhansha
+ばんそうしゃ;bansousha
+あいともなう;aitomonau
+ちはん;chihan
+こはん;kohan
+こはんしじん;kohanshijin
+いっぱん;ippan
+ぜんぱん;zenpan
+かはん;kahan
+はんばい;hanbai
+しはん;shihan
+はんろ;hanro
+うんぱん;unpan
+はんそう;hansou
+はんそうたい;hansoutai
+はんざつ;hanzatsu
+ぼんのう;bonnou
+はんろう;hanrou
+はんぷ;hanpu
+はんこう;hankou
+はんぱく;hanpaku
+もはん;mohan
+きはん;kihan
+はんいない;han_inai
+はんじょう;hanjou
+はんざつ;hanzatsu
+はんしょく;hanshoku
+はんしゅ;hanshu
+はんべい;hanbei
+かがはん;kagahan
+ばんじん;banjin
+ばんこう;bankou
+やばん;yaban
+えんばん;enban
+きばん;kiban
+すいばん;suiban
+おうひ;ouhi
+ひでんか;hidenka
+こうたいしひ;koutaishihi
+かれし;kareshi
+かのじょ;kanojo
+ひがん;higan
+ひけん;hiken
+ひれき;hireki
+ひろう;hirou
+ひげ;hige
+ひくつ;hikutsu
+ひきん;hikin
+ひろう;hirou
+つかれめ;tsukareme
+つかれきる;tsukarekiru
+ひがいしゃ;higaisha
+ひふく;hifuku
+ひこくにん;hikokunin
+かいひ;kaihi
+もんぴ;monpi
+とびらえ;tobirae
+ひめい;himei
+せきひ;sekihi
+きねんひ;kinenhi
+ひぎょう;higyou
+ひめん;himen
+まかりとおる;makaritooru
+かいひ;kaihi
+ふかひ;fukahi
+ひにん;hinin
+びこつ;bikotsu
+こうび;koubi
+しっぽ;shippo
+びさい;bisai
+びこう;bikou
+びこう;bikou
+ひってき;hitteki
+ひっぷ;hippu
+いっぴき;ippiki
+ぶんぴつ;bunpitsu
+ひにょう;hinyou
+ひにょうきか;hinyoukika
+ひめみや;himemiya
+ひめがき;himegaki
+ようこひめ;youkohime
+ひょうはく;hyouhaku
+ひょうちゃく;hyouchaku
+ひょうりゅうしゃ;hyouryuusha
+しゅびょう;shubyou
+みょうじ;myouji
+なえぎ;naegi
+びょうしゃ;byousha
+てんびょう;tenbyou
+えがきだす;egakidasu
+あいびょう;aibyou
+ねこぜ;nekoze
+シャムねこ;shamuneko
+かいひん;kaihin
+はまべ;hamabe
+はまとびむし;hamatobimushi
+しゅひん;shuhin
+らいひん;raihin
+ひんきゃく;hinkyaku
+ひんぱんに;hinpanni
+ひんぱつ;hinpatsu
+ひんど;hindo
+びんそく;binsoku
+えいびん;eibin
+きびん;kibin
+びんづめ;bindume
+かびん;kabin
+つるべ;tsurube
+ふじょ;fujo
+ふよう;fuyou
+ふいく;fuiku
+きょうふしょう;kyoufushou
+いふ;ifu
+きょうふしょうせつ;kyoufushousetsu
+ふぞく;fuzoku
+きふ;kifu
+ふきん;fukin
+ふえん;fuen
+ふにん;funin
+ふにんち;funinchi
+ふりょく;furyoku
+うわき;uwaki
+うきよ;ukiyo
+きっぷ;kippu
+ふごう;fugou
+ふごう;fugou
+ふつう;futsuu
+ふへん;fuhen
+ふきゅう;fukyuu
+ふしん;fushin
+ふはい;fuhai
+くされ;kusare
+ふせつ;fusetsu
+しきもの;shikimono
+やしき;yashiki
+ひふえん;hifuen
+かんぷ;kanpu
+はだぎ;hadagi
+ふか;fuka
+ふし;fushi
+げっぷ;geppu
+がくふ;gakufu
+けいふ;keifu
+ねんぷ;nenpu
+ぶじょくてき;bujokuteki
+けいぶ;keibu
+ぶまん;buman
+ぶたい;butai
+まいこ;maiko
+ふるまい;furumai
+ふうとう;fuutou
+ふうさ;fuusa
+ほうけん;houken
+きふく;kifuku
+せんぷく;senpuku
+ふして;fushite
+しんぷく;shinpuku
+がふく;gafuku
+よこはば;yokohaba
+てんぷく;tenpuku
+ふくめん;fukumen
+ふくすい;fukusui
+はらいもどす;haraimodosu
+ふってい;futtei
+はらいだす;haraidasu
+ふってん;futten
+わきたつ;wakitatsu
+わきでる;wakideru
+ふんしつ;funshitsu
+ふんそう;funsou
+ふんぷん;funpun
+ふんいき;fun_iki
+むふん;mufun
+そうふん;soufun
+ふんか;funka
+ふんすい;funsui
+ふきだす;fukidasu
+こふん;kofun
+ふんぼ;funbo
+ふんぼのち;funbonochi
+ふんがい;fungai
+ふんど;fundo
+ぎふん;gifun
+へいしゅ;heishu
+こうおつへい;kouotsuhei
+ひのえ;hinoe
+がっぺい;gappei
+へいよう;heiyou
+へいはつ;heihatsu
+へいこう;heikou
+なみき;namiki
+つきなみ;tsukinami
+おうへい;ouhei
+いえがら;iegara
+おおがら;oogara
+いたべい;itabei
+どべい;dobei
+へいごし;heigoshi
+しへい;shihei
+かへい;kahei
+ごへい;gohei
+へいしゃ;heisha
+ひへい;hihei
+へいがい;heigai
+へきが;hekiga
+がんぺき;ganpeki
+かべがみ;kabegami
+とうへき;touheki
+しゅうへき;shuuheki
+くせげ;kusege
+へんこう;henkou
+へんけん;henken
+へんくつ;henkutsu
+ふへんせい;fuhensei
+へんざい;henzai
+いっぺん;ippen
+ほかく;hokaku
+とらえどころ;toraedokoro
+つかまえどころ;tsukamaedokoro
+うらなみ;uranami
+うらかぜ;urakaze
+うらざと;urazato
+てんぽ;tenpo
+ほそう;hosou
+ほそうどうろ;hosoudouro
+ぼしゅう;boshuu
+ぼきん;bokin
+おうぼ;oubo
+ぼじょう;bojou
+けいぼ;keibo
+ぼしん;boshin
+ぼしゅん;boshun
+ゆうぐれ;yuugure
+くらしかた;kurashikata
+めいぼ;meibo
+ぼき;boki
+ちょうぼ;choubo
+ほうこう;houkou
+ほうし;houshi
+ほうき;houki
+ほうが;houga
+れんぽう;renpou
+ほんぽう;honpou
+ほうし;houshi
+ほうのう;hounou
+しんぽう;shinpou
+だきつく;dakitsuku
+ほうかい;houkai
+かかえこむ;kakaekomu
+きほう;kihou
+はっぽう;happou
+あわだつ;awadatsu
+ほうし;houshi
+ほうい;houi
+さいぼう;saibou
+ほうきゅう;houkyuu
+ねんぽう;nenpou
+ほうろくまい;hourokumai
+もほう;mohou
+もほうしゃ;mohousha
+ならいけずり;naraikezuri
+しゅほう;shuhou
+れんぽう;renpou
+みねうち;mineuchi
+ほうがん;hougan
+てっぽう;teppou
+たいほう;taihou
+ほうかい;houkai
+なだれ;nadare
+やまくずれ;yamakuzure
+ほうわ;houwa
+ほうしょく;houshoku
+あきしょう;akishou
+ほうしょう;houshou
+ほうび;houbi
+ほめことば;homekotoba
+ほうごう;hougou
+ぬいもの;nuimono
+ぬいめ;nuime
+けつぼう;ketsubou
+びんぼう;binbou
+たいぼう;taibou
+たぼう;tabou
+はんぼう;hanbou
+ぼうさつ;bousatsu
+ぼうず;bouzu
+ぼうや;bouya
+ぼうかん;boukan
+ぼうがい;bougai
+ぼうし;boushi
+さまたげなし;samatagenashi
+ぼうしつ;boushitsu
+ふさふさ;fusafusa
+せわにょうぼう;sewanyoubou
+しぼうそう;shibousou
+しぼうかた;shiboukata
+しぼうそしき;shibousoshiki
+ぼうし;boushi
+ぼうしょ;bousho
+おおたなにがし;ootananigashi
+ぼうけん;bouken
+かんぼう;kanbou
+おかして;okashite
+かいぼう;kaibou
+かいぼうがく;kaibougaku
+せいたいかいぼう;seitaikaibou
+ぼうき;bouki
+ぼうもう;boumou
+ぼうせきぎょう;bousekigyou
+ぼうちょう;bouchou
+ぼうかん;boukan
+ぼうちゅう;bouchuu
+ぼうし;boushi
+めいもう;meimou
+もうもく;moumoku
+もんもう;monmou
+めくらばん;mekuraban
+しょうもう;shoumou
+そんもう;sonmou
+しんしんもうじゃく;shinshinmoujaku
+もうれつ;mouretsu
+もうじゅう;moujuu
+もさ;mosa
+ぎょもう;gyomou
+あみど;amido
+つうしんもう;tsuushinmou
+もくさつ;mokusatsu
+ちんもく;chinmoku
+だまりこむ;damarikomu
+もんしょう;monshou
+しもん;shimon
+はもん;hamon
+にもんめ;nimonme
+ごもんめ;gomonme
+さんもんめ;sanmonme
+やっかい;yakkai
+やくび;yakubi
+さいやく;saiyaku
+やくしん;yakushin
+ひやく;hiyaku
+おどりこむ;odorikomu
+ゆかい;yukai
+ゆえつ;yuetsu
+ゆらく;yuraku
+きょうゆ;kyouyu
+せつゆ;setsuyu
+ゆし;yushi
+ちゆ;chiyu
+へいゆ;heiyu
+ゆごう;yugou
+ゆいいつ;yuiitsu
+ただいま;tadaima
+いいだくだく;iidakudaku
+ゆうきょう;yuukyou
+ゆうげん;yuugen
+ゆうかい;yuukai
+ゆうぜん;yuuzen
+ゆうちょう;yuuchou
+ゆうきゅう;yuukyuu
+ゆうし;yuushi
+ゆうよ;yuuyo
+ゆうよきかん;yuuyokikan
+ゆうふく;yuufuku
+よゆう;yoyuu
+ふゆうかいきゅう;fuyuukaikyuu
+ゆうべん;yuuben
+ゆうしゃ;yuusha
+おうし;oushi
+ゆうわく;yuuwaku
+ゆうどう;yuudou
+さそいみず;sasoimizu
+ゆうしゅう;yuushuu
+うれえがお;ureegao
+ものうい;monoui
+ゆうわ;yuuwa
+きんゆう;kin_yuu
+ゆうずう;yuuzuu
+あたえぬし;ataenushi
+かんよ;kan_yo
+じゅよしき;juyoshiki
+めいよ;meiyo
+えいよ;eiyo
+ほまれたかい;homaretakai
+ちゅうよう;chuuyou
+ぼんよう;bon_you
+そようちょう;soyouchou
+ようすい;yousui
+あげば;ageba
+あげもの;agemono
+どうよう;douyou
+ゆりいす;yuriisu
+ゆれどめ;yuredome
+ようえき;youeki
+ようかい;youkai
+とけあう;tokeau
+ようつう;youtsuu
+こしにく;koshiniku
+ものごし;monogoshi
+おどりこ;odoriko
+ぶよう;buyou
+おどりじ;odoriji
+ようぎょう;yougyou
+ようぎょうか;yougyouka
+かんそうがま;kansougama
+ようご;yougo
+ようりつ;youritsu
+ほうよう;houyou
+ようきょく;youkyoku
+みんよう;min_you
+うたいぼん;utaibon
+よくし;yokushi
+よくあつ;yokuatsu
+よくせい;yokusei
+うよく;uyoku
+よくたん;yokutan
+よくりゅう;yokuryuu
+らしん;rashin
+せきらら;sekirara
+はだかうま;hadakauma
+られつ;raretsu
+らてん;raten
+もうらてき;mourateki
+らいう;raiu
+らいめい;raimei
+ぎょらい;gyorai
+しんらい;shinrai
+たよりない;tayorinai
+たのみ;tanomi
+れんらく;renraku
+からみあう;karamiau
+からみつく;karamitsuku
+らくのう;rakunou
+らくさん;rakusan
+かんらく;kanraku
+らんよう;ran_you
+らんぴ;ranpi
+はんらん;hanran
+らんかん;rankan
+くうらん;kuuran
+らんがい;rangai
+りいん;riin
+のうり;nouri
+りしゅう;rishuu
+げり;geri
+せきり;sekiri
+えきり;ekiri
+りれき;rireki
+りこう;rikou
+はきもの;hakimono
+ぶんり;bunri
+りりく;ririku
+ちばなれ;chibanare
+りゅうし;ryuushi
+かりゅうかい;karyuukai
+せんりゅう;senryuu
+きょうりゅう;kyouryuu
+りゅうじん;ryuujin
+たつまき;tatsumaki
+りゅうし;ryuushi
+ひとつぶ;hitotsubu
+りゅうりゅう;ryuuryuu
+りゅうせい;ryuusei
+りゅうき;ryuuki
+こうりゅう;kouryuu
+りゅうさん;ryuusan
+いおう;iou
+りゅうかぎん;ryuukagin
+りょしゅう;ryoshuu
+ほりょ;horyo
+ふりょ;furyo
+えんりょ;enryo
+こうりょ;kouryo
+むりょ;muryo
+りょうかい;ryoukai
+りょうしょう;ryoushou
+しゅうりょう;shuuryou
+りょうみ;ryoumi
+すずみだい;suzumidai
+すずかぜ;suzukaze
+りょうし;ryoushi
+りょうじゅう;ryoujuu
+しょうりょう;shouryou
+りょうぼ;ryoubo
+きゅうりょう;kyuuryou
+ごりょう;goryou
+どうりょう;douryou
+りょうゆう;ryouyuu
+かんりょう;kanryou
+りょうせい;ryousei
+りょうか;ryouka
+りょうちょう;ryouchou
+りょうほう;ryouhou
+りょうよう;ryouyou
+いりょうはん;iryouhan
+しょくりょう;shokuryou
+ひょうろう;hyourou
+りょうどう;ryoudou
+りんもう;rinmou
+にりん;nirin
+いちぶいちりん;ichibuichirin
+りんり;rinri
+じんりん;jinrin
+ぜつりん;zetsurin
+りんしつ;rinshitsu
+りんせつ;rinsetsu
+となりあう;tonariau
+るいかん;ruikan
+なみだあめ;namidaame
+そらなみだ;soranamida
+るいけい;ruikei
+るいせき;ruiseki
+けいるい;keirui
+どるい;dorui
+てきるい;tekirui
+るいしん;ruishin
+せいれい;seirei
+しょうれいきん;shoureikin
+はげみあう;hagemiau
+もどしぜい;modoshizei
+へんれい;henrei
+もどしそう;modoshisou
+でんれい;denrei
+ふうりん;fuurin
+すずなり;suzunari
+れいさい;reisai
+れいか;reika
+れいらく;reiraku
+ゆうれい;yuurei
+あくりょう;akuryou
+たまや;tamaya
+どれいせい;doreisei
+れいじゅう;reijuu
+れいぞく;reizoku
+ねんれい;nenrei
+みょうれい;myourei
+こうれい;kourei
+れいじん;reijin
+びれい;birei
+しゅうれい;shuurei
+れきねん;rekinen
+せいれき;seireki
+はなごよみ;hanagoyomi
+ひれつ;hiretsu
+れつじょう;retsujou
+れっとう;rettou
+れっか;rekka
+れつじょ;retsujo
+れっぷう;reppuu
+はれつ;haretsu
+ぶんれつ;bunretsu
+さけめ;sakeme
+れんあい;ren_ai
+しつれん;shitsuren
+こいびと;koibito
+れんちょく;renchoku
+れんか;renka
+はれんち;harenchi
+れんきんじゅつ;renkinjutsu
+れんせい;rensei
+ねりがね;nerigane
+ろへん;rohen
+だんろ;danro
+げんしろ;genshiro
+ろしゅつ;roshutsu
+よつゆ;yotsuyu
+ろてん;roten
+しんろう;shinrou
+ろうどう;roudou
+たろう;tarou
+はろう;harou
+ろうひ;rouhi
+ろうにん;rounin
+ろうか;rouka
+がろう;garou
+かいろう;kairou
+しょうろう;shourou
+ぼうろう;bourou
+ろうかく;roukaku
+ろうでん;rouden
+ろうしゅつ;roushutsu
+あまもり;amamori
+しゅうわい;shuuwai
+ぞうわい;zouwai
+まかないつき;makanaitsuki
+めいわく;meiwaku
+わくせい;wakusei
+とまどい;tomadoi
+わくぐみ;wakugumi
+わくなし;wakunashi
+わくない;wakunai
+こうわん;kouwan
+わんにゅう;wannyuu
+とうきょうわん;toukyouwan
+わんしょう;wanshou
+しゅわん;shuwan
+ほそうで;hosoude
+はな;hana
+もも;momo
+ばら;bara
+にほん;nihon
+にほんじん;nihonjin
+がくせい;gakusei
+かいしゃいん;kaishain
+いもうと;imouto
+いとこ;itoko
+ひと;hito
+ぎんこう;ginkou
+ゆうびんきょく;yuubinkyoku
+きって;kitte
+うりば;uriba
+ほん;hon
+びょういん;byouin
+としょかん;toshokan
+とうきょうえき;toukyoueki
+だいがく;daigaku
+しゃしん;shashin
+かいしゃ;kaisha
+じどうしゃ;jidousha
+しゅと;shuto
+めいし;meishi
+しごと;shigoto
+けんちくか;kenchikuka
+おとうと;otouto
+でんきすたんど;denkisutando
+ドイツ;doitsu
+ドイツジン;doitsujin
+カメラ;kamera
+タバコ;tabako
+メガネ;megane
+ノート;nooto
+ボールペン;boorupen
+イギリス;igirisu
+ロンダン;rondan
+びじゅつかん;bijutsukan
+あたり;atari
+ふん;fun
+こうじょう;koujou
+たてもの;tatemono
+げきじょう;gekijou
+まち;machi
+さけ;sake
+うみ;umi
+やま;yama
+みず;mizu
+にほんご;nihongo
+きかい;kikai
+ひとたち;hitotachi
+しょうせつ;shousetsu
+おんな;onna
+おんなのひと;onnanohito
+つぎ;tsugi
+むこう;mukou
+がか;gaka
+やね;yane
+れんが;renga
+タイヤ;taiya
+ホテル;hoteru
+タイプライター;taipuraitaa
+ビル;biru
+コーヒー;koohii
+ちいさい;chiisai
+ながい;nagai
+あかい;akai
+わかい;wakai
+おおきい;ookii
+やさしい;yasashii
+ふるい;furui
+やすい;yasui
+かるい;karui
+つよい;tsuyoi
+とおい;tooi
+しろい;shiroi
+おもい;omoi
+しんせつ;shinsetsu
+しずか;shizuka
+ゆうめい;yuumei
+たいへん;taihen
+とても;totemo
+ふん;fun
+えいぎょうか;eigyouka
+かちょう;kachou
+ほんだな;hondana
+けいさんき;keisanki
+こくばん;kokuban
+えんぴつ;enpitsu
+りんご;ringo
+どうろ;douro
+こども;kodomo
+おんなのこ;onnanoko
+おとこのこ;otokonoko
+いぬ;inu
+とり;tori
+ねこ;neko
+かんこくじん;kankokujin
+かぞく;kazoku
+しゅみ;shumi
+しゅうしゅう;shuushuu
+こうこうせい;koukousei
+きょうだい;kyoudai
+ドア;doa
+カレンダー;karendaa
+ロッカー;rokkaa
+トイレ;toire
+テレビ;terebi
+テーブル;teeburu
+コンピューター;konpyuutaa
+ゴルフ;gorufu
+ごるふじょう;gorufujou
+メンバー;menbaa
+クラブ;kurabu
+ヤード;yaado
+キャヂィー;kyadii
+うえ;ue
+うしろ;ushiro
+ひだり;hidari
+みぎ;migi
+よこ;yoko
+まんなか;mannaka
+おく;oku
+すみ;sumi
+かど;kado
+あいだ;aida
+いま;ima
+つ;tsu
+にん;nin
+さつ;satsu
+ほん;hon
+だい;dai
+ほう;hou
+ほほう;hohou
+はん;han
+ちゅうごくご;chuugokugo
+あさごはん;asagohan
+こうがい;kougai
+えき;eki
+しごと;shigoto
+りょこうしゃ;ryokousha
+してん;shiten
+ぜんこく;zenkoku
+しゅっちょう;shucchou
+しゃいん;shain
+がいしゅつ;gaishutsu
+てがみ;tegami
+てんいん;ten_in
+しゅるい;shurui
+ていか;teika
+めんぜい;menzei
+さつ;satsu
+ほしょうしょ;hoshousho
+じびき;jibiki
+えいご;eigo
+けんぽう;kenpou
+きねんび;kinenbi
+たばこや;tabakoya
+ぶどうしゅ;budoushu
+こうたい;koutai
+タクシー;takushii
+ビール;biiru
+パン;pan
+フイルム;fuirumu
+カラー;karaa
+ネガカラー;negakaraa
+ポジ;poji
+ズームレンズ;zuumurenzu
+ショートズーム;shootozuumu
+ミリ;miri
+ズーム;zuumu
+パスポート;pasupooto
+バス;basu
+きゅうしゅう;kyuushuu
+たいへん;taihen
+よく;yoku
+ときどき;tokidoki
+すこし;sukoshi
+ゆっくり;yukkuri
+めったに;mettani
+あさ;asa
+ひる;hiru
+よる;yoru
+らいしゅう;raishuu
+えん;en
+かい;kai
+ですから;desukara
+それでわ;soredewa
+でわじゃあ;dewajaa
+それから;sorekara
+なるほど;naruhodo
+から;kara
+まで;made
+ほど;hodo
+おきる;okiru
+みる;miru
+テレビおみる;terebiomiru
+いる;iru
+はじめる;hajimeru
+たべる;taberu
+でんわおかける;denwaokakeru
+ある;aru
+あるく;aruku
+いく;iku
+かかる;kakaru
+はじまる;hajimaru
+よむ;yomu
+のむ;nomu
+たばこおすう;tabakoosuu
+まつ;matsu
+しゅっちょうする;shucchousuru
+がいしゅつする;gaishutsusuru
+さんぽする;sanposuru
+ひるごはん;hirugohan
+ばんごはん;bangohan
+ちか;chika
+ちかてつ;chikatetsu
+しょくどう;shokudou
+ろうか;rouka
+いりぐち;iriguchi
+すし;sushi
+ちゅっちょうりょこう;chucchouryokou
+きっぷ;kippu
+こうつうこうしゃ;koutsuukousha
+ざせき;zaseki
+ざせきしていけん;zasekishiteiken
+していせき;shiteiseki
+しんだいけん;shindaiken
+しかた;shikata
+いき;iki
+かえり;kaeri
+はやおき;hayaoki
+こうちゃ;koucha
+ほうこくしょ;houkokusho
+えいが;eiga
+えいがかん;eigakan
+ともだち;tomodachi
+ふく;fuku
+くつ;kutsu
+したぎ;shitagi
+じょうくう;joukuu
+きゅうこう;kyuukou
+きゅうりょう;kyuuryou
+けっこん;kekkon
+なつ;natsu
+あき;aki
+ふゆ;fuyu
+しま;shima
+しまぐに;shimaguni
+おおきさ;ookisa
+じんこうみつど;jinkoumitsudo
+ぜんたい;zentai
+やま;yama
+かざん;kazan
+へいや;heiya
+かわ;kawa
+ゆき;yuki
+あめ;ame
+たいふう;taifuu
+もみじ;momiji
+こうよう;kouyou
+チャンネル;channeru
+エレベーター;erebeetaa
+カレーライス;kareeraisu
+コメヂィー;komedii
+きゅうてい;kyuutei
+ふじん;fujin
+じゅうにひとえ;juunihitoe
+こそで;kosode
+ふだんぎ;fudangi
+きこう;kikou
+そで;sode
+すそ;suso
+かつどう;katsudou
+ようふく;youfuku
+けっこんしき;kekkonshiki
+きかい;kikai
+ガイドブック;gaidobukku
+テント;tento
+ゲーム;geemu
+キャンプファイヤー;kyanpufaiyaa
+ループ;ruupu
+ワンピース;wanpiisu
+ツーピース;tsuupiisu
+スタイル;sutairu
+プウル;puuru
+ちょうせん;chousen
+さっぽろ;sapporo
+ましゅうこ;mashuuko
+しれとこはんとう;shiretokohantou
+ほだか;hodaka
+のりくら;norikura
+みなみアルプス;minamiarupusu
+きただけ;kitadake
+しょうなんかいがん;shounankaigan
+こけでら;kokedera
+おそい;osoi
+ひろい;hiroi
+ユニーク;yuniiku
+せいしき;seishiki
+とくべつ;tokubetsu
+ゆうだい;yuudai
+だいじょうぶ;daijoubu
+ちいさな;chiisana
+おなじ;onaji
+ドイツせい;doitsusei
+そんなに;sonnani
+じつに;jitsuni
+けっして;kesshite
+すこしも;sukoshimo
+あす;asu
+それとも;soretomo
+ばかり;bakari
+しか;shika
+だれも;daremo
+どこにも;dokonimo
+なにも;nanimo
+とも;tomo
+かんじる;kanjiru
+ににる;niniru
+コートをきる;kootowokiru
+かんがえる;kangaeru
+たずねる;tazuneru
+あける;akeru
+かさねる;kasaneru
+にのぼる;ninoboru
+ひらく;hiraku
+しぬ;shinu
+とぶ;tobu
+とまる;tomaru
+テントをはる;tentowoharu
+かこむ;kakomu
+はく;haku
+じゅうじつする;juujitsusuru
+はったつする;hattatsusuru
+にてきする;nitekisuru
+にかんどうする;nikandousuru
+あたり;atari
+しんごう;shingou
+ひゃく;hyaku
+こうさてん;kousaten
+がわ;gawa
+ほう;hou
+みせ;mise
+じしょ;jisho
+きそく;kisoku
+こえ;koe
+しょくじ;shokuji
+わしょく;washoku
+ちゅうかりょうり;chuukaryouri
+すしや;sushiya
+てっか;tekka
+もりあわせ;moriawase
+あかだし;akadashi
+のみもの;nomimono
+さしみ;sashimi
+いたまえ;itamae
+のうぎょう;nougyou
+のうぎょうこく;nougyoukoku
+のうぎょうじんこう;nougyoujinkou
+のうぎょうせいさんぶつ;nougyouseisanbutsu
+せんご;sengo
+せんぜん;senzen
+こうぎょう;kougyou
+こうぎょうこく;kougyoukoku
+ろうどうじんこう;roudoujinkou
+すいさんぎょう;suisangyou
+えんようぎょぎょう;en_yougyogyou
+だいいちじさんぎょう;daiichijisangyou
+だいにじさんぎょう;dainijisangyou
+だいさんじさんぎょう;daisanjisangyou
+サービスぎょう;saabisugyou
+きかいか;kikaika
+まわり;mawari
+えんがん;engan
+はいすい;haisui
+もくざい;mokuzai
+じゅよう;juyou
+きょうきゅう;kyoukyuu
+こくない;kokunai
+こくがい;kokugai
+がいこくじん;gaikokujin
+がいこくご;gaikokugo
+ゆにゅう;yunyuu
+ゆしゅつ;yushutsu
+てつ;tetsu
+どう;dou
+こうぶつ;koubutsu
+せきゆ;sekiyu
+せきたん;sekitan
+メートル;meetoru
+バイク;baiku
+ケーキ;keeki
+ペン;pen
+スウプ;suupu
+ジョギング;jogingu
+さむい;samui
+あつい;atsui
+あつい;atsui
+あたたかい;atatakai
+あたたかい;atatakai
+かわいそう;kawaisou
+きゅうそく;kyuusoku
+おも;omo
+すっかり;sukkari
+もっと;motto
+かならず;kanarazu
+ねんねん;nennen
+やく;yaku
+すぐ;sugu
+もともと;motomoto
+こんや;kon_ya
+このまえ;konomae
+みな;mina
+いっしょに;isshoni
+にちかん;nichikan
+しゅうかん;shuukan
+ねんかん;nenkan
+それに;soreni
+のうち;nouchi
+しめる;shimeru
+よごれる;yogoreru
+ふえる;fueru
+きをつける;kiwotsukeru
+まつ;matsu
+はらう;harau
+はたらく;hataraku
+とまる;tomaru
+まもる;mamoru
+すすむ;susumu
+にへる;niheru
+ねつがある;netsugaaru
+せんたくする;sentakusuru
+しゅっぱつする;shuppatsusuru
+ちゅうもんする;chuumonsuru
+ゆにゅうする;yunyuusuru
+ゆしゅつする;yushutsusuru
+あいさつする;aisatsusuru
+せいさんする;seisansuru
+りっしゅん;risshun
+りっか;rikka
+りっしゅう;risshuu
+りっとう;rittou
+はじまり;hajimari
+おわり;owari
+まなつ;manatsu
+まふゆ;mafuyu
+あつさ;atsusa
+はんじつ;hanjitsu
+はんつき;hantsuki
+はんとし;hantoshi
+かいすいよく;kaisuiyoku
+やまやま;yamayama
+まど;mado
+ぼんおどり;bon_odori
+わらいごえ;waraigoe
+けんぶつにん;kenbutsunin
+わ;wa
+からだ;karada
+くうこう;kuukou
+かいもの;kaimono
+は;ha
+きがえ;kigae
+やきゅう;yakyuu
+しゅうしょく;shuushoku
+こうこがく;koukogaku
+しりょう;shiryou
+てんのうけ;tennouke
+しぞく;shizoku
+うったえ;uttae
+はんだん;handan
+みやこ;miyako
+りゅうがくせい;ryuugakusei
+せいじたいせい;seijitaisei
+かくりつ;kakuritsu
+ちほう;chihou
+せいしん;seishin
+ざいせい;zaisei
+せいりょく;seiryoku
+ヨーロッパ;yooroppa
+ホーム;hoomu
+ドア;doa
+テニス;tenisu
+ラケット;raketto
+コート;kooto
+ベンチ;benchi
+ジュース;juusu
+バレーボール;bareebooru
+バスケットボール;basukettobooru
+スポーツ;supootsu
+テニスシューズ;tenisushuuzu
+ちゅうぶちほう;chuubuchihou
+こじき;kojiki
+じょうもんぶんか;joumonbunka
+やよいぶんか;yayoibunka
+こふんぶんか;kofunbunka
+あすかじだい;asukajidai
+ならじだい;narajidai
+しせいせいど;shiseiseido
+しょうとくたいし;shoutokutaishi
+ほうりゅうじ;houryuuji
+たいかのかいしん;taikanokaishin
+じんしんのらん;jinshinnoran
+とき;toki
+あいだ;aida
+さびしい;sabishii
+さわがしい;sawagashii
+すずしい;suzushii
+せまい;semai
+かしこい;kashikoi
+むしあつい;mushiatsui
+せいしんてき;seishinteki
+ざいせいてき;zaiseiteki
+いわゆる;iwayuru
+わが;waga
+ずっと;zutto
+すこし;sukoshi
+そのご;sonogo
+シャワーをあびる;shawaawoabiru
+のびる;nobiru
+ながれる;nagareru
+ながれる;nagareru
+ながれる;nagareru
+ラジオをつける;rajiowotsukeru
+ベンチにこしかける;benchinikoshikakeru
+わすれる;wasureru
+うったえる;uttaeru
+たてる;tateru
+つたえる;tsutaeru
+ごちそうをつくる;gochisouwotsukuru
+はく;haku
+ねむる;nemuru
+すわる;suwaru
+うごく;ugoku
+しまる;shimaru
+はをみがく;hawomigaku
+ねがう;negau
+とる;toru
+つくる;tsukuru
+つくる;tsukuru
+はんだんをくだす;handanwokudasu
+うつる;utsuru
+こまる;komaru
+うんてんする;untensuru
+しゅうしょくする;shuushokusuru
+かくりつする;kakuritsusuru
+しょくじをする;shokujiwosuru
+かいものをする;kaimonowosuru
+きがえをする;kigaewosuru
+テニスをする;tenisuwosuru
+やきゅうをする;yakyuuwosuru
+りゅうがくする;ryuugakusuru
+ちきゅう;chikyuu
+もとめる;motomeru
+すくう;sukuu
+やきもち;yakimochi
+すなお;sunao
+たいした;taishita
+うつ;utsu
+いじょう;ijou
+きゅうし;kyuushi
+びっくり;bikkuri
+みちしお;michishio
+をのぼる;wonoboru
+そびえとしゃかいしゅぎきょうわこくれんぽう;sobietoshakaishugikyouwakokurenpou
+ふけんこう;fukenkou
diff --git a/_test/tests/inc/utf8_romanize.cputest.php b/_test/tests/inc/utf8_romanize.cputest.php
new file mode 100644
index 000000000..66e3b76c9
--- /dev/null
+++ b/_test/tests/inc/utf8_romanize.cputest.php
@@ -0,0 +1,36 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+require_once DOKU_INC.'inc/utf8.php';
+
+class utf8_romanize_test extends PHPUnit_Framework_TestCase {
+
+ /**
+ * Check Japanese romanization
+ *
+ * @author Denis Scheither <amorphis@uni-bremen.de>
+ */
+ function test_japanese(){
+ $tests = file(dirname(__FILE__).'/utf8_kanaromaji.txt');
+ $line = 1;
+ foreach($tests as $test){
+ list($jap,$rom) = explode(';',trim($test));
+
+ $chk = utf8_romanize($jap);
+ #if($chk != $rom) echo "$jap\t->\t$chk\t!=\t$rom\t($line)\n";
+ $this->assertEquals($chk,$rom);
+ $line++;
+ }
+ }
+
+ /**
+ * Test romanization of character that would usually be deaccented in a different
+ * way FS#1117
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ function test_deaccented(){
+ $this->assertEquals("a A a A a o O",utf8_romanize("å Å ä Ä ä ö Ö"));
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_stripspecials.test.php b/_test/tests/inc/utf8_stripspecials.test.php
new file mode 100644
index 000000000..532430b60
--- /dev/null
+++ b/_test/tests/inc/utf8_stripspecials.test.php
@@ -0,0 +1,28 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+require_once DOKU_INC.'inc/utf8.php';
+
+class utf8_stripspecials extends DokuWikiTest {
+
+
+ function test1(){
+ // we test multiple cases here - format: string, repl, additional, test
+ $tests = array();
+ $tests[] = array('asciistring','','','asciistring');
+ $tests[] = array('asciistring','','\._\-:','asciistring');
+ $tests[] = array('ascii.string','','\._\-:','asciistring');
+ $tests[] = array('ascii.string',' ','\._\-:','ascii string');
+ $tests[] = array('2.1.14',' ','\._\-:','2 1 14');
+ $tests[] = array('ascii.string','','\._\-:\*','asciistring');
+ $tests[] = array('ascii.string',' ','\._\-:\*','ascii string');
+ $tests[] = array('2.1.14',' ','\._\-:\*','2 1 14');
+ $tests[] = array('string with nbsps','_','\*','string_with_nbsps');
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_stripspecials($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_substr.test.php b/_test/tests/inc/utf8_substr.test.php
new file mode 100644
index 000000000..19eea4eb4
--- /dev/null
+++ b/_test/tests/inc/utf8_substr.test.php
@@ -0,0 +1,43 @@
+<?php
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+require_once DOKU_INC.'inc/utf8.php';
+
+class utf8_substr_test extends DokuWikiTest {
+
+
+ function test1(){
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+ $tests[] = array('asciistring',2,null,'ciistring');
+ $tests[] = array('asciistring',2,4,'ciis');
+ $tests[] = array('asciistring',-4,null,'ring');
+ $tests[] = array('asciistring',2,-4,'ciist');
+ $tests[] = array('asciistring',-6,-2,'stri');
+
+ $tests[] = array('живπά우리をあöä',2,null,'вπά우리をあöä');
+ $tests[] = array('живπά우리をあöä',2,4,'вπά우');
+ $tests[] = array('живπά우리をあöä',-4,null,'をあöä');
+ $tests[] = array('живπά우리をあöä',2,-4,'вπά우리');
+ $tests[] = array('живπά우리をあöä',-6,-2,'우리をあ');
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+ function test2_bug891() {
+ // we test multiple cases here - format: in, offset, length, out
+ $tests = array();
+
+ $str = str_repeat('в',66000).'@@';
+ $tests[] = array($str, 65600, 1, 'в');
+ $tests[] = array($str,0,66002,$str);
+
+ foreach($tests as $test){
+ $this->assertEquals(utf8_substr($test[0],$test[1],$test[2]),$test[3]);
+ }
+ }
+
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_unicode.test.php b/_test/tests/inc/utf8_unicode.test.php
new file mode 100644
index 000000000..a34fec86d
--- /dev/null
+++ b/_test/tests/inc/utf8_unicode.test.php
@@ -0,0 +1,60 @@
+<?php
+
+require_once DOKU_INC.'inc/utf8.php';
+
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+
+class utf8_unicode_test extends DokuWikiTest {
+
+ function test_from_1byte(){
+ $in = 'a';
+ $out = array(97);
+ $this->assertEquals(utf8_to_unicode($in),$out);
+ }
+
+ function test_from_2byte(){
+ $in = "\xc3\xbc";
+ $out = array(252);
+ $this->assertEquals(utf8_to_unicode($in),$out);
+ }
+
+ function test_from_3byte(){
+ $in = "\xe2\x99\x8a";
+ $out = array(9802);
+ $this->assertEquals(utf8_to_unicode($in),$out);
+ }
+
+ function test_from_4byte(){
+ $in = "\xf4\x80\x80\x81";
+ $out = array(1048577);
+ $this->assertEquals(utf8_to_unicode($in),$out);
+ }
+
+ function test_to_1byte(){
+ $out = 'a';
+ $in = array(97);
+ $this->assertEquals(unicode_to_utf8($in),$out);
+ }
+
+ function test_to_2byte(){
+ $out = "\xc3\xbc";
+ $in = array(252);
+ $this->assertEquals(unicode_to_utf8($in),$out);
+ }
+
+ function test_to_3byte(){
+ $out = "\xe2\x99\x8a";
+ $in = array(9802);
+ $this->assertEquals(unicode_to_utf8($in),$out);
+ }
+
+ function test_to_4byte(){
+ $out = "\xf4\x80\x80\x81";
+ $in = array(1048577);
+ $this->assertEquals(unicode_to_utf8($in),$out);
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/utf8_utf16be.test.php b/_test/tests/inc/utf8_utf16be.test.php
new file mode 100644
index 000000000..0150a8e4a
--- /dev/null
+++ b/_test/tests/inc/utf8_utf16be.test.php
@@ -0,0 +1,28 @@
+<?php
+
+require_once DOKU_INC.'inc/utf8.php';
+
+// use no mbstring help here
+if(!defined('UTF8_NOMBSTRING')) define('UTF8_NOMBSTRING',1);
+
+class utf8_utf16be_test extends DokuWikiTest {
+ // some chars from various code regions
+ var $utf8 = '鈩ℵŁöx';
+ var $utf16 = "\x92\x29\x21\x35\x1\x41\x0\xf6\x0\x78";
+
+ /**
+ * Convert from UTF-8 to UTF-16BE
+ */
+ function test_to16be(){
+ $this->assertEquals(utf8_to_utf16be($this->utf8), $this->utf16);
+ }
+
+ /**
+ * Convert from UTF-16BE to UTF-8
+ */
+ function test_from16be(){
+ $this->assertEquals(utf16be_to_utf8($this->utf16),$this->utf8);
+ }
+}
+
+//Setup VIM: ex: et ts=2 :
diff --git a/_test/tests/lib/exe/css_css_compress.test.php b/_test/tests/lib/exe/css_css_compress.test.php
new file mode 100644
index 000000000..811b0cee8
--- /dev/null
+++ b/_test/tests/lib/exe/css_css_compress.test.php
@@ -0,0 +1,68 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/css.php';
+
+
+class css_css_compress_test extends DokuWikiTest {
+
+ function test_mlcom1(){
+ $text = '/**
+ * A multi
+ * line *test*
+ * check
+ */';
+ $this->assertEquals(css_compress($text), '');
+ }
+
+ function test_mlcom2(){
+ $text = '#comment/* */ {
+ color: lime;
+ }';
+ $this->assertEquals(css_compress($text), '#comment/* */{color:lime;}');
+ }
+
+ function test_slcom1(){
+ $text = '// this is a comment';
+ $this->assertEquals(css_compress($text), '');
+ }
+
+ function test_slcom2(){
+ $text = '#foo {
+ color: lime; // another comment
+ }';
+ $this->assertEquals(css_compress($text), '#foo{color:lime;}');
+ }
+
+ function test_slcom3(){
+ $text = '#foo {
+ background-image: url(http://foo.bar/baz.jpg);
+ }';
+ $this->assertEquals(css_compress($text), '#foo{background-image:url(http://foo.bar/baz.jpg);}');
+ }
+
+ function test_hack(){
+ $text = '/* Mac IE will not see this and continue with inline-block */
+ /* \\*/
+ display: inline;
+ /* */';
+ $this->assertEquals(css_compress($text), '/* \\*/display:inline;/* */');
+ }
+
+ function test_hack2(){
+ $text = '/* min-height hack for Internet Explorer http://www.cssplay.co.uk/boxes/minheight.html */
+ /*\\*/
+ * html .page {
+ height: 450px;
+ }
+ /**/';
+ $this->assertEquals(css_compress($text), '/*\\*/* html .page{height:450px;}/**/');
+ }
+
+ function test_nl1(){
+ $text = "a{left:20px;\ntop:20px}";
+ $this->assertEquals(css_compress($text), 'a{left:20px;top:20px}');
+ }
+
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/lib/exe/css_css_loadfile.test.php b/_test/tests/lib/exe/css_css_loadfile.test.php
new file mode 100644
index 000000000..c89b69b2c
--- /dev/null
+++ b/_test/tests/lib/exe/css_css_loadfile.test.php
@@ -0,0 +1,55 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/css.php';
+
+class css_css_loadfile_test extends DokuWikiTest {
+ public function setUp() {
+ $this->file = tempnam('/tmp', 'css');
+ }
+
+ private function csstest($input, $output = null, $location = 'http://www.example.com/') {
+ io_saveFile($this->file, $input);
+ $this->assertEquals(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
+ }
+
+ public function test_url_relative() {
+ $this->csstest('#test { background: url("test/test.png"); }', '#test { background: url("http://www.example.com/test/test.png"); }');
+ $this->csstest('#test { background: url(\'test/test.png\'); }', '#test { background: url(\'http://www.example.com/test/test.png\'); }');
+ }
+
+ public function test_url_absolute() {
+ $this->csstest('#test { background: url("/test/test.png"); }');
+ $this->csstest('#test { background: url(\'/test/test.png\'); }');
+ }
+
+ public function test_url_with_protocol() {
+ $this->csstest('#test { background: url("http://www.test.com/test/test.png"); }');
+ $this->csstest('#test { background: url("https://www.test.com/test/test.png"); }');
+ $this->csstest('#test { background: url(\'http://www.test.com/test/test.png\'); }');
+ $this->csstest('#test { background: url(\'https://www.test.com/test/test.png\'); }');
+ }
+
+ public function test_import_relative() {
+ $this->csstest('@import "test/test.png";', '@import "http://www.example.com/test/test.png";');
+ $this->csstest('@import \'test/test.png\';', '@import \'http://www.example.com/test/test.png\';');
+ }
+
+ public function test_import_absolute() {
+ $this->csstest('@import "/test/test.png";');
+ $this->csstest('@import \'/test/test.png\';');
+ }
+
+ public function test_import_with_protocol() {
+ $this->csstest('@import "http://www.test.com/test/test.png";');
+ $this->csstest('@import "https://www.test.com/test/test.png";');
+ $this->csstest('@import \'http://www.test.com/test/test.png\';');
+ $this->csstest('@import \'https://www.test.com/test/test.png\';');
+ }
+
+ public function tearDown() {
+ unlink($this->file);
+ unset($this->file);
+ }
+}
+
+//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/_test/tests/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
new file mode 100644
index 000000000..75c69c347
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -0,0 +1,128 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/js.php';
+
+
+class js_js_compress_test extends DokuWikiTest {
+
+ function test_mlcom1(){
+ $text = '/**
+ * A multi
+ * line *test*
+ * check
+ */';
+ $this->assertEquals(js_compress($text), '');
+ }
+
+ function test_mlcom2(){
+ $text = 'var foo=6;/* another comment */';
+ $this->assertEquals(js_compress($text), 'var foo=6;');
+ }
+
+ function test_mlcomcond(){
+ $text = '/*@if (@_win32)';
+ $this->assertEquals(js_compress($text), '/*@if(@_win32)');
+ }
+
+ function test_slcom1(){
+ $text = '// an comment';
+ $this->assertEquals(js_compress($text), '');
+ }
+
+ function test_slcom2(){
+ $text = 'var foo=6;// another comment ';
+ $this->assertEquals(js_compress($text), 'var foo=6;');
+ }
+
+ function test_slcom3(){
+ $text = 'var foo=6;// another comment / or something with // comments ';
+ $this->assertEquals(js_compress($text), 'var foo=6;');
+ }
+
+ function test_regex1(){
+ $text = 'foo.split( /[a-Z\/]*/ );';
+ $this->assertEquals(js_compress($text), 'foo.split(/[a-Z\/]*/);');
+ }
+
+ function test_regex_in_array(){
+ $text = '[/"/ , /"/ , /"/]';
+ $this->assertEquals(js_compress($text), '[/"/,/"/,/"/]');
+ }
+
+ function test_regex_in_hash(){
+ $text = '{ a : /"/ }';
+ $this->assertEquals(js_compress($text), '{a:/"/}');
+ }
+
+ function test_regex_preceded_by_spaces_caracters(){
+ $text = "text.replace( \t \r\n /\"/ , ".'"//" )';
+ $this->assertEquals(js_compress($text), 'text.replace(/"/,"//")');
+ }
+
+ function test_dquot1(){
+ $text = 'var foo="Now what \\" \'do we//get /*here*/ ?";';
+ $this->assertEquals(js_compress($text), $text);
+ }
+
+ function test_dquot2(){
+ $text = 'var foo="Now what \\\\\\" \'do we//get /*here*/ ?";';
+ $this->assertEquals(js_compress($text), $text);
+ }
+
+ function test_dquotrunaway(){
+ $text = 'var foo="Now where does it end';
+ $this->assertEquals(js_compress($text), $text);
+ }
+
+ function test_squot1(){
+ $text = "var foo='Now what \\' \"do we//get /*here*/ ?';";
+ $this->assertEquals(js_compress($text), $text);
+ }
+
+ function test_squotrunaway(){
+ $text = "var foo='Now where does it end";
+ $this->assertEquals(js_compress($text), $text);
+ }
+
+ function test_nl1(){
+ $text = "var foo=6;\nvar baz=7;";
+ $this->assertEquals(js_compress($text), 'var foo=6;var baz=7;');
+ }
+
+ function test_lws1(){
+ $text = " \t var foo=6;";
+ $this->assertEquals(js_compress($text), 'var foo=6;');
+ }
+
+ function test_tws1(){
+ $text = "var foo=6; \t ";
+ $this->assertEquals(js_compress($text), 'var foo=6;');
+ }
+
+ function test_shortcond(){
+ $text = "var foo = (baz) ? 'bar' : 'bla';";
+ $this->assertEquals(js_compress($text), "var foo=(baz)?'bar':'bla';");
+
+ }
+
+ function test_complexminified(){
+ $text = 'if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class=\'test e\'></div><div class=\'test\'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;foo="text/*";bla="*/"';
+
+ $this->assertEquals(js_compress($text),$text);
+ }
+
+ /**
+ * Test the files provided with the original JsStrip
+ */
+ function test_original(){
+ $files = glob(dirname(__FILE__).'/js_js_compress/test-*-in.js');
+
+ foreach($files as $file){
+ $info = "Using file $file";
+ $this->assertEquals(js_compress(file_get_contents($file)),
+ file_get_contents(substr($file,0,-5).'out.js'), $info);
+ };
+ }
+}
+
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js
new file mode 100644
index 000000000..771dc1640
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-in.js
@@ -0,0 +1,5 @@
+
+ var s = " /* this is a comment */ " ;
+
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js
new file mode 100644
index 000000000..7d6a5346e
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes1-out.js
@@ -0,0 +1 @@
+var s=" /* this is a comment */ "; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js
new file mode 100644
index 000000000..a59f1b774
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-in.js
@@ -0,0 +1,5 @@
+
+
+var s = "// this is a comment ";
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js
new file mode 100644
index 000000000..caa2fdca2
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInDoubleQuotes2-out.js
@@ -0,0 +1 @@
+var s="// this is a comment "; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js
new file mode 100644
index 000000000..845c59bdf
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-in.js
@@ -0,0 +1,5 @@
+
+ var s = ' /* this is a comment */ ' ;
+
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js
new file mode 100644
index 000000000..b2696cb98
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes1-out.js
@@ -0,0 +1 @@
+var s=' /* this is a comment */ '; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js
new file mode 100644
index 000000000..0459a4891
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-in.js
@@ -0,0 +1,5 @@
+
+
+var s = '// this is a comment ';
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js
new file mode 100644
index 000000000..21b6a410e
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentInSingleQuotes2-out.js
@@ -0,0 +1 @@
+var s='// this is a comment '; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js
new file mode 100644
index 000000000..b9d16a7bd
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-in.js
@@ -0,0 +1,11 @@
+
+ if (true) {
+ /* this
+ * is a
+ * multiline comment */
+ document.write("true"); /* this
+ is another
+ */
+
+}
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js
new file mode 100644
index 000000000..8eed2e57a
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentMultiline-out.js
@@ -0,0 +1 @@
+if(true){document.write("true");} \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js
new file mode 100644
index 000000000..302d7160b
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-in.js
@@ -0,0 +1,7 @@
+
+ if (true) {
+ // this is a single line comment
+ document.write("true") ; // another
+}
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js
new file mode 100644
index 000000000..8eed2e57a
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-CommentSingleLine-out.js
@@ -0,0 +1 @@
+if(true){document.write("true");} \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js
new file mode 100644
index 000000000..afc824762
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-in.js
@@ -0,0 +1,7 @@
+
+
+if ( true ) {
+ document.write("foo");
+} else {
+ document.write("bar");
+}
diff --git a/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js
new file mode 100644
index 000000000..2a982a98e
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseBraces-out.js
@@ -0,0 +1 @@
+if(true){document.write("foo");}else{document.write("bar");} \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js
new file mode 100644
index 000000000..79d10775e
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-in.js
@@ -0,0 +1,7 @@
+
+
+if ( true )
+ document.write("foo");
+ else
+ document.write("bar");
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js
new file mode 100644
index 000000000..b087c42fc
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-IfThenElseNoBraces-out.js
@@ -0,0 +1 @@
+if(true)document.write("foo");else document.write("bar"); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js
new file mode 100644
index 000000000..503e07283
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-in.js
@@ -0,0 +1,3 @@
+
+var r = / a backslash\// ;
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js
new file mode 100644
index 000000000..e5c83770c
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpBackslash-out.js
@@ -0,0 +1 @@
+var r=/ a backslash\//; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js
new file mode 100644
index 000000000..2741e74c2
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-in.js
@@ -0,0 +1,3 @@
+
+
+var r = /simple/g ;
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js
new file mode 100644
index 000000000..bb530b0a1
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimple-out.js
@@ -0,0 +1 @@
+var r=/simple/g; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js
new file mode 100644
index 000000000..c7dbdba3d
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-in.js
@@ -0,0 +1,5 @@
+
+
+ var r = / simple with whitespace /g ;
+
+
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js
new file mode 100644
index 000000000..5c2db510b
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpSimpleWhitespace-out.js
@@ -0,0 +1 @@
+var r=/ simple with whitespace /g; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js b/_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js
new file mode 100644
index 000000000..debb983e5
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpString-in.js
@@ -0,0 +1,3 @@
+
+ var r = "fruit" ;
+ r.replace ( /fruit/g, "apple") ;
diff --git a/_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js b/_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js
new file mode 100644
index 000000000..92ffc7d47
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-RegexpString-out.js
@@ -0,0 +1 @@
+var r="fruit";r.replace(/fruit/g,"apple"); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js
new file mode 100644
index 000000000..0c84c66ec
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-in.js
@@ -0,0 +1,2 @@
+var x = 0;
+ do x=x+1 while (x < 10);
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js
new file mode 100644
index 000000000..593e9a664
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementDoWhile-out.js
@@ -0,0 +1 @@
+var x=0;do x=x+1 while(x<10); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js
new file mode 100644
index 000000000..1b0aeb6ff
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-in.js
@@ -0,0 +1,2 @@
+for ( var x in foo )
+ document.write(x);
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js
new file mode 100644
index 000000000..95c85871e
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementForIn-out.js
@@ -0,0 +1 @@
+for(var x in foo)document.write(x); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js
new file mode 100644
index 000000000..61f357f34
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementNew-in.js
@@ -0,0 +1 @@
+var x = new Object(); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js
new file mode 100644
index 000000000..0d4ff7f58
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementNew-out.js
@@ -0,0 +1 @@
+var x=new Object(); \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js
new file mode 100644
index 000000000..39ffc1239
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-in.js
@@ -0,0 +1,4 @@
+var x = 1;
+switch (x) {
+ case 1: document.write(1);
+} \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js
new file mode 100644
index 000000000..e51c07371
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StatementSwitchCase-out.js
@@ -0,0 +1 @@
+var x=1;switch(x){case 1:document.write(1);} \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js
new file mode 100644
index 000000000..57fe13b90
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-in.js
@@ -0,0 +1,3 @@
+
+var s1 = "double \"quotes\"" ;
+var s2 = "'test'" ;
diff --git a/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js
new file mode 100644
index 000000000..9f91fc83d
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StringDoubleQuotes-out.js
@@ -0,0 +1 @@
+var s1="double \"quotes\"";var s2="'test'"; \ No newline at end of file
diff --git a/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js
new file mode 100644
index 000000000..bb5f9951a
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-in.js
@@ -0,0 +1,8 @@
+
+var s1 = 'single \'quotes\' ' ;
+
+var s2= '/* test */' ;
+
+var s3 = '// test' ;
+
+var s4 = '"test"' ;
diff --git a/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js
new file mode 100644
index 000000000..f38b26544
--- /dev/null
+++ b/_test/tests/lib/exe/js_js_compress/test-StringSingleQuotes-out.js
@@ -0,0 +1 @@
+var s1='single \'quotes\' ';var s2='/* test */';var s3='// test';var s4='"test"'; \ No newline at end of file
diff --git a/_test/tests/test/basic.test.php b/_test/tests/test/basic.test.php
new file mode 100644
index 000000000..ca788a91d
--- /dev/null
+++ b/_test/tests/test/basic.test.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsBasicTest extends DokuWikiTest {
+ /**
+ * Execute the simplest possible request and expect
+ * a dokuwiki page which obviously has the word "DokuWiki"
+ * in it somewhere.
+ */
+ function testSimpleRun() {
+ $request = new TestRequest();
+
+ $response = $request->execute();
+
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+}
diff --git a/_test/tests/test/globals.test.php b/_test/tests/test/globals.test.php
new file mode 100644
index 000000000..b45b2bf83
--- /dev/null
+++ b/_test/tests/test/globals.test.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsGlobalsTest extends DokuWikiTest {
+
+ /**
+ * every request should be with its own variables
+ */
+ function testFirstRun() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $request->setServer('testvar', true);
+
+ $self = $this;
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use ($self) {
+ $self->assertTrue($_SERVER['testvar'], 'Server variable not set correctly: testvar');
+ $self->assertEquals('87.142.120.6', $_SERVER['REMOTE_ADDR'], 'Server variable not set correctly: REMOTE_ADDR');
+ $_SERVER['tmpvar'] = true;
+ }
+ );
+
+ $request->execute();
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $request->setServer('testvar', false);
+
+ $self = $this;
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use ($self) {
+ $self->assertFalse($_SERVER['testvar'], 'Server variable not set correctly: testvar');
+ $self->assertEquals('87.142.120.6', $_SERVER['REMOTE_ADDR'], 'Server variable not set correctly: REMOTE_ADDR');
+ $self->assertFalse(isset($_SERVER['tmpvar']));
+ }
+ );
+
+ $request->execute();
+ }
+}
diff --git a/_test/tests/test/hooks.test.php b/_test/tests/test/hooks.test.php
new file mode 100644
index 000000000..621b9f9b8
--- /dev/null
+++ b/_test/tests/test/hooks.test.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsHooksTest extends DokuWikiTest {
+
+ function testHookTriggering() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertTrue($hookTriggered, 'Hook was not triggered as expected!');
+ }
+}
diff --git a/_test/tests/test/phpquery.test.php b/_test/tests/test/phpquery.test.php
new file mode 100644
index 000000000..188d834cb
--- /dev/null
+++ b/_test/tests/test/phpquery.test.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPHPQueryTest extends DokuWikiTest {
+ /**
+ * Execute the simplest possible request and check the
+ * meta generator tag is set to "DokuWiki"
+ */
+ function testSimpleRun() {
+ $request = new TestRequest();
+
+ $response = $request->execute();
+
+ $this->assertEquals('DokuWiki', $response->queryHTML('meta[name="generator"]')->attr('content') );
+ }
+}
diff --git a/_test/tests/test/plugins.test.php b/_test/tests/test/plugins.test.php
new file mode 100644
index 000000000..ac6d1ee45
--- /dev/null
+++ b/_test/tests/test/plugins.test.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPluginsTest extends DokuWikiTest {
+
+ function setUp() {
+ $this->pluginsEnabled = array(
+ 'testing'
+ );
+
+ parent::setUp();
+ }
+
+ function testTestingPluginEnabled() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TESTING_PLUGIN_INSTALLED', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertTrue($hookTriggered, 'Testing plugin did not trigger!');
+ }
+}
diff --git a/_test/tests/test/plugins_defaults.test.php b/_test/tests/test/plugins_defaults.test.php
new file mode 100644
index 000000000..a96dac931
--- /dev/null
+++ b/_test/tests/test/plugins_defaults.test.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsPluginsDefaultTest extends DokuWikiTest {
+
+ function testTestingPluginDisabledDefault() {
+ global $EVENT_HANDLER;
+
+ $request = new TestRequest();
+ $hookTriggered = false;
+
+ $EVENT_HANDLER->register_hook('TESTING_PLUGIN_INSTALLED', 'AFTER', null,
+ function() use (&$hookTriggered) {
+ $hookTriggered = true;
+ }
+ );
+
+ $request->execute();
+
+ $this->assertFalse($hookTriggered, 'Testing plugin did trigger!');
+ }
+}
diff --git a/_test/tests/test/reset.test.php b/_test/tests/test/reset.test.php
new file mode 100644
index 000000000..7c5978543
--- /dev/null
+++ b/_test/tests/test/reset.test.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsScopeTest extends DokuWikiTest {
+
+ public $triggered = false;
+
+ function testFirstRun(){
+ global $conf;
+ $conf['foo'] = 'bar';
+
+ global $EVENT_HANDLER;
+ $self = $this;
+ $EVENT_HANDLER->register_hook('DOKUWIKI_STARTED', 'AFTER', null,
+ function() use ($self) {
+ $self->triggered = true;
+ }
+ );
+ $request = new TestRequest();
+ $request->execute();
+ $this->assertTrue($this->triggered);
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun(){
+ global $conf;
+ $this->assertFalse(isset($conf['foo']), 'conf setting');
+
+ $request = new TestRequest();
+ $request->execute();
+
+ $this->assertFalse($this->triggered, 'trigger');
+ }
+
+}
diff --git a/_test/tests/test/scope.test.php b/_test/tests/test/scope.test.php
new file mode 100644
index 000000000..9341ecef8
--- /dev/null
+++ b/_test/tests/test/scope.test.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @group integration
+ */
+class InttestsResetTest extends DokuWikiTest {
+ /**
+ * It should be possible to have two test cases within one test class.
+ */
+ function testFirstRun() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+
+ /**
+ * @depends testFirstRun
+ */
+ function testSecondRun() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+
+ /**
+ * two requests within the same test case should be possible
+ */
+ function testMultipleRequests() {
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+
+ $request = new TestRequest();
+ $response = $request->execute();
+ $this->assertTrue(
+ strpos($response->getContent(), 'DokuWiki') >= 0,
+ 'DokuWiki was not a word in the output'
+ );
+ }
+}