Full Code of subchen/javadoc.chm for AI

master 35962199b32a cached
40 files
54.8 KB
13.8k tokens
92 symbols
1 requests
Download .txt
Repository: subchen/javadoc.chm
Branch: master
Commit: 35962199b32a
Files: 40
Total size: 54.8 KB

Directory structure:
gitextract_wgl9zdc4/

├── .classpath
├── .gitignore
├── .project
├── .settings/
│   └── org.eclipse.core.resources.prefs
├── CHANGELOG.md
├── LICENSE
├── NOTICE
├── README.md
├── build.gradle
├── build.properties
├── build.xml
├── dist/
│   └── javadoc.chm-2.1.0.jar
├── lib/
│   ├── commons-collections-3.2.1.jar
│   ├── commons-io-2.4.jar
│   ├── commons-lang-2.6.jar
│   ├── commons-logging-1.1.1.jar
│   ├── log4j-1.2.17.jar
│   └── velocity-1.7.jar
├── run.bat
└── src/
    └── main/
        ├── java/
        │   └── jetbrick/
        │       └── tools/
        │           └── chm/
        │               ├── Application.java
        │               ├── Config.java
        │               ├── TemplateWriter.java
        │               ├── model/
        │               │   ├── ClassInfo.java
        │               │   ├── FieldInfo.java
        │               │   ├── MethodInfo.java
        │               │   └── PackageInfo.java
        │               ├── reader/
        │               │   ├── AnchorNameManager.java
        │               │   ├── ApiReader.java
        │               │   ├── IndexesReader.java
        │               │   ├── JavaInfoReader.java
        │               │   └── KeyManager.java
        │               └── style/
        │                   ├── Javadoc7Style.java
        │                   ├── Javadoc8Style.java
        │                   └── JavadocStyle.java
        └── resources/
            ├── log4j.properties
            └── template/
                ├── build.vm
                ├── hhc.vm
                ├── hhk.vm
                ├── hhp.vm
                └── redir.vm

================================================
FILE CONTENTS
================================================

================================================
FILE: .classpath
================================================
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src/main/java"/>
	<classpathentry kind="src" path="src/main/resources"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="lib" path="lib/commons-collections-3.2.1.jar"/>
	<classpathentry kind="lib" path="lib/commons-io-2.4.jar"/>
	<classpathentry kind="lib" path="lib/commons-logging-1.1.1.jar"/>
	<classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/>
	<classpathentry kind="lib" path="lib/velocity-1.7.jar"/>
	<classpathentry kind="lib" path="lib/commons-lang-2.6.jar"/>
	<classpathentry kind="output" path="bin"/>
</classpath>


================================================
FILE: .gitignore
================================================
*.class

# Package Files #
*.war
*.ear

# Build Directorys #
/.gradle
/build
/bin
*.log


================================================
FILE: .project
================================================
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>javadoc.chm</name>
	<comment></comment>
	<projects>
	</projects>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments>
			</arguments>
		</buildCommand>
	</buildSpec>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
</projectDescription>


================================================
FILE: .settings/org.eclipse.core.resources.prefs
================================================
eclipse.preferences.version=1
encoding/<project>=UTF-8


================================================
FILE: CHANGELOG.md
================================================
Version 2.1.0 (2014-03-25)
-----------------------------

* javadoc 8 support


Version 2.0.0 (2013-11-16)
-----------------------------

* rename package
* add license


Version 1.0.0 (2013-04-17)
-----------------------------

* support java 6 & 7 style
* first public release


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: NOTICE
================================================
javadoc.chm
http://subchen.github.io/javadoc.chm/

Copyright 2010-2014 Guoqiang Chen. All rights reserved.
Email: subchen@gmail.com

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


================================================
FILE: README.md
================================================
# What's this?

This software generates an Microsoft HTML Help(CHM) from generic javadoc style API documents.
It's a easy way to search something from javadoc with pre-compiled full text index.

Javadoc.chm can identify the new doc style for java 8.0+.

# Requirements

* [Java](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
* [HTML Help Workshop](http://msdn.microsoft.com/en-us/library/ms669985.aspx)

# How to

Download binary jar

https://github.com/subchen/javadoc.chm/raw/master/dist/javadoc.chm-2.1.0.jar

Generates HTML Help project files

```
java -Xms256m -Xmx512m -jar javadoc.chm-xxx.jar <javadoc-api-dir> <file-encoding>
```

Compile the HTML Help

```
build.bat
```

To change the default language option of hhp file, modify htmlhelp.hhp.

```
"Language=0x409 English (U.S.)"
```


================================================
FILE: build.gradle
================================================
apply plugin: 'java'

sourceCompatibility = 1.6
targetCompatibility = 1.6
version = '2.1.0'

defaultTasks 'runtimejar'

tasks.withType(Compile) {
	options.encoding = "utf-8"
}

dependencies {
	compile fileTree(dir: 'lib', include: '**/*.jar')
}

jar {
    manifest {
        attributes 'Main-Class': 'jetbrick.tools.chm.Application'
    }
}

task runtimejar(dependsOn: jar) {
    def outputFile = 'build/libs/javadoc.chm.jar'
    doLast {
        new File(outputFile).delete()

        ant.jar(
            destfile: outputFile,
            filesetmanifest: 'merge',
            duplicate: 'preserve'
        ) {
            fileTree(dir: 'lib', include: '**/*.jar').each {
                zipfileset(src: it, includes: '**/*.class')
            }
            //zipgroupfileset(dir: 'lib', includes: '*.jar')
            zipgroupfileset(dir: 'build/libs', includes: '**/*.jar')
        }
    }
}



================================================
FILE: build.properties
================================================
maven.group.id = com.github.subchen
maven.artifact.id = javadoc.chm
maven.version = 2.1.0
 
product.name = ${maven.artifact.id}
product.version = ${maven.version}
product.author = Guoqiang Chen
product.vendor = subchen@gmail.com
 
build.dir = ${basedir}/build
classes.dir = ${build.dir}/classes
dist.dir = ${build.dir}

ant.build.javac.source = 1.6
ant.build.javac.target = 1.6
javac.encoding = utf-8
 
dist.jar = ${dist.dir}/${product.name}-${product.version}.jar


================================================
FILE: build.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>

<project default="dist" basedir=".">
    <property file="${basedir}/build.properties" />

    <path id="compile.classpath">
        <fileset dir="${basedir}/lib" includes="**/*.jar" />
    </path>
    <path id="compile.sourcepath">
        <pathelement location="${basedir}/src/main/java"/>
    </path>
    <path id="compile.resources">
        <fileset dir="${basedir}/src/main/resources" excludes="**/*.java" />
    </path>

    <target name="clean">
        <delete dir="${build.dir}" quiet="true" />
    </target>

    <target name="compile" depends="clean">
        <mkdir dir="${classes.dir}" />
        <javac destdir="${classes.dir}"
               classpathref="compile.classpath"
               debug="on" nowarn="true" deprecation="off"
               encoding="${javac.encoding}"
               includeantruntime="off">
            <src refid="compile.sourcepath" />
        </javac>
        <copy todir="${classes.dir}">
            <path refid="compile.resources" />
        </copy>
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="${dist.dir}" />
        <jar jarfile="${dist.jar}" whenempty="fail">
            <fileset dir="${classes.dir}" includes="**" />
            <manifest>
                <attribute name="Built-By" value="${product.author}" />
                <attribute name="Implementation-Vendor" value="${product.vendor}" />
                <attribute name="Implementation-Title" value="${product.name}" />
                <attribute name="Implementation-Version" value="${product.version}" />
                <attribute name="Main-Class" value="jetbrick.tools.chm.Application" />
            </manifest>
        </jar>
    </target>

    <target name="dist" depends="jar">
        
    </target>

</project>


================================================
FILE: run.bat
================================================
set classpath=%classpath%;lib/commons-collections-3.2.1.jar
set classpath=%classpath%;lib/commons-io-2.4.jar
set classpath=%classpath%;lib/commons-lang-2.6.jar
set classpath=%classpath%;lib/commons-logging-1.1.1.jar
set classpath=%classpath%;lib/log4j-1.2.17.jar
set classpath=%classpath%;lib/velocity-1.7.jar
set classpath=%classpath%;dist/javadoc.chm-2.1.0.jar
 
java -Xms512m -Xmx512m jetbrick.tools.chm.Application %*



================================================
FILE: src/main/java/jetbrick/tools/chm/Application.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import jetbrick.tools.chm.reader.ApiReader;
import jetbrick.tools.chm.style.*;
import org.apache.commons.io.FileUtils;

public class Application {

    public static void main(String[] args) throws Exception {
        if (args.length > 0) {
            Config.apiLocation = new File(args[0]);
        }
        if (args.length > 1) {
            Config.encoding = args[1];
        }

        if (new File(Config.apiLocation, "resources/fonts").exists()) {
            Config.style = new Javadoc8Style();
        } else if (new File(Config.apiLocation, "resources/background.gif").exists()) {
            Config.style = new Javadoc7Style();
        } else {
            Config.style = new JavadocStyle();
        }

        clean();

        ApiReader api = new ApiReader();
        Map<String, Object> apiContext = api.getApiContext();

        TemplateWriter writer = new TemplateWriter();
        writer.apply(apiContext);
    }

    private static void clean() throws IOException {
        File f = new File(Config.apiLocation, "htmlhelp.hhp");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "htmlhelp.hhc");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "htmlhelp.hhk");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "build.bat");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "hhc.exe");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "hha.dll");
        if (f.exists()) f.delete();
        f = new File(Config.apiLocation, "redirs/");
        if (f.exists()) FileUtils.deleteDirectory(f);
    }

}


================================================
FILE: src/main/java/jetbrick/tools/chm/Config.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm;

import java.io.File;
import java.nio.charset.Charset;
import jetbrick.tools.chm.style.JavadocStyle;

public class Config {

    public static File apiLocation = new File(".");
    public static String encoding = Charset.defaultCharset().name();

    public static JavadocStyle style = new JavadocStyle();

}


================================================
FILE: src/main/java/jetbrick/tools/chm/TemplateWriter.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm;

import java.io.*;
import java.util.Collection;
import java.util.Map;
import jetbrick.tools.chm.reader.KeyManager;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

public class TemplateWriter {
    private final VelocityEngine ve;

    public TemplateWriter() {
        ve = new VelocityEngine();
        ve.init();
    }

    public void apply(Map<String, Object> context) throws Exception {
        context.put("encoding", Config.encoding);

        // write redir html.
        @SuppressWarnings("unchecked")
        Collection<KeyManager> keyManagers = (Collection<KeyManager>) context.get("keyManagers");
        for (KeyManager keyManager : keyManagers) {
            if (keyManager.isRepeat()) {
                keyManager.sort();
                context.put("keyManager", keyManager);
                renderTemplate(keyManager.getUrl(), context, "/template/redir.vm");
            }
        }

        // write project files.
        renderTemplate("htmlhelp.hhp", context, "/template/hhp.vm");
        renderTemplate("htmlhelp.hhk", context, "/template/hhk.vm");
        renderTemplate("htmlhelp.hhc", context, "/template/hhc.vm");
        renderTemplate("build.bat", context, "/template/build.vm");

        // write hhc.exe, hha.dll
        outputBinaryFile("hhc.exe", "/bin/hhc.exe");
        outputBinaryFile("hha.dll", "/bin/hha.dll");
    }

    private void renderTemplate(String fileName, Map<String, Object> context, String templateName) throws Exception {
        File file = new File(Config.apiLocation, fileName);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        System.out.println(file);

        String templateContent = IOUtils.toString(getClass().getResourceAsStream(templateName), "utf-8");

        VelocityContext ctx = new VelocityContext(context);
        Writer writer = new OutputStreamWriter(new FileOutputStream(file), Config.encoding);
        ve.evaluate(ctx, writer, "", templateContent);
        writer.close();
    }

    private void outputBinaryFile(String fileName, String templateName) throws Exception {
        File file = new File(Config.apiLocation, fileName);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        System.out.println(file);

        InputStream is = getClass().getResourceAsStream(templateName);
        OutputStream os = new FileOutputStream(file);
        IOUtils.copy(is, os);
        IOUtils.closeQuietly(is);
        IOUtils.closeQuietly(os);
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/model/ClassInfo.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.model;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;

public class ClassInfo {

    private String fullName;
    private String shortName;
    private String url;
    private List<FieldInfo> fields = new ArrayList<FieldInfo>();
    private List<MethodInfo> methods = new ArrayList<MethodInfo>();

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setShortName(String shortName) {
        this.shortName = shortName;
    }

    public String getShortName() {
        return this.shortName;
    }

    public String getPackageName() {
        return StringUtils.remove(this.fullName, "." + this.shortName);
    }

    public void addField(FieldInfo info) {
        fields.add(info);
    }

    public void addMethod(MethodInfo info) {
        methods.add(info);
    }

    public List<FieldInfo> getFields() {
        return fields;
    }

    public List<MethodInfo> getMethods() {
        return methods;
    }

}


================================================
FILE: src/main/java/jetbrick/tools/chm/model/FieldInfo.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.model;

public class FieldInfo {
    private String name;
    private String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

}


================================================
FILE: src/main/java/jetbrick/tools/chm/model/MethodInfo.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.model;

public class MethodInfo {

    private String name;
    private String fullName;
    private String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getFullName() {
        return this.fullName;
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/model/PackageInfo.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.model;

import java.util.ArrayList;
import java.util.List;

public class PackageInfo {

    private String name;
    private String url;
    private List<ClassInfo> classes = new ArrayList<ClassInfo>();

    public List<ClassInfo> getClasses() {
        return classes;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void addClass(ClassInfo classinfo) {
        classes.add(classinfo);
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/reader/AnchorNameManager.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.reader;

import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jetbrick.tools.chm.Config;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class AnchorNameManager {

    public static void addAnchor(File file, String encoding) throws IOException {
        String html = FileUtils.readFileToString(file, encoding);
        html = html.replace('$', '\uFFE5');

        Pattern p = Config.style.getAnchorNameRegex();
        Matcher m = p.matcher(html);

        int findCount = 0;
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            findCount++;
            String anchor = m.group(1);
            // String oldAnchor = m.group();
            String oldAnchor = "<A HH=\"1\" NAME=\"" + anchor + "\">";
            String newAnchor = "<A HH=\"1\" NAME=\"" + getNewAnchorName(anchor) + "\"></A>";
            m.appendReplacement(sb, newAnchor + oldAnchor);
        }
        m.appendTail(sb);

        System.out.println("addAnchor(" + findCount + ") : " + file);

        if (findCount > 0) {
            html = sb.toString().replace('\uFFE5', '$');
            FileUtils.writeStringToFile(file, html, encoding);
        }
        html = null;
    }

    public static String replaceAnchor(String url) {
        String anchor = StringUtils.substringAfter(url, "#");
        if ("".equals(anchor)) return url;
        return StringUtils.substringBefore(url, "#") + "#" + getNewAnchorName(anchor);
    }

    public static String getNewAnchorName(String anchor) {
        return "HH_" + Math.abs(anchor.hashCode());
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/reader/ApiReader.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.reader;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jetbrick.tools.chm.Config;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class ApiReader {
    private JavaInfoReader javaInfoReader = new JavaInfoReader();
    private IndexesReader indexesReader = new IndexesReader();
    private Map<String, Object> context = new HashMap<String, Object>();

    public Map<String, Object> getApiContext() throws Exception {
        // add all files
        Set<String> files = getAllFiles(Config.apiLocation, new HashSet<String>());

        // replace anthor
        Iterator<String> it = files.iterator();
        while (it.hasNext()) {
            String file = it.next();
            if (file.endsWith(".html")) {
                AnchorNameManager.addAnchor(new File(Config.apiLocation, file), Config.encoding);
            }
        }

        // add index url
        context.put("indexUrl", getIndexUrl(new File(Config.apiLocation, "index.html")));

        // add title
        String doctitle = getApiTitle(new File(Config.apiLocation, "index.html"));
        context.put("title", doctitle);

        // add packages
        context.put("packages", javaInfoReader.getJavaInfo());

        // add indexes
        File resource = new File(Config.apiLocation, "index-all.html");
        if (resource.exists()) {
            Map<String, String> indexesMap = indexesReader.getIndexes(resource);
            context.put("sortIndexes", sortIndexed(indexesMap));
        } else {
            File resourceDir = new File(Config.apiLocation, "index-files/");
            File resources[] = resourceDir.listFiles();
            Map<String, String> indexesMap = new HashMap<String, String>();
            for (File res : resources) {
                if (res.isDirectory()) continue;
                indexesMap.putAll(indexesReader.getIndexes(res));
            }
            context.put("sortIndexes", sortIndexed(indexesMap));
        }
        Collection<KeyManager> keyManagers = indexesReader.getKeyManagers();
        context.put("keyManagers", keyManagers);

        // add redir files
        for (KeyManager keyManager : keyManagers) {
            if (keyManager.isRepeat()) {
                files.add(keyManager.getUrl());
            }
        }
        context.put("files", files);

        return context;
    }

    private List<Map.Entry<String, String>> sortIndexed(Map<String, String> indexesMap) {
        List<Map.Entry<String, String>> sortIndexes = new ArrayList<Map.Entry<String, String>>(indexesMap.size());
        sortIndexes.addAll(indexesMap.entrySet());
        Collections.sort(sortIndexes, new Comparator<Map.Entry<String, String>>() {
            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                return o1.getKey().toLowerCase().compareTo(o2.getKey().toLowerCase());
            }
        });
        return sortIndexes;
    }

    private Set<String> getAllFiles(File rootdir, Set<String> files) {
        for (File resource : rootdir.listFiles()) {
            if (resource.isDirectory()) {
                getAllFiles(resource, files);
            } else {
                String filename = resource.getAbsolutePath();
                filename = StringUtils.remove(filename, Config.apiLocation.getAbsolutePath() + "\\");
                filename = filename.replace('\\', '/');
                files.add(filename);
            }
        }
        return files;
    }

    private String getApiTitle(File resource) throws IOException {
        Pattern p = Config.style.getApiTitleRegex();
        Matcher m = p.matcher(FileUtils.readFileToString(resource, Config.encoding));

        if (m.find()) {
            return m.group(1).trim();
        }
        return "Javadoc API";
    }

    private String getIndexUrl(File resource) throws IOException {
        Pattern p = Config.style.getIndexUrlRegex();
        Matcher m = p.matcher(FileUtils.readFileToString(resource, Config.encoding));

        if (m.find()) {
            return m.group(1).trim();
        }
        return "overview-summary.html";
    }

}


================================================
FILE: src/main/java/jetbrick/tools/chm/reader/IndexesReader.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.reader;

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jetbrick.tools.chm.Config;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class IndexesReader {

    private Map<String, KeyManager> keyManagerMaps = new HashMap<String, KeyManager>(256);

    public Map<String, String> getIndexes(File resource) throws IOException {
        Pattern p = Config.style.getIndexRegex();
        Matcher m = p.matcher(FileUtils.readFileToString(resource, Config.encoding));

        Map<String, String> indexMaps = new HashMap<String, String>(1024);
        while (m.find()) {
            addIndex(indexMaps, m.group(2), m.group(1));
        }
        return indexMaps;
    }

    private void addIndex(Map<String, String> indexMaps, String text, String url) throws FileNotFoundException {
        String key;
        String urlToUse = url;
        urlToUse = StringUtils.remove(urlToUse, "../");
        urlToUse = StringUtils.remove(urlToUse, "./");

        if (url.indexOf('#') < 0) {
            key = text + " class";
        } else {
            key = StringUtils.substringBefore(text, "(");
            if (text.indexOf('(') != -1) {
                key = key + "()";
            }

            String textToUse = StringUtils.substringBefore(urlToUse, ".html");
            textToUse = textToUse.replace('/', '.') + "." + text;
            KeyManager keyManager = keyManagerMaps.get(key);
            String urlRedir = "../" + urlToUse;
            if (keyManager == null) {
                keyManager = new KeyManager(key);
                keyManager.add(textToUse, AnchorNameManager.replaceAnchor(urlRedir));
                keyManagerMaps.put(key, keyManager);
            } else { // repeat
                keyManager.add(textToUse, AnchorNameManager.replaceAnchor(urlRedir));
                // redirect
                urlToUse = keyManager.getUrl();
            }
        }
        indexMaps.put(key, AnchorNameManager.replaceAnchor(urlToUse));
    }

    public Collection<KeyManager> getKeyManagers() {
        return keyManagerMaps.values();
    }

}


================================================
FILE: src/main/java/jetbrick/tools/chm/reader/JavaInfoReader.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.reader;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jetbrick.tools.chm.Config;
import jetbrick.tools.chm.model.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class JavaInfoReader {

    public List<PackageInfo> getJavaInfo() throws IOException {
        return getAllPackages(new File(Config.apiLocation, "package-list"));
    }

    private List<PackageInfo> getAllPackages(File resource) throws IOException {
        List<String> lines = FileUtils.readLines(resource, Config.encoding);

        Map<String, PackageInfo> packageMaps = new HashMap<String, PackageInfo>(32);
        List<PackageInfo> packages = new ArrayList<PackageInfo>(50);
        for (String line : lines) {
            line = line.trim();
            if (line.length() != 0) {
                PackageInfo p = new PackageInfo();
                p.setName(line);
                p.setUrl(line.replace('.', '/') + "/package-summary.html");
                packageMaps.put(p.getName(), p);
                packages.add(p);
            }
        }

        // add all classes to package
        List<ClassInfo> classes = getAllClasses(new File(Config.apiLocation, "allclasses-frame.html"));
        for (ClassInfo classinfo : classes) {
            PackageInfo p = packageMaps.get(classinfo.getPackageName());
            p.addClass(classinfo);
        }

        return packages;
    }

    private List<ClassInfo> getAllClasses(File resource) throws IOException {
        Pattern p = Config.style.getJavaClassRegex();
        Matcher m = p.matcher(FileUtils.readFileToString(resource, Config.encoding));

        List<ClassInfo> classes = new ArrayList<ClassInfo>(128);
        while (m.find()) {
            ClassInfo info = new ClassInfo();
            info.setFullName(m.group(2).replace('/', '.'));
            info.setUrl(m.group(1));
            info.setShortName(m.group(3));
            classes.add(info);

            System.out.println("class: " + info.getUrl());
            addClassFieldMethod(info);
        }
        return classes;
    }

    private void addClassFieldMethod(ClassInfo classinfo) throws IOException {
        File file = new File(Config.apiLocation, classinfo.getUrl());
        String html = FileUtils.readFileToString(file, Config.encoding);

        Pattern p = Config.style.getJavaFieldRegex();
        Matcher m = p.matcher(html);

        while (m.find()) {
            String name = m.group(2);
            String url = m.group(1);

            url = StringUtils.remove(url, "../");
            url = StringUtils.remove(url, "./");

            String anchor = StringUtils.substringAfter(url, "#");
            String linkUrl = StringUtils.substringBefore(url, "#") + "#" + AnchorNameManager.getNewAnchorName(anchor);

            if (Config.style.isMethod(url)) {
                MethodInfo info = new MethodInfo();
                info.setName(name);
                info.setFullName(Config.style.getMethodFullName(url));
                info.setUrl(linkUrl);
                classinfo.addMethod(info);
            } else {
                FieldInfo info = new FieldInfo();
                info.setName(name);
                info.setUrl(linkUrl);
                classinfo.addField(info);
            }
        }
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/reader/KeyManager.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.reader;

import java.util.*;
import org.apache.commons.lang.StringUtils;

public class KeyManager {
    private String key;
    private String url;
    private List<String> pairs = new ArrayList<String>();

    public KeyManager(String key) {
        this.key = key;
        this.url = "redirs/" + StringUtils.replace(key, "()", "_") + Math.abs(key.hashCode()) + ".html";
    }

    public String getKey() {
        return key;
    }

    public void add(String name, String url) {
        String text;
        if (name.indexOf('(') >= 0) {
            text = StringUtils.replace(name, key + "(", "<b>" + key + "</b>(");
        } else {
            text = StringUtils.replace(name, "." + key, ".<b>" + key + "</b>");
        }
        text = "<a href='" + url + "'>" + text + "</a>";
        pairs.add(text);
    }

    public boolean isRepeat() {
        return pairs.size() > 1;
    }

    public List<String> getPairs() {
        return pairs;
    }

    public String getUrl() {
        return url;
    }

    public void sort() {
        Collections.sort(pairs);
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/style/Javadoc7Style.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.style;

import java.util.regex.Pattern;

public class Javadoc7Style extends JavadocStyle {

    @Override
    public Pattern getAnchorNameRegex() {
        return Pattern.compile("<a name=\"([^\"]*)\"[^>]*>");
    }

    @Override
    public Pattern getIndexRegex() {
        return Pattern.compile("<dt><span class=\"strong\"><a href=\"([^\"]*)\"[^>]*>([^<]*)</a></span>");
    }

    @Override
    public Pattern getJavaClassRegex() {
        return Pattern.compile("<a href=\"(([^\"]*)\\.html)\"[^>]*>(?:<i>)?([^<]*)(?:</i>)?</a>");
    }

    @Override
    public Pattern getJavaFieldRegex() {
        return Pattern.compile("<td class=\"col[a-zA-Z]+\"><code><strong><a href=\"([^\"]*)\"[^>]*>([^<]*)</a>");
    }

    @Override
    public Pattern getIndexUrlRegex() {
        return Pattern.compile("<a href=\"([^\"]*)\"[^>]*>");
    }

    @Override
    public Pattern getApiTitleRegex() {
        return Pattern.compile("<title>([^<]*)</title>");
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/style/Javadoc8Style.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 *
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.style;

import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;

public class Javadoc8Style extends JavadocStyle {
    @Override
    public Pattern getAnchorNameRegex() {
        return Pattern.compile("<a name=\"([^\"]*)\"[^>]*>");
    }

    @Override
    public Pattern getIndexRegex() {
        return Pattern.compile("<dt>(?:<span class=\"memberNameLink\">)?<a href=\"([^\"]*)\"[^>]*>(?:<span class=\"typeNameLink\">)?([^<]*)(?:</span>)?</a>");
    }

    @Override
    public Pattern getJavaClassRegex() {
        return Pattern.compile("<a href=\"(([^\"]*)\\.html)\"[^>]*>(?:<span class=\"interfaceName\">)?([^<]*)(?:</span>)?</a>");
    }

    @Override
    public Pattern getJavaFieldRegex() {
        return Pattern.compile("<td class=\"colLast\"><code><span class=\"memberNameLink\"><a href=\"([^\"]*)\"[^>]*>([^<]*)</a>");
    }

    @Override
    public Pattern getIndexUrlRegex() {
        return Pattern.compile("<a href=\"([^\"]*)\"[^>]*>");
    }

    @Override
    public Pattern getApiTitleRegex() {
        return Pattern.compile("<title>([^<]*)</title>");
    }

    @Override
    public boolean isMethod(String url) {
        return url.endsWith("-");
    }

    @Override
    public String getMethodFullName(String url) {
        String name = StringUtils.substringAfter(url, "#");
        int count = StringUtils.countMatches(name, "-");
        name = StringUtils.replaceOnce(name, "-", "(");
        for (int i = 0; i < count - 2; i++) {
            name = StringUtils.replaceOnce(name, "-", ", ");
        }
        name = StringUtils.replaceOnce(name, "-", ")");
        name = StringUtils.replace(name, ":A", "[]");
        return name;
    }
}


================================================
FILE: src/main/java/jetbrick/tools/chm/style/JavadocStyle.java
================================================
/**
 * javadoc.chm
 * http://subchen.github.io/javadoc.chm/
 * 
 * Copyright 2010-2014 Guoqiang Chen. All rights reserved.
 * Email: subchen@gmail.com
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jetbrick.tools.chm.style;

import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;

public class JavadocStyle {

    public Pattern getAnchorNameRegex() {
        return Pattern.compile("<A NAME=\"([^\"]*)\"[^>]*>");
    }

    public Pattern getIndexRegex() {
        return Pattern.compile("<DT><A HREF=\"([^\"]*)\"[^>]*><B>([^<]*)</B></A>");
    }

    public Pattern getJavaClassRegex() {
        return Pattern.compile("<A HREF=\"(([^\"]*)\\.html)\"[^>]*>(?:<I>)?([^<]*)(?:</I>)?</A>");
    }

    public Pattern getJavaFieldRegex() {
        return Pattern.compile("<TD><CODE><B><A HREF=\"([^\"]*)\"[^>]*>([^<]*)</A>");
    }

    public Pattern getIndexUrlRegex() {
        return Pattern.compile("<A HREF=\"([^\"]*)\"[^>]*>");
    }

    public Pattern getApiTitleRegex() {
        return Pattern.compile("<TITLE>([^<]*)</TITLE>");
    }

    public boolean isMethod(String url) {
        return url.endsWith("(");
    }

    public String getMethodFullName(String url) {
        return StringUtils.substringAfter(url, "#");
    }
}


================================================
FILE: src/main/resources/log4j.properties
================================================
log4j.logger.jetbrick=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=(%F:%L) - %m%n

================================================
FILE: src/main/resources/template/build.vm
================================================
start hhc htmlhelp.hhp

================================================
FILE: src/main/resources/template/hhc.vm
================================================
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
  	<meta name="GENERATOR" content="jetbrick&reg; javadoc.chm">
</HEAD>

<BODY>
<OBJECT type="text/site properties">
	<param name="Window Styles" value="0x800025">
</OBJECT>
#foreach ($package in $packages)
<UL>
	<LI><OBJECT type="text/sitemap">
    		<param name="Name" value="${package.name}">
    		<param name="Local" value="${package.url}">
		</OBJECT>
	</LI>
	<UL>
#foreach ($c in $package.classes)
		<LI><OBJECT type="text/sitemap">
    			<param name="Name" value="${c.shortName}">
    			<param name="Local" value="${c.url}">
    			<param name="ImageNumber" value="9">
			</OBJECT>
		</LI>
#if ($c.methods.size() > 0)
		<UL>
#foreach ($m in $c.methods)
			<LI><OBJECT type="text/sitemap">
    				<param name="Name" value="${m.fullName}">
    				<param name="Local" value="${m.url}">
    				<param name="ImageNumber" value="11">
				</OBJECT>
			</LI>
#end
		</UL>
#end
#end
	</UL>
</UL>
#end
</BODY></HTML>


================================================
FILE: src/main/resources/template/hhk.vm
================================================
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
  	<meta name="GENERATOR" content="jetbrick&reg; javadoc.chm">
</HEAD>

<BODY>
<UL>
#foreach ($index in $sortIndexes)
	<LI><OBJECT type="text/sitemap">
    		<param name="Keyword" value="${index.key}">
    ##		<param name="Name" value="${index.value}">
    		<param name="Local" value="${index.value}">
		</OBJECT>
	</LI>
#end
</UL>
</BODY></HTML>


================================================
FILE: src/main/resources/template/hhp.vm
================================================
[OPTIONS]
Compatibility=1.1 or later
Contents file=htmlhelp.hhc
Index file=htmlhelp.hhk
Title=${title} - by http://subchen.github.io/
Default topic=${indexUrl}
Compiled file=${title}.chm
Display compile progress=Yes
Binary Index=Yes
Full-text search=Yes
Language=0x804
Default Window=main

[WINDOWS]
main=,"htmlhelp.hhc","htmlhelp.hhk","${indexUrl}","${indexUrl}",,,,,0x23420,,0x187e,,0x118b0000,,,,,,0


[FILES]
#foreach ($f in $files)
$f
#end



================================================
FILE: src/main/resources/template/redir.vm
================================================
<html><head>
<title>Occurences of ${keyManager.key}</title>
<meta http-equiv=Content-Type content="text/html; charset=${encoding}">
</head>
<body style='{font-family:Verdana,Arial; font-size:10pt; }'>

<dl>
<dt><b>${keyManager.key}</b> occurences:
#foreach ($m in $keyManager.pairs)
<dd>${m}</dd>
#end
</dl>

<br/>
<br/>
<p style="border-top:1px solid #ccc; padding: 20px;">
Copyright 2010-2014 Guoqiang Chen. All rights reserved. <br/>
<a href="http://subchen.github.io/" target="_blank">http://subchen.github.io/</a> &nbsp; subchen@gmail.com
</p>

</body></html>
Download .txt
gitextract_wgl9zdc4/

├── .classpath
├── .gitignore
├── .project
├── .settings/
│   └── org.eclipse.core.resources.prefs
├── CHANGELOG.md
├── LICENSE
├── NOTICE
├── README.md
├── build.gradle
├── build.properties
├── build.xml
├── dist/
│   └── javadoc.chm-2.1.0.jar
├── lib/
│   ├── commons-collections-3.2.1.jar
│   ├── commons-io-2.4.jar
│   ├── commons-lang-2.6.jar
│   ├── commons-logging-1.1.1.jar
│   ├── log4j-1.2.17.jar
│   └── velocity-1.7.jar
├── run.bat
└── src/
    └── main/
        ├── java/
        │   └── jetbrick/
        │       └── tools/
        │           └── chm/
        │               ├── Application.java
        │               ├── Config.java
        │               ├── TemplateWriter.java
        │               ├── model/
        │               │   ├── ClassInfo.java
        │               │   ├── FieldInfo.java
        │               │   ├── MethodInfo.java
        │               │   └── PackageInfo.java
        │               ├── reader/
        │               │   ├── AnchorNameManager.java
        │               │   ├── ApiReader.java
        │               │   ├── IndexesReader.java
        │               │   ├── JavaInfoReader.java
        │               │   └── KeyManager.java
        │               └── style/
        │                   ├── Javadoc7Style.java
        │                   ├── Javadoc8Style.java
        │                   └── JavadocStyle.java
        └── resources/
            ├── log4j.properties
            └── template/
                ├── build.vm
                ├── hhc.vm
                ├── hhk.vm
                ├── hhp.vm
                └── redir.vm
Download .txt
SYMBOL INDEX (92 symbols across 15 files)

FILE: src/main/java/jetbrick/tools/chm/Application.java
  class Application (line 29) | public class Application {
    method main (line 31) | public static void main(String[] args) throws Exception {
    method clean (line 56) | private static void clean() throws IOException {

FILE: src/main/java/jetbrick/tools/chm/Config.java
  class Config (line 26) | public class Config {

FILE: src/main/java/jetbrick/tools/chm/TemplateWriter.java
  class TemplateWriter (line 30) | public class TemplateWriter {
    method TemplateWriter (line 33) | public TemplateWriter() {
    method apply (line 38) | public void apply(Map<String, Object> context) throws Exception {
    method renderTemplate (line 63) | private void renderTemplate(String fileName, Map<String, Object> conte...
    method outputBinaryFile (line 78) | private void outputBinaryFile(String fileName, String templateName) th...

FILE: src/main/java/jetbrick/tools/chm/model/ClassInfo.java
  class ClassInfo (line 26) | public class ClassInfo {
    method getFullName (line 34) | public String getFullName() {
    method setFullName (line 38) | public void setFullName(String fullName) {
    method getUrl (line 42) | public String getUrl() {
    method setUrl (line 46) | public void setUrl(String url) {
    method setShortName (line 50) | public void setShortName(String shortName) {
    method getShortName (line 54) | public String getShortName() {
    method getPackageName (line 58) | public String getPackageName() {
    method addField (line 62) | public void addField(FieldInfo info) {
    method addMethod (line 66) | public void addMethod(MethodInfo info) {
    method getFields (line 70) | public List<FieldInfo> getFields() {
    method getMethods (line 74) | public List<MethodInfo> getMethods() {

FILE: src/main/java/jetbrick/tools/chm/model/FieldInfo.java
  class FieldInfo (line 22) | public class FieldInfo {
    method getName (line 26) | public String getName() {
    method setName (line 30) | public void setName(String name) {
    method getUrl (line 34) | public String getUrl() {
    method setUrl (line 38) | public void setUrl(String url) {

FILE: src/main/java/jetbrick/tools/chm/model/MethodInfo.java
  class MethodInfo (line 22) | public class MethodInfo {
    method getName (line 28) | public String getName() {
    method setName (line 32) | public void setName(String name) {
    method getUrl (line 36) | public String getUrl() {
    method setUrl (line 40) | public void setUrl(String url) {
    method setFullName (line 44) | public void setFullName(String fullName) {
    method getFullName (line 48) | public String getFullName() {

FILE: src/main/java/jetbrick/tools/chm/model/PackageInfo.java
  class PackageInfo (line 25) | public class PackageInfo {
    method getClasses (line 31) | public List<ClassInfo> getClasses() {
    method getName (line 35) | public String getName() {
    method setName (line 39) | public void setName(String name) {
    method getUrl (line 43) | public String getUrl() {
    method setUrl (line 47) | public void setUrl(String url) {
    method addClass (line 51) | public void addClass(ClassInfo classinfo) {

FILE: src/main/java/jetbrick/tools/chm/reader/AnchorNameManager.java
  class AnchorNameManager (line 30) | public class AnchorNameManager {
    method addAnchor (line 32) | public static void addAnchor(File file, String encoding) throws IOExce...
    method replaceAnchor (line 60) | public static String replaceAnchor(String url) {
    method getNewAnchorName (line 66) | public static String getNewAnchorName(String anchor) {

FILE: src/main/java/jetbrick/tools/chm/reader/ApiReader.java
  class ApiReader (line 31) | public class ApiReader {
    method getApiContext (line 36) | public Map<String, Object> getApiContext() throws Exception {
    method sortIndexed (line 88) | private List<Map.Entry<String, String>> sortIndexed(Map<String, String...
    method getAllFiles (line 99) | private Set<String> getAllFiles(File rootdir, Set<String> files) {
    method getApiTitle (line 113) | private String getApiTitle(File resource) throws IOException {
    method getIndexUrl (line 123) | private String getIndexUrl(File resource) throws IOException {

FILE: src/main/java/jetbrick/tools/chm/reader/IndexesReader.java
  class IndexesReader (line 30) | public class IndexesReader {
    method getIndexes (line 34) | public Map<String, String> getIndexes(File resource) throws IOException {
    method addIndex (line 45) | private void addIndex(Map<String, String> indexMaps, String text, Stri...
    method getKeyManagers (line 76) | public Collection<KeyManager> getKeyManagers() {

FILE: src/main/java/jetbrick/tools/chm/reader/JavaInfoReader.java
  class JavaInfoReader (line 32) | public class JavaInfoReader {
    method getJavaInfo (line 34) | public List<PackageInfo> getJavaInfo() throws IOException {
    method getAllPackages (line 38) | private List<PackageInfo> getAllPackages(File resource) throws IOExcep...
    method getAllClasses (line 64) | private List<ClassInfo> getAllClasses(File resource) throws IOException {
    method addClassFieldMethod (line 82) | private void addClassFieldMethod(ClassInfo classinfo) throws IOExcepti...

FILE: src/main/java/jetbrick/tools/chm/reader/KeyManager.java
  class KeyManager (line 25) | public class KeyManager {
    method KeyManager (line 30) | public KeyManager(String key) {
    method getKey (line 35) | public String getKey() {
    method add (line 39) | public void add(String name, String url) {
    method isRepeat (line 50) | public boolean isRepeat() {
    method getPairs (line 54) | public List<String> getPairs() {
    method getUrl (line 58) | public String getUrl() {
    method sort (line 62) | public void sort() {

FILE: src/main/java/jetbrick/tools/chm/style/Javadoc7Style.java
  class Javadoc7Style (line 24) | public class Javadoc7Style extends JavadocStyle {
    method getAnchorNameRegex (line 26) | @Override
    method getIndexRegex (line 31) | @Override
    method getJavaClassRegex (line 36) | @Override
    method getJavaFieldRegex (line 41) | @Override
    method getIndexUrlRegex (line 46) | @Override
    method getApiTitleRegex (line 51) | @Override

FILE: src/main/java/jetbrick/tools/chm/style/Javadoc8Style.java
  class Javadoc8Style (line 25) | public class Javadoc8Style extends JavadocStyle {
    method getAnchorNameRegex (line 26) | @Override
    method getIndexRegex (line 31) | @Override
    method getJavaClassRegex (line 36) | @Override
    method getJavaFieldRegex (line 41) | @Override
    method getIndexUrlRegex (line 46) | @Override
    method getApiTitleRegex (line 51) | @Override
    method isMethod (line 56) | @Override
    method getMethodFullName (line 61) | @Override

FILE: src/main/java/jetbrick/tools/chm/style/JavadocStyle.java
  class JavadocStyle (line 25) | public class JavadocStyle {
    method getAnchorNameRegex (line 27) | public Pattern getAnchorNameRegex() {
    method getIndexRegex (line 31) | public Pattern getIndexRegex() {
    method getJavaClassRegex (line 35) | public Pattern getJavaClassRegex() {
    method getJavaFieldRegex (line 39) | public Pattern getJavaFieldRegex() {
    method getIndexUrlRegex (line 43) | public Pattern getIndexUrlRegex() {
    method getApiTitleRegex (line 47) | public Pattern getApiTitleRegex() {
    method isMethod (line 51) | public boolean isMethod(String url) {
    method getMethodFullName (line 55) | public String getMethodFullName(String url) {
Condensed preview — 40 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (62K chars).
[
  {
    "path": ".classpath",
    "chars": 668,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src/main/java\"/>\n\t<classpathentry k"
  },
  {
    "path": ".gitignore",
    "chars": 99,
    "preview": "*.class\r\n\r\n# Package Files #\r\n*.war\r\n*.ear\r\n\r\n# Build Directorys #\r\n/.gradle\r\n/build\r\n/bin\r\n*.log\r\n"
  },
  {
    "path": ".project",
    "chars": 370,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>javadoc.chm</name>\n\t<comment></comment>\n\t<projects>\n\t"
  },
  {
    "path": ".settings/org.eclipse.core.resources.prefs",
    "chars": 55,
    "preview": "eclipse.preferences.version=1\nencoding/<project>=UTF-8\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 279,
    "preview": "Version 2.1.0 (2014-03-25)\n-----------------------------\n\n* javadoc 8 support\n\n\nVersion 2.0.0 (2013-11-16)\n-------------"
  },
  {
    "path": "LICENSE",
    "chars": 11560,
    "preview": "\r\n                                 Apache License\r\n                           Version 2.0, January 2004\r\n               "
  },
  {
    "path": "NOTICE",
    "chars": 672,
    "preview": "javadoc.chm\r\nhttp://subchen.github.io/javadoc.chm/\r\n\r\nCopyright 2010-2014 Guoqiang Chen. All rights reserved.\r\nEmail: su"
  },
  {
    "path": "README.md",
    "chars": 816,
    "preview": "# What's this?\n\nThis software generates an Microsoft HTML Help(CHM) from generic javadoc style API documents.\nIt's a eas"
  },
  {
    "path": "build.gradle",
    "chars": 897,
    "preview": "apply plugin: 'java'\n\nsourceCompatibility = 1.6\ntargetCompatibility = 1.6\nversion = '2.1.0'\n\ndefaultTasks 'runtimejar'\n\n"
  },
  {
    "path": "build.properties",
    "chars": 483,
    "preview": "maven.group.id = com.github.subchen\r\nmaven.artifact.id = javadoc.chm\r\nmaven.version = 2.1.0\r\n \r\nproduct.name = ${maven.a"
  },
  {
    "path": "build.xml",
    "chars": 1806,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project default=\"dist\" basedir=\".\">\n    <property file=\"${basedir}/build.proper"
  },
  {
    "path": "run.bat",
    "chars": 433,
    "preview": "set classpath=%classpath%;lib/commons-collections-3.2.1.jar\r\nset classpath=%classpath%;lib/commons-io-2.4.jar\r\nset class"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/Application.java",
    "chars": 2471,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/Config.java",
    "chars": 1063,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/TemplateWriter.java",
    "chars": 3424,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/model/ClassInfo.java",
    "chars": 2007,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/model/FieldInfo.java",
    "chars": 1102,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/model/MethodInfo.java",
    "chars": 1300,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/model/PackageInfo.java",
    "chars": 1394,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/reader/AnchorNameManager.java",
    "chars": 2450,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/reader/ApiReader.java",
    "chars": 5074,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/reader/IndexesReader.java",
    "chars": 2951,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/reader/JavaInfoReader.java",
    "chars": 4201,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/reader/KeyManager.java",
    "chars": 1859,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/style/Javadoc7Style.java",
    "chars": 1738,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/style/Javadoc8Style.java",
    "chars": 2431,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n *\n * Copyright 2010-2014 Guoqiang Chen. All rights reserved"
  },
  {
    "path": "src/main/java/jetbrick/tools/chm/style/JavadocStyle.java",
    "chars": 1812,
    "preview": "/**\n * javadoc.chm\n * http://subchen.github.io/javadoc.chm/\n * \n * Copyright 2010-2014 Guoqiang Chen. All rights reserve"
  },
  {
    "path": "src/main/resources/log4j.properties",
    "chars": 217,
    "preview": "log4j.logger.jetbrick=DEBUG, stdout\r\n\r\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\r\nlog4j.appender.stdout.lay"
  },
  {
    "path": "src/main/resources/template/build.vm",
    "chars": 22,
    "preview": "start hhc htmlhelp.hhp"
  },
  {
    "path": "src/main/resources/template/hhc.vm",
    "chars": 1022,
    "preview": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n  \t<meta name=\"GENERATOR\" content=\"jetbrick&reg; javadoc"
  },
  {
    "path": "src/main/resources/template/hhk.vm",
    "chars": 427,
    "preview": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\r\n<HTML>\r\n<HEAD>\r\n  \t<meta name=\"GENERATOR\" content=\"jetbrick&reg; javadoc"
  },
  {
    "path": "src/main/resources/template/hhp.vm",
    "chars": 468,
    "preview": "[OPTIONS]\r\nCompatibility=1.1 or later\r\nContents file=htmlhelp.hhc\r\nIndex file=htmlhelp.hhk\r\nTitle=${title} - by http://s"
  },
  {
    "path": "src/main/resources/template/redir.vm",
    "chars": 586,
    "preview": "<html><head>\r\n<title>Occurences of ${keyManager.key}</title>\r\n<meta http-equiv=Content-Type content=\"text/html; charset="
  }
]

// ... and 7 more files (download for full content)

About this extraction

This page contains the full source code of the subchen/javadoc.chm GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 40 files (54.8 KB), approximately 13.8k tokens, and a symbol index with 92 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!