Initial revision
This commit is contained in:
commit
c6d6116ff2
24 changed files with 8183 additions and 0 deletions
436
license/opl_license.txt
Normal file
436
license/opl_license.txt
Normal file
|
@ -0,0 +1,436 @@
|
|||
OPEN PUBLIC LICENSE
|
||||
Version 1.0
|
||||
|
||||
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the
|
||||
Modifications made by that particular Contributor.
|
||||
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism
|
||||
generally accepted in the software development community for the
|
||||
electronic transfer of data.
|
||||
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by
|
||||
Exhibit A.
|
||||
|
||||
1.7. "Larger Work" means a work, which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this
|
||||
License.
|
||||
|
||||
1.8. "License" means this document and the corresponding addendum
|
||||
described in section 6.4 below.
|
||||
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files,
|
||||
a Modification is:
|
||||
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code
|
||||
or previous Modifications.
|
||||
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A
|
||||
as Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
|
||||
1.11. "Source Code" means the preferred form of the Covered Code
|
||||
for making modifications to it, including all modules it contains,
|
||||
plus any associated interface definition files, scripts used to
|
||||
control compilation and installation of an Executable, or a list of
|
||||
source code differential comparisons against either the Original
|
||||
Code or another well known, available Covered Code of the
|
||||
Contributor's choice. The Source Code can be in a compressed or
|
||||
archival form, provided the appropriate decompression or
|
||||
de-archiving software is widely available for no charge.
|
||||
|
||||
1.12. "You" means an individual or a legal entity exercising rights
|
||||
under, and complying with all of the terms of, this License or a
|
||||
future version of this License issued under Section 6.1. For legal
|
||||
entities, "You'' includes any entity which controls, is controlled
|
||||
by, or is under common control with You. For purposes of this
|
||||
definition, "control'' means (a) the power, direct or indirect, to
|
||||
cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of fifty percent (50%) or
|
||||
more of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
|
||||
1.13 "License Author" means Lutris Technologies, Inc.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a worldwide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) to use, reproduce, modify, display, perform,
|
||||
sublicense and distribute the Original Code (or portions
|
||||
thereof) with or without Modifications, or as part of a
|
||||
Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by
|
||||
Initial Developer, to make, have made, use and sell (``offer
|
||||
to sell and import'') the Original Code (or portions
|
||||
thereof), but solely to the extent that any such patent is
|
||||
reasonably necessary to enable You to Utilize the Original
|
||||
Code (or portions thereof) and not to any greater extent
|
||||
that may be necessary to Utilize further Modifications or
|
||||
combinations.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Each Contributor hereby grants You a worldwide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) to use, reproduce, modify, display, perform,
|
||||
sublicense and distribute the Modifications created by such
|
||||
Contributor (or portions thereof) either on an unmodified
|
||||
basis, with other Modifications, as Covered Code or as part
|
||||
of a Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by
|
||||
Contributor, to to make, have made, use and sell (``offer to
|
||||
sell and import'') the Contributor Version (or portions
|
||||
thereof), but solely to the extent that any such patent is
|
||||
reasonably necessary to enable You to Utilize the
|
||||
Contributor Version (or portions thereof), and not to any
|
||||
greater extent that may be necessary to Utilize further
|
||||
Modifications or combinations
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future
|
||||
version of this License released under Section 6.1, and You must
|
||||
include a copy of this License with every copy of the Source Code
|
||||
You distribute. You may not offer or impose any terms on any Source
|
||||
Code version that alters or restricts the applicable version of
|
||||
this License or the recipients' rights hereunder. However, You may
|
||||
include an additional document offering the additional rights
|
||||
described in Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must
|
||||
be made available, prior to any use, except for internal
|
||||
development and practice, in Source Code form under the terms of
|
||||
this License either on the same media as an Executable version or
|
||||
via an accepted Electronic Distribution Mechanism to anyone to whom
|
||||
you made an Executable version available; and if made available via
|
||||
Electronic Distribution Mechanism, must remain available for at
|
||||
least twelve (12) months after the date it initially became
|
||||
available, or at least six (6) months after a subsequent version of
|
||||
that particular Modification has been made available to such
|
||||
recipients. You shall notify the Initial Developer of the
|
||||
Modification and the location of the Source Code via the contact
|
||||
means provided for in the Developer Specific license. Initial
|
||||
Developer will be acting as maintainer of the Source Code and may
|
||||
provide an Electronic Distribution mechanism for the Modification
|
||||
to be made available.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which you contribute to contain
|
||||
a file documenting the changes You made to create that Covered Code
|
||||
and the date of any change. You must include a prominent statement
|
||||
that the Modification is derived, directly or indirectly, from
|
||||
Original Code provided by the Initial Developer and including the
|
||||
name of the Initial Developer in (a) the Source Code, and (b) in
|
||||
any notice in an Executable version or related documentation in
|
||||
which You describe the origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
|
||||
(a) Third Party Claims.
|
||||
If You have knowledge that a party claims an intellectual
|
||||
property right in particular functionality or code (or its
|
||||
utilization under this License), you must include a text
|
||||
file with the source code distribution titled "LEGAL" which
|
||||
describes the claim and the party making the claim in
|
||||
sufficient detail that a recipient will know whom to
|
||||
contact. If you obtain such knowledge after You make Your
|
||||
Modification available as described in Section 3.2, You
|
||||
shall promptly modify the LEGAL file in all copies You make
|
||||
available thereafter and shall take other steps (such as
|
||||
notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the
|
||||
Covered Code that new knowledge has been obtained.
|
||||
|
||||
(b) Representations.
|
||||
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that
|
||||
Contributor's Modifications are Contributor's original
|
||||
creation(s) and/or Contributor has sufficient rights to
|
||||
grant the rights conveyed by this License.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the
|
||||
Source Code, and this License in any documentation for the Source
|
||||
Code, where You describe recipients' rights relating to Covered
|
||||
Code. If You created one or more Modification(s), You may add your
|
||||
name as a Contributor to the notice described in Exhibit A. If it
|
||||
is not possible to put such notice in a particular Source Code file
|
||||
due to its structure, then you must include such notice in a
|
||||
location (such as a relevant directory file) where a user would be
|
||||
likely to look for such a notice. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear
|
||||
that any such warranty, support, indemnity or liability obligation
|
||||
is offered by You alone, and You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred
|
||||
by the Initial Developer or such Contributor as a result of
|
||||
warranty, support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered
|
||||
Code, and if You include a notice stating that the Source Code
|
||||
version of the Covered Code is available under the terms of this
|
||||
License, including a description of how and where You have
|
||||
fulfilled the obligations of Section 3.2. The notice must be
|
||||
conspicuously included in any notice in an Executable version,
|
||||
related documentation or collateral in which You describe
|
||||
recipients' rights relating to the Covered Code. You may distribute
|
||||
the Executable version of Covered Code under a license of Your
|
||||
choice, which may contain terms different from this License,
|
||||
provided that You are in compliance with the terms of this License
|
||||
and that the license for the Executable version does not attempt to
|
||||
limit or alter the recipient's rights in the Source Code version
|
||||
from the rights set forth in this License. If You distribute the
|
||||
Executable version under a different license You must make it
|
||||
absolutely clear that any terms which differ from this License are
|
||||
offered by You alone, not by the Initial Developer or any
|
||||
Contributor. You hereby agree to indemnify the Initial Developer
|
||||
and every Contributor for any liability incurred by the Initial
|
||||
Developer or such Contributor as a result of any such terms You
|
||||
offer. If you distribute executable versions containing Covered
|
||||
Code, you must reproduce the notice in Exhibit B in the
|
||||
documentation and/or other materials provided with the product.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other
|
||||
code not governed by the terms of this License and distribute the
|
||||
Larger Work as a single product. In such a case, You must make sure
|
||||
the requirements of this License are fulfilled for the Covered
|
||||
Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute or regulation then You must: (a) comply with the terms of
|
||||
this License to the maximum extent possible; and (b) Cite all of
|
||||
the statutes or regulations that prohibit you from complying fully
|
||||
with this license. (c) describe the limitations and the code they
|
||||
affect. Such description must be included in the LEGAL file
|
||||
described in Section 3.4 and must be included with all
|
||||
distributions of the Source Code. Except to the extent prohibited
|
||||
by statute or regulation, such description must be sufficiently
|
||||
detailed for a recipient of ordinary skill to be able to understand
|
||||
it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A, and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
License Author may publish revised and/or new versions of the
|
||||
License from time to time. Each version will be given a
|
||||
distinguishing version number and shall be submitted to
|
||||
opensource.org for certification.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of
|
||||
the License, You may always continue to use it under the terms of
|
||||
that version. You may also choose to use such Covered Code under
|
||||
the terms of any subsequent version of the License published by
|
||||
Initial Developer. No one other than Initial Developer has the
|
||||
right to modify the terms applicable to Covered Code created under
|
||||
this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If you create or use a modified version of this License, except in
|
||||
association with the required Developer Specific License described
|
||||
in section 6.4, (which you may only do in order to apply it to code
|
||||
which is not already Covered Code governed by this License), you
|
||||
must (a) rename Your license so that the phrases ``Open'',
|
||||
``OpenPL'', ``OPL'' or any confusingly similar phrase do not appear
|
||||
anywhere in your license and (b) otherwise make it clear that your
|
||||
version of the license contains terms which differ from the Open
|
||||
Public License. (Filling in the name of the Initial Developer,
|
||||
Original Code or Contributor in the notice described in Exhibit A
|
||||
shall not of themselves be deemed to be modifications of this
|
||||
License.)
|
||||
|
||||
6.4. Required Additional Developer Specific License
|
||||
|
||||
This license is a union of the following two parts that should be
|
||||
found as text files in the same place (directory), in the order of
|
||||
preeminence:
|
||||
|
||||
[1] A Developer specific license.
|
||||
|
||||
[2] The contents of this file OPL_1_0.TXT, stating the general
|
||||
licensing policy of the software.
|
||||
|
||||
In case of conflicting dispositions in the parts of this license,
|
||||
the terms of the lower-numbered part will always be superseded by
|
||||
the terms of the higher numbered part.
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
|
||||
NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
|
||||
THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE
|
||||
DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER
|
||||
CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
|
||||
CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART
|
||||
OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER
|
||||
EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
8.1 Termination upon Breach
|
||||
|
||||
This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code, which are properly granted, shall
|
||||
survive any termination of this License. Provisions that, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
|
||||
|
||||
8.2. Termination Upon Litigation. If You initiate litigation by
|
||||
asserting a patent infringement claim (excluding declatory judgment
|
||||
actions) against Initial Developer or a Contributor (the Initial
|
||||
Developer or Contributor against whom You file such action is referred
|
||||
to as "Participant") alleging that:
|
||||
|
||||
(a) such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent, then any and all rights
|
||||
granted by such Participant to You under Sections 2.1 and/or
|
||||
2.2 of this License shall, upon 60 days notice from Participant
|
||||
terminate prospectively, unless if within 60 days after receipt
|
||||
of notice You either: (i) agree in writing to pay Participant a
|
||||
mutually agreeable reasonable royalty for Your past and future
|
||||
use of Modifications made by such Participant, or (ii) withdraw
|
||||
Your litigation claim with respect to the Contributor Version
|
||||
against such Participant. If within 60 days of notice, a
|
||||
reasonable royalty and payment arrangement are not mutually
|
||||
agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You
|
||||
under Sections 2.1 and/or 2.2 automatically terminate at the
|
||||
expiration of the 60 day notice period specified above.
|
||||
|
||||
(b) any software, hardware, or device, other than such
|
||||
Participant's Contributor Version, directly or indirectly
|
||||
infringes any patent, then any rights granted to You by such
|
||||
Participant under Sections 2.1(b) and 2.2(b) are revoked
|
||||
effective as of the date You first made, used, sold,
|
||||
distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above, all
|
||||
end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
|
||||
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER
|
||||
PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
|
||||
GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
|
||||
ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
|
||||
BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a ``commercial item,'' as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer
|
||||
software'' and ``commercial computer software documentation,'' as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This section was intentionally left blank. The contents of this
|
||||
section are found in the corresponding addendum described above.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
Except in cases where another Contributor has failed to comply with
|
||||
Section 3.4, You are responsible for damages arising, directly or
|
||||
indirectly, out of Your utilization of rights under this License,
|
||||
based on the number of copies of Covered Code you made available, the
|
||||
revenues you received from utilizing such rights, and other relevant
|
||||
factors. You agree to work with affected parties to distribute with
|
||||
Initial Developer responsibility on an equitable basis.
|
||||
|
||||
EXHIBIT A.
|
||||
|
||||
Text for this Exhibit A is found in the corresponding addendum,
|
||||
described in section 6.4 above, text file provided by the Initial
|
||||
Developer. This license is not valid or complete with out that
|
||||
file.
|
||||
|
||||
EXHIBIT B.
|
||||
|
||||
Text for this Exhibit B is found in the corresponding addendum,
|
||||
described in section 6.4 above, text file provided by the Initial
|
||||
Developer. This license is not valid or complete with out that
|
||||
file.
|
||||
|
||||
|
46
license/thdl_license.txt
Normal file
46
license/thdl_license.txt
Normal file
|
@ -0,0 +1,46 @@
|
|||
THDL Open Community License Version 1.0
|
||||
|
||||
1. Definitions
|
||||
This license is a union of the following two parts that should be found as
|
||||
text files in the same place (directory), in the order of preeminence:
|
||||
|
||||
[1] This file itself, named thdl_license.txt
|
||||
|
||||
[2] The contents of the file opl_license.txt, stating the general licensing
|
||||
policy of the software.
|
||||
|
||||
|
||||
2. Precedence of the license parts
|
||||
In case of conflicting dispositions in the parts of this license, the terms of
|
||||
the lower-numbered part will always be superseded by the terms of the higher
|
||||
numbered part.
|
||||
|
||||
|
||||
3. Exhibit A
|
||||
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
|
||||
|
||||
4. Exhibit B
|
||||
|
||||
This product includes software created by the
|
||||
Tibetan and Himalayan Digital Library (http://www.thdl.org/).
|
||||
|
||||
|
||||
5. Section 3.2 of OPL 1.0
|
||||
As used in section 3.2 of the OPL "Contact Means" shall mean
|
||||
the email address thdltoolbox@virginia.edu
|
72
license/thdl_rationale.html
Normal file
72
license/thdl_rationale.html
Normal file
|
@ -0,0 +1,72 @@
|
|||
<html>
|
||||
<header>
|
||||
<font size="+1">Our License</font>
|
||||
</header>
|
||||
<p>
|
||||
<body>
|
||||
The <a href="thdl_license.txt">THDL Open Community License</a>
|
||||
is a free software license. The source code for our
|
||||
software is completely open and public. We hope that others will contribute and build
|
||||
upon what we've done, resulting in better, more useful products. The core of our license
|
||||
is the <a href="opl_license.txt">Open Public License</a> (OPL), which is also used by <a href="http://www.enhydra.com/">Enhydra</a>.
|
||||
The OPL is a slightly modified version of the popular <a href="http://www.opensource.org/licenses/mozilla1.0.html">
|
||||
Mozilla Public License</a>.
|
||||
<p>
|
||||
With this license, you can:
|
||||
<ol type="a">
|
||||
<p><li>Modify our software, provided the source code for these modifications remains open,
|
||||
and your changes are fully documented.
|
||||
<p><li>Use our software in proprietary projects, or build proprietary extensions to the
|
||||
software.
|
||||
</ol><p>
|
||||
Further, you must:
|
||||
<ol type="a">
|
||||
<p><li>Notify the THDL of your modifications.
|
||||
<p><li>Acknowledge our initial contribution, as well as others' later contributions.
|
||||
</ol>
|
||||
<p>
|
||||
As the creators of the software, our role is to keep track of developments and maintain
|
||||
the source code. In fact, however, our goals are much broader than this. In particular, we
|
||||
want to push the use standard technologies. Both Wylie Edit and Jskad take advantage of
|
||||
two technologies that have significant potential to bring those in Tibetan computing
|
||||
together.
|
||||
<p>
|
||||
On the one hand, our software uses Tony Duff's new cross-platform Tibetan Machine
|
||||
Web fonts. These are high-quality TrueType fonts, which are freely available and have
|
||||
been tested and run identically on Windows, Macintosh, and Linux platforms. Documents
|
||||
created on one platform will transfer unproblematically to any other platform. We hope
|
||||
that by encouraging the use of and building infrastructure around these fonts, we can help
|
||||
to promote a dominant and well-supported encoding format, which means less
|
||||
information lost in the long run.
|
||||
<p>
|
||||
On the other hand, our software implements the THDL Extended Wylie Transliteration
|
||||
Standard, our version of Extended Wylie. THDL Extended Wylie provides simple ASCII
|
||||
correspondences for all Tibetan characters, including ways to represent Sanskrit stacks as
|
||||
well as punctuation and many special characters. Until Unicode is a viable solution for
|
||||
Tibetan computing, Extended Wylie is the best standard, logical, and platform-
|
||||
independent solution for Tibetan data storage.
|
||||
<p>
|
||||
Combining these two technologies, we have created a Microsoft Word add-in and a Java
|
||||
application for typing and editing Tibetan, as well as converting back and forth between
|
||||
Extended Wylie and Tibetan Machine Web. Together, this software represents a uniform
|
||||
and consistent solution to Tibetan text input, which is available on any platform and also
|
||||
over the web. Many projects could benefit from this work, as well as customize it to meet
|
||||
their specific needs.
|
||||
<p>
|
||||
Although our software is open, we want to promote the standards it employs. We don't
|
||||
want our Extended Wylie keyboard to become "just another keyboard". Rather, we hope
|
||||
it will become the Wylie keyboard, one that will become familiar to everyone in Tibetan
|
||||
computing.
|
||||
<p>
|
||||
This is not to say that we at the THDL are allowed to fix the details of the Extended
|
||||
Wylie transliteration system. What we have arrived at represents a carefully thought out
|
||||
system, but certainly not the final answer. It remains a work in progress, and we hope that
|
||||
everyone in Tibetan computing will play a role in shaping the system. We want to hear
|
||||
your feedback, and thus to shape the standard together. What we don't want is a
|
||||
profileration of multiple, differing implementations.
|
||||
<p>
|
||||
We hope that you will find this software useful. If you are a software developer, we hope
|
||||
that this license is to your liking, and that you will join us in trying to create a community
|
||||
of standards for Tibetan computing.
|
||||
</body>
|
||||
</html>
|
1376
source/org/thdl/tib/input/DuffPane.java
Normal file
1376
source/org/thdl/tib/input/DuffPane.java
Normal file
File diff suppressed because it is too large
Load diff
942
source/org/thdl/tib/input/Jskad.java
Normal file
942
source/org/thdl/tib/input/Jskad.java
Normal file
|
@ -0,0 +1,942 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.awt.print.*;
|
||||
import javax.swing.plaf.basic.*;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.*;
|
||||
import javax.swing.text.*;
|
||||
import javax.swing.text.rtf.*;
|
||||
|
||||
import org.thdl.tib.text.*;
|
||||
|
||||
/**
|
||||
* A simple Tibetan text editor. Jskad editors lack most of the
|
||||
* functionality of a word-processor, but they do provide
|
||||
* multiple keyboard input methods, as well as
|
||||
* conversion routines to go back and forth between Extended
|
||||
* Wylie and TibetanMachineWeb.
|
||||
* <p>
|
||||
* Jskad embeds {@link DuffPane DuffPane}, which is the editing
|
||||
* window where the keyboard logic and most functionality is housed.
|
||||
* <p>
|
||||
* Depending on the object passed to the constructor,
|
||||
* a Jskad object can be used in either an application or an
|
||||
* applet.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class Jskad extends JPanel implements DocumentListener {
|
||||
private RTFEditorKit rtfEditor;
|
||||
private String fontName = "";
|
||||
private JComboBox fontFamilies, fontSizes;
|
||||
private JFileChooser fileChooser;
|
||||
private javax.swing.filechooser.FileFilter rtfFilter;
|
||||
private javax.swing.filechooser.FileFilter txtFilter;
|
||||
private int fontSize = 0;
|
||||
private Object parentObject = null;
|
||||
private static int numberOfTibsRTFOpen = 0;
|
||||
private static int x_size;
|
||||
private static int y_size;
|
||||
private TibetanKeyboard sambhota1Keyboard = null, duff1Keyboard = null, duff2Keyboard = null;
|
||||
|
||||
/**
|
||||
* The text editing window which this Jskad object embeds.
|
||||
*/
|
||||
public DuffPane dp;
|
||||
/**
|
||||
* Has the document been saved since it was last changed?
|
||||
*/
|
||||
public boolean hasChanged = false;
|
||||
|
||||
/**
|
||||
* The filename, if any, associated with this instance of Jskad.
|
||||
*/
|
||||
public String fileName = null;
|
||||
|
||||
/**
|
||||
* @param parent the object that embeds this instance of Jskad.
|
||||
* Supported objects include JFrames and JApplets. If the parent
|
||||
* is a JApplet then the File menu is omitted from the menu bar.
|
||||
*/
|
||||
public Jskad(final Object parent) {
|
||||
parentObject = parent;
|
||||
numberOfTibsRTFOpen++;
|
||||
JMenuBar menuBar = new JMenuBar();
|
||||
|
||||
if (parentObject instanceof JFrame || parentObject instanceof JInternalFrame) {
|
||||
fileChooser = new JFileChooser();
|
||||
rtfFilter = new RTFFilter();
|
||||
txtFilter = new TXTFilter();
|
||||
fileChooser.addChoosableFileFilter(rtfFilter);
|
||||
|
||||
JMenu fileMenu = new JMenu("File");
|
||||
|
||||
JMenuItem newItem = new JMenuItem("New");
|
||||
// newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,2)); //Ctrl-n
|
||||
newItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
newFile();
|
||||
}
|
||||
});
|
||||
fileMenu.add(newItem);
|
||||
|
||||
JMenuItem openItem = new JMenuItem("Open");
|
||||
// openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,2)); //Ctrl-o
|
||||
openItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
openFile();
|
||||
}
|
||||
});
|
||||
fileMenu.add(openItem);
|
||||
|
||||
if (parentObject instanceof JFrame) {
|
||||
JMenuItem closeItem = new JMenuItem("Close");
|
||||
closeItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (!hasChanged || hasChanged && checkSave()) {
|
||||
numberOfTibsRTFOpen--;
|
||||
|
||||
if (numberOfTibsRTFOpen == 0)
|
||||
System.exit(0);
|
||||
else {
|
||||
final JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
fileMenu.add(closeItem);
|
||||
}
|
||||
|
||||
JMenuItem saveItem = new JMenuItem("Save");
|
||||
// saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,2)); //Ctrl-s
|
||||
saveItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (fileName == null)
|
||||
saveAsFile();
|
||||
else
|
||||
saveFile();
|
||||
}
|
||||
|
||||
});
|
||||
fileMenu.addSeparator();
|
||||
fileMenu.add(saveItem);
|
||||
|
||||
JMenuItem saveAsItem = new JMenuItem("Save as");
|
||||
saveAsItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
saveAsFile();
|
||||
}
|
||||
});
|
||||
fileMenu.add(saveAsItem);
|
||||
|
||||
JMenuItem printItem = new JMenuItem("Print");
|
||||
printItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
PrintDuffPane printer = new PrintDuffPane(Jskad.this, dp);
|
||||
printer.preview();
|
||||
}
|
||||
});
|
||||
fileMenu.addSeparator();
|
||||
fileMenu.add(printItem);
|
||||
|
||||
menuBar.add(fileMenu);
|
||||
}
|
||||
|
||||
JMenu editMenu = new JMenu("Edit");
|
||||
|
||||
if (parentObject instanceof JFrame || parentObject instanceof JInternalFrame) {
|
||||
JMenuItem cutItem = new JMenuItem("Cut");
|
||||
cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,2)); //Ctrl-x
|
||||
cutItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
cutSelection();
|
||||
}
|
||||
});
|
||||
editMenu.add(cutItem);
|
||||
|
||||
JMenuItem copyItem = new JMenuItem("Copy");
|
||||
copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,2)); //Ctrl-c
|
||||
copyItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
copySelection();
|
||||
}
|
||||
});
|
||||
editMenu.add(copyItem);
|
||||
|
||||
JMenuItem pasteItem = new JMenuItem("Paste");
|
||||
pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,2)); //Ctrl-v
|
||||
pasteItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
pasteSelection();
|
||||
}
|
||||
});
|
||||
editMenu.add(pasteItem);
|
||||
editMenu.addSeparator();
|
||||
|
||||
JMenuItem selectallItem = new JMenuItem("Select All");
|
||||
selectallItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,2)); //Ctrl-a
|
||||
selectallItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
dp.setSelectionStart(0);
|
||||
dp.setSelectionEnd(dp.getDocument().getLength());
|
||||
}
|
||||
});
|
||||
editMenu.add(selectallItem);
|
||||
}
|
||||
|
||||
JMenuItem preferencesItem = new JMenuItem("Preferences");
|
||||
preferencesItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
getPreferences();
|
||||
}
|
||||
});
|
||||
editMenu.addSeparator();
|
||||
editMenu.add(preferencesItem);
|
||||
|
||||
menuBar.add(editMenu);
|
||||
|
||||
JMenu toolsMenu = new JMenu("Tools");
|
||||
|
||||
JMenuItem TMWWylieItem = new JMenuItem("Convert Tibetan to Wylie");
|
||||
TMWWylieItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
toWylie();
|
||||
}
|
||||
});
|
||||
toolsMenu.add(TMWWylieItem);
|
||||
|
||||
JMenuItem wylieTMWItem = new JMenuItem("Convert Wylie to Tibetan");
|
||||
wylieTMWItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
toTibetan();
|
||||
}
|
||||
});
|
||||
toolsMenu.add(wylieTMWItem);
|
||||
|
||||
if (parentObject instanceof JFrame || parentObject instanceof JInternalFrame) {
|
||||
JMenuItem importItem = new JMenuItem("Import Wylie as Tibetan");
|
||||
importItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
importWylie();
|
||||
}
|
||||
});
|
||||
toolsMenu.addSeparator();
|
||||
toolsMenu.add(importItem);
|
||||
}
|
||||
|
||||
menuBar.add(toolsMenu);
|
||||
|
||||
JMenu infoMenu = new JMenu("Info");
|
||||
|
||||
JMenuItem aboutItem = new JMenuItem("About");
|
||||
aboutItem.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JOptionPane.showMessageDialog(Jskad.this,
|
||||
"Copyright 2001 Tibetan and Himalayan Digital Library\n"+
|
||||
"Programmed by Edward Garrett\n\n"+
|
||||
"This software is protected by the terms of the\n"+
|
||||
"THDL Open Community License, Version 1.0.\n"+
|
||||
"It uses Tibetan Computer Company (http://www.tibet.dk/tcc/)\n"+
|
||||
"fonts created by Tony Duff and made available by the\n"+
|
||||
"Trace Foundation (http://trace.org/). Jskad also includes\n"+
|
||||
"software written and copyrighted by Wildcrest Associates\n"+
|
||||
"(http://www.wildcrest.com).\n\n"+
|
||||
"For more information, or to download the source code\n"+
|
||||
"for Jskad, see our web site:\n"+
|
||||
" http://www.thdl.org/",
|
||||
"About Jskad 1.0",
|
||||
JOptionPane.PLAIN_MESSAGE);
|
||||
}
|
||||
});
|
||||
infoMenu.add(aboutItem);
|
||||
|
||||
menuBar.add(infoMenu);
|
||||
|
||||
JToolBar toolBar = new JToolBar();
|
||||
toolBar.setBorder(null);
|
||||
toolBar.addSeparator();
|
||||
toolBar.add(new JLabel("Input mode:"));
|
||||
toolBar.addSeparator();
|
||||
|
||||
String[] input_modes = {"Tibetan","Roman"};
|
||||
final JComboBox inputmethods = new JComboBox(input_modes);
|
||||
inputmethods.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
switch (inputmethods.getSelectedIndex()) {
|
||||
case 0: //Tibetan
|
||||
if (dp.isRomanMode())
|
||||
dp.toggleLanguage();
|
||||
break;
|
||||
|
||||
case 1: //Roman
|
||||
if (!dp.isRomanMode() && dp.isRomanEnabled())
|
||||
dp.toggleLanguage();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
toolBar.add(inputmethods);
|
||||
toolBar.add(Box.createHorizontalGlue());
|
||||
|
||||
toolBar.add(new JLabel("Keyboard:"));
|
||||
toolBar.addSeparator();
|
||||
|
||||
String[] keyboard_options = {"Extended Wylie","TCC Keyboard #1","TCC Keyboard #2","Sambhota Keymap One"};
|
||||
final JComboBox keyboards = new JComboBox(keyboard_options);
|
||||
keyboards.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
switch (keyboards.getSelectedIndex()) {
|
||||
case 0: //Extended Wylie
|
||||
installKeyboard("wylie");
|
||||
break;
|
||||
|
||||
case 1: //TCC 1
|
||||
if (duff1Keyboard == null)
|
||||
duff1Keyboard = installKeyboard("tcc1");
|
||||
else
|
||||
dp.registerKeyboard(duff1Keyboard);
|
||||
break;
|
||||
|
||||
case 2: //TCC 2
|
||||
if (duff2Keyboard == null)
|
||||
duff2Keyboard = installKeyboard("tcc2");
|
||||
else
|
||||
dp.registerKeyboard(duff2Keyboard);
|
||||
break;
|
||||
|
||||
case 3: //Sambhota
|
||||
if (sambhota1Keyboard == null)
|
||||
sambhota1Keyboard = installKeyboard("sambhota1");
|
||||
else
|
||||
dp.registerKeyboard(sambhota1Keyboard);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
toolBar.add(keyboards);
|
||||
toolBar.add(Box.createHorizontalGlue());
|
||||
|
||||
rtfEditor = new RTFEditorKit();
|
||||
dp = new DuffPane(rtfEditor);
|
||||
JScrollPane sp = new JScrollPane(dp, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
dp.getDocument().addDocumentListener(this);
|
||||
|
||||
if (parentObject instanceof JFrame) {
|
||||
final JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.setJMenuBar(menuBar);
|
||||
parentFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
parentFrame.addWindowListener(new WindowAdapter () {
|
||||
public void windowClosing (WindowEvent e) {
|
||||
if (!hasChanged || hasChanged && checkSave()) {
|
||||
numberOfTibsRTFOpen--;
|
||||
if (numberOfTibsRTFOpen == 0)
|
||||
System.exit(0);
|
||||
else
|
||||
parentFrame.dispose();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
else if (parentObject instanceof JInternalFrame) {
|
||||
final JInternalFrame parentFrame = (JInternalFrame)parentObject;
|
||||
parentFrame.setJMenuBar(menuBar);
|
||||
}
|
||||
|
||||
else if (parentObject instanceof JApplet) {
|
||||
JApplet parentApplet = (JApplet)parentObject;
|
||||
parentApplet.setJMenuBar(menuBar);
|
||||
dp.disableCutAndPaste();
|
||||
}
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
add("North", toolBar);
|
||||
add("Center", sp);
|
||||
}
|
||||
|
||||
private void getPreferences() {
|
||||
GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
String[] fontNames = genv.getAvailableFontFamilyNames();
|
||||
|
||||
JPanel tibetanPanel;
|
||||
JComboBox tibetanFontSizes;
|
||||
|
||||
tibetanPanel = new JPanel();
|
||||
tibetanPanel.setBorder(BorderFactory.createTitledBorder("Set Tibetan Font Size"));
|
||||
tibetanFontSizes = new JComboBox(new String[] {"8","10","12","14","16","18","20","22","24","26","28","30","32","34","36","48","72"});
|
||||
tibetanFontSizes.setMaximumSize(tibetanFontSizes.getPreferredSize());
|
||||
tibetanFontSizes.setSelectedItem(String.valueOf(dp.getTibetanFontSize()));
|
||||
tibetanFontSizes.setEditable(true);
|
||||
tibetanPanel.add(tibetanFontSizes);
|
||||
|
||||
JPanel romanPanel;
|
||||
JComboBox romanFontFamilies;
|
||||
JComboBox romanFontSizes;
|
||||
|
||||
romanPanel = new JPanel();
|
||||
romanPanel.setBorder(BorderFactory.createTitledBorder("Set non-Tibetan Font and Size"));
|
||||
romanFontFamilies = new JComboBox(fontNames);
|
||||
romanFontFamilies.setMaximumSize(romanFontFamilies.getPreferredSize());
|
||||
romanFontFamilies.setSelectedItem(dp.getRomanFontFamily());
|
||||
romanFontFamilies.setEditable(true);
|
||||
romanFontSizes = new JComboBox(new String[] {"8","10","12","14","16","18","20","22","24","26","28","30","32","34","36","48","72"});
|
||||
romanFontSizes.setMaximumSize(romanFontSizes.getPreferredSize());
|
||||
romanFontSizes.setSelectedItem(String.valueOf(dp.getRomanFontSize()));
|
||||
romanFontSizes.setEditable(true);
|
||||
romanPanel.setLayout(new GridLayout(1,2));
|
||||
romanPanel.add(romanFontFamilies);
|
||||
romanPanel.add(romanFontSizes);
|
||||
|
||||
JPanel preferencesPanel = new JPanel();
|
||||
preferencesPanel.setLayout(new GridLayout(2,1));
|
||||
preferencesPanel.add(tibetanPanel);
|
||||
preferencesPanel.add(romanPanel);
|
||||
|
||||
JOptionPane pane = new JOptionPane(preferencesPanel);
|
||||
JDialog dialog = pane.createDialog(this, "Preferences");
|
||||
dialog.show();
|
||||
|
||||
int size;
|
||||
try {
|
||||
size = Integer.parseInt(tibetanFontSizes.getSelectedItem().toString());
|
||||
}
|
||||
catch (NumberFormatException ne) {
|
||||
size = dp.getTibetanFontSize();
|
||||
}
|
||||
dp.setTibetanFontSize(size);
|
||||
|
||||
String font = romanFontFamilies.getSelectedItem().toString();
|
||||
try {
|
||||
size = Integer.parseInt(romanFontSizes.getSelectedItem().toString());
|
||||
}
|
||||
catch (NumberFormatException ne) {
|
||||
size = dp.getRomanFontSize();
|
||||
}
|
||||
dp.setRomanAttributeSet(font, size);
|
||||
}
|
||||
|
||||
private void newFile() {
|
||||
if (dp.getDocument().getLength()>0 && parentObject instanceof JFrame) {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
JFrame newFrame = new JFrame("Jskad");
|
||||
Point point = parentFrame.getLocationOnScreen();
|
||||
newFrame.setSize(parentFrame.getSize().width, parentFrame.getSize().height);
|
||||
newFrame.setLocation(point.x+50, point.y+50);
|
||||
newFrame.getContentPane().add(new Jskad(newFrame));
|
||||
newFrame.setVisible(true);
|
||||
}
|
||||
else {
|
||||
if (parentObject instanceof JFrame) {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.setTitle("Jskad");
|
||||
}
|
||||
else if (parentObject instanceof JInternalFrame) {
|
||||
JInternalFrame parentFrame = (JInternalFrame)parentObject;
|
||||
parentFrame.setTitle("Jskad");
|
||||
}
|
||||
dp.newDocument();
|
||||
dp.getDocument().addDocumentListener(Jskad.this);
|
||||
hasChanged = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void openFile() {
|
||||
fileChooser = new JFileChooser();
|
||||
fileChooser.addChoosableFileFilter(rtfFilter);
|
||||
|
||||
if (dp.getDocument().getLength()>0 && parentObject instanceof JFrame) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
|
||||
if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
return;
|
||||
}
|
||||
|
||||
final File fileChosen = fileChooser.getSelectedFile();
|
||||
final String f_name = fileChosen.getAbsolutePath();
|
||||
|
||||
try {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
InputStream in = new FileInputStream(fileChosen);
|
||||
JFrame newFrame = new JFrame(f_name);
|
||||
Point point = parentFrame.getLocationOnScreen();
|
||||
newFrame.setSize(x_size, y_size);
|
||||
newFrame.setLocation(point.x+50, point.y+50);
|
||||
Jskad newRTF = new Jskad(newFrame);
|
||||
newFrame.getContentPane().add(newRTF);
|
||||
rtfEditor.read(in, newRTF.dp.getDocument(), 0);
|
||||
newRTF.dp.getDocument().addDocumentListener(newRTF);
|
||||
in.close();
|
||||
newFrame.setTitle(f_name);
|
||||
newRTF.fileName = f_name;
|
||||
newRTF.hasChanged = false;
|
||||
newRTF.dp.getCaret().setDot(0);
|
||||
newFrame.setVisible(true);
|
||||
}
|
||||
catch (FileNotFoundException fnfe) {
|
||||
}
|
||||
catch (IOException ioe) {
|
||||
}
|
||||
catch (BadLocationException ble) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
|
||||
if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
return;
|
||||
}
|
||||
|
||||
final File fileChosen = fileChooser.getSelectedFile();
|
||||
final String f_name = fileChosen.getAbsolutePath();
|
||||
|
||||
try {
|
||||
InputStream in = new FileInputStream(fileChosen);
|
||||
dp.newDocument();
|
||||
rtfEditor.read(in, dp.getDocument(), 0);
|
||||
in.close();
|
||||
dp.getCaret().setDot(0);
|
||||
dp.getDocument().addDocumentListener(Jskad.this);
|
||||
hasChanged = false;
|
||||
fileName = f_name;
|
||||
|
||||
if (parentObject instanceof JFrame) {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.setTitle(fileName);
|
||||
}
|
||||
else if (parentObject instanceof JInternalFrame) {
|
||||
JInternalFrame parentFrame = (JInternalFrame)parentObject;
|
||||
parentFrame.setTitle(fileName);
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException fnfe) {
|
||||
}
|
||||
catch (IOException ioe) {
|
||||
}
|
||||
catch (BadLocationException ble) {
|
||||
}
|
||||
}
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
|
||||
private void saveFile() {
|
||||
String s = getSave(fileName);
|
||||
if (null != s) {
|
||||
if (parentObject instanceof JFrame) {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.setTitle(s);
|
||||
fileName = s;
|
||||
}
|
||||
else if (parentObject instanceof JInternalFrame) {
|
||||
JInternalFrame parentFrame = (JInternalFrame)parentObject;
|
||||
parentFrame.setTitle(s);
|
||||
fileName = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void saveAsFile() {
|
||||
String s = getSaveAs();
|
||||
if (null != s) {
|
||||
if (parentObject instanceof JFrame) {
|
||||
JFrame parentFrame = (JFrame)parentObject;
|
||||
parentFrame.setTitle(s);
|
||||
fileName = s;
|
||||
}
|
||||
else if (parentObject instanceof JInternalFrame) {
|
||||
JInternalFrame parentFrame = (JInternalFrame)parentObject;
|
||||
parentFrame.setTitle(s);
|
||||
fileName = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkSave() {
|
||||
int saveFirst = JOptionPane.showConfirmDialog(this, "Do you want to save your changes?", "Please select", JOptionPane.YES_NO_CANCEL_OPTION);
|
||||
|
||||
switch (saveFirst) {
|
||||
case JOptionPane.NO_OPTION: //don't save but do continue
|
||||
return true;
|
||||
|
||||
case JOptionPane.YES_OPTION: //save and continue
|
||||
if (fileName == null)
|
||||
saveAsFile();
|
||||
else
|
||||
saveFile();
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private String getSave(String f_name) {
|
||||
File fileChosen = new File(f_name);
|
||||
|
||||
try {
|
||||
OutputStream out = new FileOutputStream(fileChosen);
|
||||
rtfEditor.write(out, dp.getDocument(), 0, dp.getDocument().getLength());
|
||||
out.close();
|
||||
hasChanged = false;
|
||||
}
|
||||
catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
return f_name;
|
||||
}
|
||||
|
||||
private String getSaveAs() {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
|
||||
if (fileName == null)
|
||||
fileChooser.setSelectedFile(null);
|
||||
else
|
||||
fileChooser.setSelectedFile(new File(fileName));
|
||||
|
||||
if (fileChooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
return null;
|
||||
}
|
||||
|
||||
File fileChosen = fileChooser.getSelectedFile();
|
||||
String fileName = fileChosen.getAbsolutePath();
|
||||
int i = fileName.lastIndexOf('.');
|
||||
|
||||
if (i < 0)
|
||||
fileName += ".rtf";
|
||||
else
|
||||
fileName = fileName.substring(0, i) + ".rtf";
|
||||
|
||||
getSave(fileName);
|
||||
|
||||
fileChooser.rescanCurrentDirectory();
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
return fileName;
|
||||
}
|
||||
|
||||
private void cutSelection() {
|
||||
dp.copy(dp.getSelectionStart(), dp.getSelectionEnd(), true);
|
||||
}
|
||||
|
||||
private void copySelection() {
|
||||
dp.copy(dp.getSelectionStart(), dp.getSelectionEnd(), false);
|
||||
}
|
||||
|
||||
private void pasteSelection() {
|
||||
dp.paste(dp.getCaret().getDot());
|
||||
}
|
||||
|
||||
private void toTibetan() {
|
||||
Jskad.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
dp.toTibetanMachineWeb();
|
||||
Jskad.this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
|
||||
private void toWylie() {
|
||||
Jskad.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
dp.toWylie(dp.getSelectionStart(), dp.getSelectionEnd());
|
||||
Jskad.this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
|
||||
private void importWylie() {
|
||||
fileChooser.removeChoosableFileFilter(rtfFilter);
|
||||
fileChooser.addChoosableFileFilter(txtFilter);
|
||||
|
||||
if (fileChooser.showDialog(Jskad.this, "Import Wylie") != JFileChooser.APPROVE_OPTION) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
fileChooser.removeChoosableFileFilter(txtFilter);
|
||||
fileChooser.addChoosableFileFilter(rtfFilter);
|
||||
return;
|
||||
}
|
||||
|
||||
File txt_fileChosen = fileChooser.getSelectedFile();
|
||||
fileChooser.rescanCurrentDirectory();
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
fileChooser.removeChoosableFileFilter(txtFilter);
|
||||
fileChooser.addChoosableFileFilter(rtfFilter);
|
||||
|
||||
if (fileChooser.showDialog(Jskad.this, "Save as Tibetan") != JFileChooser.APPROVE_OPTION) {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
return;
|
||||
}
|
||||
|
||||
File rtf_fileChosen = fileChooser.getSelectedFile();
|
||||
fileChooser.rescanCurrentDirectory();
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
String rtf_fileName = rtf_fileChosen.getAbsolutePath();
|
||||
int i = rtf_fileName.lastIndexOf('.');
|
||||
|
||||
if (i < 0)
|
||||
rtf_fileName += ".rtf";
|
||||
else
|
||||
rtf_fileName = fileName.substring(0, i) + ".rtf";
|
||||
|
||||
try {
|
||||
BufferedReader in = new BufferedReader(new FileReader(txt_fileChosen));
|
||||
DuffPane dp2 = new DuffPane();
|
||||
|
||||
try {
|
||||
String val = in.readLine();
|
||||
|
||||
while (val != null) {
|
||||
dp2.toTibetanMachineWeb(val + "\n", dp2.getCaret().getDot());
|
||||
val = in.readLine();
|
||||
}
|
||||
|
||||
TibetanDocument t_doc = (TibetanDocument)dp2.getDocument();
|
||||
t_doc.writeRTFOutputStream(new FileOutputStream(new File(rtf_fileName)));
|
||||
}
|
||||
catch (IOException ioe) {
|
||||
System.out.println("problem reading or writing file");
|
||||
}
|
||||
}
|
||||
catch (FileNotFoundException fnfe) {
|
||||
System.out.println("problem reading file");
|
||||
}
|
||||
}
|
||||
|
||||
private TibetanKeyboard installKeyboard(String name) {
|
||||
TibetanKeyboard tk = null;
|
||||
|
||||
if (!name.equalsIgnoreCase("wylie")) {
|
||||
URL keyboard_url = null;
|
||||
|
||||
if (name.equalsIgnoreCase("sambhota1"))
|
||||
keyboard_url = TibetanMachineWeb.class.getResource("sambhota_keyboard_1.ini");
|
||||
|
||||
else if (name.equalsIgnoreCase("tcc1"))
|
||||
keyboard_url = TibetanMachineWeb.class.getResource("tcc_keyboard_1.ini");
|
||||
|
||||
else if (name.equalsIgnoreCase("tcc2"))
|
||||
keyboard_url = TibetanMachineWeb.class.getResource("tcc_keyboard_2.ini");
|
||||
|
||||
if (null != keyboard_url) {
|
||||
try {
|
||||
tk = new TibetanKeyboard(keyboard_url);
|
||||
}
|
||||
catch (TibetanKeyboard.InvalidKeyboardException ike) {
|
||||
System.out.println("invalid keyboard file or file not found");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
dp.registerKeyboard(tk);
|
||||
return tk;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows use of Jskad as dependent JFrame.
|
||||
* Once you've called this method, users will
|
||||
* be able to close Jskad without shutting
|
||||
* down your superordinate application.
|
||||
*/
|
||||
public void makeDependent() {
|
||||
numberOfTibsRTFOpen++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the editing pane with content. If the
|
||||
* editing pane already has content, this method does nothing.
|
||||
*
|
||||
* @param wylie the string of wylie you want to
|
||||
* put in the editing pane
|
||||
*/
|
||||
public void setContent(String wylie) {
|
||||
if (dp.getDocument().getLength() > 0)
|
||||
return;
|
||||
|
||||
dp.newDocument();
|
||||
dp.toTibetanMachineWeb(wylie, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables typing of Roman (non-Tibetan) text along
|
||||
* with Tibetan.
|
||||
*/
|
||||
public void enableRoman() {
|
||||
dp.enableRoman();
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables typing of Roman (non-Tibetan) text.
|
||||
*/
|
||||
public void disableRoman() {
|
||||
dp.disableRoman();
|
||||
}
|
||||
|
||||
/*
|
||||
private void showAttributes(int pos) {
|
||||
dp.skipUpdate = true;
|
||||
|
||||
AttributeSet attr = dp.getDocument().getCharacterElement(pos).getAttributes();
|
||||
String name = StyleConstants.getFontFamily(attr);
|
||||
|
||||
if (!fontName.equals(name)) {
|
||||
fontName = name;
|
||||
fontFamilies.setSelectedItem(name);
|
||||
}
|
||||
int size = StyleConstants.getFontSize(attr);
|
||||
if (fontSize != size) {
|
||||
fontSize = size;
|
||||
fontSizes.setSelectedItem(Integer.toString(fontSize));
|
||||
}
|
||||
|
||||
dp.skipUpdate = false;
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Required for implementations of DocumentListener.
|
||||
* Does nothing.
|
||||
*/
|
||||
public void changedUpdate(DocumentEvent de) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Required for implementations of DocumentListener.
|
||||
* Informs the object that a change in the document
|
||||
* has occurred.
|
||||
*
|
||||
* @param de a DocumentEvent
|
||||
*/
|
||||
public void insertUpdate(DocumentEvent de) {
|
||||
hasChanged = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Required for implementations of DocumentListener.
|
||||
* Informs the object that a change in the document
|
||||
* has occurred.
|
||||
*
|
||||
* @param de a DocumentEvent
|
||||
*/
|
||||
public void removeUpdate(DocumentEvent de) {
|
||||
hasChanged = true;
|
||||
}
|
||||
|
||||
private class RTFFilter extends javax.swing.filechooser.FileFilter {
|
||||
// Accept all directories and all RTF files.
|
||||
|
||||
public boolean accept(File f) {
|
||||
if (f.isDirectory()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String fName = f.getName();
|
||||
int i = fName.lastIndexOf('.');
|
||||
|
||||
if (i < 0)
|
||||
return false;
|
||||
|
||||
else {
|
||||
String ext = fName.substring(i+1).toLowerCase();
|
||||
|
||||
if (ext.equals("rtf"))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//the description of this filter
|
||||
public String getDescription() {
|
||||
return "Rich Text Format (.rtf)";
|
||||
}
|
||||
}
|
||||
|
||||
private class TXTFilter extends javax.swing.filechooser.FileFilter {
|
||||
// Accept all directories and all TXT files.
|
||||
|
||||
public boolean accept(File f) {
|
||||
if (f.isDirectory()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String fName = f.getName();
|
||||
int i = fName.lastIndexOf('.');
|
||||
|
||||
if (i < 0)
|
||||
return false;
|
||||
|
||||
else {
|
||||
String ext = fName.substring(i+1).toLowerCase();
|
||||
|
||||
if (ext.equals("txt"))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//the description of this filter
|
||||
public String getDescription() {
|
||||
return "Text file (.txt)";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs Jskad.
|
||||
* System output, including errors, is redirected to jskad.log.
|
||||
* If you discover a bug, please send us an email, making sure
|
||||
* to include the jskad.log file as an attachment.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
/*
|
||||
try {
|
||||
PrintStream ps = new PrintStream(new FileOutputStream("jskad.log"));
|
||||
System.setErr(ps);
|
||||
System.setOut(ps);
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
*/
|
||||
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
|
||||
JFrame f = new JFrame("Jskad");
|
||||
Dimension d = f.getToolkit().getScreenSize();
|
||||
x_size = d.width/4*3;
|
||||
y_size = d.height/4*3;
|
||||
f.setSize(x_size, y_size);
|
||||
f.setLocation(d.width/8, d.height/8);
|
||||
f.getContentPane().add(new Jskad(f));
|
||||
f.setVisible(true);
|
||||
}
|
||||
}
|
82
source/org/thdl/tib/input/Jskad2JavaScript.java
Normal file
82
source/org/thdl/tib/input/Jskad2JavaScript.java
Normal file
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import org.thdl.tib.text.*;
|
||||
import netscape.javascript.JSObject;
|
||||
|
||||
/**
|
||||
* A version of Jskad which can be embedded into
|
||||
* a web page as an applet. It includes all of the functionality
|
||||
* of the application version of Jskad, minus the File menu.
|
||||
* In other words, it is not possible to open, save, and print
|
||||
* from this applet.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class Jskad2JavaScript extends JApplet {
|
||||
/**
|
||||
* the {@link Jskad Jskad} used by this applet
|
||||
*/
|
||||
public Jskad jskad;
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
setContentPane(makeContentPane());
|
||||
}
|
||||
|
||||
private Container makeContentPane() {
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
jskad = new Jskad(this);
|
||||
panel.add("Center", jskad);
|
||||
JButton submit = new JButton("Submit");
|
||||
submit.addActionListener(new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent e)
|
||||
{
|
||||
try {
|
||||
TibetanDocument t_doc = (TibetanDocument)jskad.dp.getDocument();
|
||||
String wylie = t_doc.getWylie();
|
||||
Object[] args = {wylie};
|
||||
JSObject.getWindow(Jskad2JavaScript.this).call("settext", args);
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
}
|
||||
});
|
||||
panel.add("South", submit);
|
||||
return panel;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
}
|
90
source/org/thdl/tib/input/Jskad4JavaScript.java
Normal file
90
source/org/thdl/tib/input/Jskad4JavaScript.java
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import org.thdl.tib.text.*;
|
||||
|
||||
/**
|
||||
* A version of Jskad which can be embedded into
|
||||
* a web page as an applet. It includes all of the functionality
|
||||
* of the application version of Jskad, minus the File menu.
|
||||
* In other words, it is not possible to open, save, and print
|
||||
* from this applet.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class Jskad4JavaScript extends JApplet {
|
||||
/**
|
||||
* the {@link Jskad Jskad} used by this applet
|
||||
*/
|
||||
public Jskad jskad;
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
setContentPane(makeContentPane());
|
||||
String wylie = getParameter("Wylie");
|
||||
if (null != wylie)
|
||||
setWylie(wylie);
|
||||
}
|
||||
|
||||
private Container makeContentPane() {
|
||||
jskad = new Jskad(this);
|
||||
jskad.dp.disableRoman();
|
||||
return jskad;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
|
||||
public void setWylie(String wylie) {
|
||||
try {
|
||||
TibetanDocument.DuffData[] dd = TibetanDocument.getTibetanMachineWeb(wylie);
|
||||
TibetanDocument t_doc = (TibetanDocument)jskad.dp.getDocument();
|
||||
if (t_doc.getLength() > 0)
|
||||
jskad.dp.newDocument();
|
||||
TibetanDocument.DuffData[] duffdata = TibetanDocument.getTibetanMachineWeb(wylie);
|
||||
t_doc.insertDuff(0, duffdata);
|
||||
}
|
||||
catch (InvalidWylieException iwe) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
"The Wylie you are trying to convert is invalid, " +
|
||||
"beginning from:\n " + iwe.getCulpritInContext() + "\n" +
|
||||
"The culprit is probably the character '"+iwe.getCulprit()+"'.");
|
||||
}
|
||||
}
|
||||
|
||||
public String getWylie() {
|
||||
TibetanDocument t_doc = (TibetanDocument)jskad.dp.getDocument();
|
||||
return t_doc.getWylie();
|
||||
}
|
||||
}
|
63
source/org/thdl/tib/input/JskadApplet.java
Normal file
63
source/org/thdl/tib/input/JskadApplet.java
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* A version of Jskad which can be embedded into
|
||||
* a web page as an applet. It includes all of the functionality
|
||||
* of the application version of Jskad, minus the File menu.
|
||||
* In other words, it is not possible to open, save, and print
|
||||
* from this applet.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class JskadApplet extends JApplet {
|
||||
/**
|
||||
* the {@link Jskad Jskad} used by this applet
|
||||
*/
|
||||
public Jskad jskad;
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
setContentPane(makeContentPane());
|
||||
}
|
||||
|
||||
private Container makeContentPane() {
|
||||
jskad = new Jskad(this);
|
||||
return jskad;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
}
|
87
source/org/thdl/tib/input/JskadConversionTool.java
Normal file
87
source/org/thdl/tib/input/JskadConversionTool.java
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
import org.thdl.tib.text.*;
|
||||
import netscape.javascript.JSObject;
|
||||
|
||||
/**
|
||||
* A version of Jskad which can be embedded into
|
||||
* a web page as an applet. It includes all of the functionality
|
||||
* of the application version of Jskad, minus the File menu.
|
||||
* In other words, it is not possible to open, save, and print
|
||||
* from this applet.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class JskadConversionTool extends JApplet {
|
||||
/**
|
||||
* the {@link Jskad Jskad} used by this applet
|
||||
*/
|
||||
public Jskad jskad;
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
setContentPane(makeContentPane());
|
||||
}
|
||||
|
||||
private Container makeContentPane() {
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
jskad = new Jskad(this);
|
||||
panel.add("Center", jskad);
|
||||
JButton submit = new JButton("Submit");
|
||||
submit.addActionListener(new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent e)
|
||||
{
|
||||
try {
|
||||
TibetanDocument t_doc = (TibetanDocument)jskad.dp.getDocument();
|
||||
String wylie = t_doc.getWylie();
|
||||
String html = "<HTML>\n<HEAD>\n<STYLE>\n";
|
||||
html += TibetanHTML.getStyles("28");
|
||||
html += "</STYLE>\n</HEAD>\n<BODY>\n";
|
||||
html += TibetanHTML.getHTML(wylie);
|
||||
html += "\n</BODY>\n</HTML>";
|
||||
Object[] args = {wylie, html};
|
||||
JSObject.getWindow(JskadConversionTool.this).call("setdata", args);
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
}
|
||||
});
|
||||
panel.add("South", submit);
|
||||
return panel;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
}
|
72
source/org/thdl/tib/input/JskadLight.java
Normal file
72
source/org/thdl/tib/input/JskadLight.java
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.input;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* Another version of Jskad which can be embedded into
|
||||
* a web page as an applet. It is called 'Light' because it
|
||||
* has no menu bar.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class JskadLight extends JApplet {
|
||||
/**
|
||||
* the scroll pane that embeds the editor
|
||||
*/
|
||||
public JScrollPane scroll;
|
||||
/**
|
||||
* the panel that embeds the scroll pane
|
||||
*/
|
||||
public JPanel panel;
|
||||
/**
|
||||
* the editing window
|
||||
*/
|
||||
public DuffPane pane;
|
||||
|
||||
public void init() {
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {
|
||||
}
|
||||
setContentPane(makeContentPane());
|
||||
}
|
||||
|
||||
private Container makeContentPane() {
|
||||
panel = new JPanel(new GridLayout(1,1));
|
||||
pane = new DuffPane();
|
||||
scroll = new JScrollPane(pane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||
panel.add(scroll);
|
||||
return panel;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
}
|
35
source/org/thdl/tib/input/package.html
Normal file
35
source/org/thdl/tib/input/package.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
|
||||
@(#)package.html
|
||||
|
||||
Copyright 2001 Tibetan and Himalayan Digital Library
|
||||
|
||||
This software is the confidential and proprietary information of
|
||||
the Tibetan and Himalayan Digital Library. You shall use such
|
||||
information only in accordance with the terms of the license
|
||||
agreement you entered into with the THDL.
|
||||
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
Provides classes and methods for inputting Tibetan text.
|
||||
<p>
|
||||
Designed for use with the Tibetan Computer
|
||||
Company's free cross-platform TibetanMachineWeb fonts, this package
|
||||
contains methods for inputting Tibetan using various keyboard
|
||||
input methods, including true Wylie-based input, as well as
|
||||
user-defined keyboards.
|
||||
<p>
|
||||
The package includes a simple Tibetan text editor, Jskad,
|
||||
which can be run as an local application or embedded in a
|
||||
web page. Jskad supports a wide range of functions, including
|
||||
conversion back and forth between TibetanMachineWeb and
|
||||
Extended Wylie.
|
||||
<p>
|
||||
<h2>Related Documentation</h2>
|
||||
@see org.thdl.tib.text
|
||||
</body>
|
||||
</html>
|
165
source/org/thdl/tib/text/DuffCode.java
Normal file
165
source/org/thdl/tib/text/DuffCode.java
Normal file
|
@ -0,0 +1,165 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.text;
|
||||
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* A wrapper for the primitive data types
|
||||
* that combine to represent a Tibetan glyph in the
|
||||
* TibetanMachineWeb family of fonts.
|
||||
*
|
||||
* A DuffCode consists of a font number, a character, and
|
||||
* a character number. A font identification and a character
|
||||
* (or character number) are sufficient to uniquely identify
|
||||
* any TibetanMachineWeb glyph.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
|
||||
public class DuffCode {
|
||||
/**
|
||||
* the font number in which this glyph can be found,
|
||||
* from 1 (TibetanMachineWeb) to 10 (TibetanMachineWeb9).
|
||||
*/
|
||||
public int fontNum;
|
||||
/**
|
||||
* the character value of this glyph
|
||||
*/
|
||||
public char character;
|
||||
/**
|
||||
* the character value of this glyph, as an integer
|
||||
*/
|
||||
public int charNum;
|
||||
|
||||
/**
|
||||
* Called by {@link TibetanMachineWeb} to generate
|
||||
* DuffCodes from the 'tibwn.ini' initialization file.
|
||||
* This constructor expects to receive a string such as "1,33" or "33,1",
|
||||
* i.e. a sequence of two numbers separated by a comma. These numbers
|
||||
* represent a character: one number is its identifying font number,
|
||||
* and the other is the ASCII code of the character.
|
||||
*
|
||||
* @param s the string to parse
|
||||
* @param leftToRight should be true if the first number is the font number,
|
||||
* false if the second number is the font number
|
||||
*/
|
||||
public DuffCode(String s, boolean leftToRight) {
|
||||
StringTokenizer st = new StringTokenizer(s,",");
|
||||
|
||||
try {
|
||||
String val1 = st.nextToken();
|
||||
String val2 = st.nextToken();
|
||||
|
||||
Integer num1 = new Integer(val1);
|
||||
Integer num2 = new Integer(val2);
|
||||
|
||||
if (leftToRight) {
|
||||
fontNum = num1.intValue();
|
||||
charNum = num2.intValue();
|
||||
character = (char)charNum;
|
||||
}
|
||||
else {
|
||||
fontNum = num2.intValue();
|
||||
charNum = num1.intValue();
|
||||
character = (char)charNum;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to create DuffCodes on the fly
|
||||
* from an identifying font number and an ASCII character.
|
||||
*
|
||||
* @param font the identifying number of the font
|
||||
* @param ch a character
|
||||
*/
|
||||
public DuffCode(int font, char ch) {
|
||||
fontNum = font;
|
||||
character = ch;
|
||||
charNum = (int)ch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the font number of this glyph.
|
||||
* @return the identifying font number for this DuffCode
|
||||
*/
|
||||
public int getFontNum() {
|
||||
return fontNum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the character for this glyph, as an integer.
|
||||
* @return the identifying character, converted to an
|
||||
* integer, for this DuffCode
|
||||
*/
|
||||
public int getCharNum() {
|
||||
return charNum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the character for this glyph.
|
||||
* @return the identifying character for this DuffCode
|
||||
*/
|
||||
public char getCharacter() {
|
||||
return character;
|
||||
}
|
||||
|
||||
/**
|
||||
* Assigns a hashcode based on the font number and character for this glyph.
|
||||
* The hashcode for a DuffCode with font=1 and character='c'
|
||||
* is defined as the hash code of the string '1-c'.
|
||||
*
|
||||
* @return the hash code for this object
|
||||
*/
|
||||
public int hashCode() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(new Integer(fontNum).toString());
|
||||
sb.append('-');
|
||||
sb.append(character);
|
||||
String s = sb.toString();
|
||||
return s.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates two DuffCodes as equal iff their
|
||||
* font numbers and characters are identical.
|
||||
*
|
||||
* @param o the object (DuffCode) you want to compare
|
||||
* @return true if this object is equal to o, false if not
|
||||
*/
|
||||
public boolean equals(Object o) {
|
||||
if (o instanceof DuffCode) {
|
||||
DuffCode dc = (DuffCode)o;
|
||||
|
||||
if (fontNum == dc.fontNum && charNum == dc.charNum)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a string representation of this object
|
||||
*/
|
||||
public String toString() {
|
||||
return "fontNum="+fontNum+";charNum="+charNum+";character="+new Character(character).toString();
|
||||
}
|
||||
}
|
62
source/org/thdl/tib/text/InvalidWylieException.java
Normal file
62
source/org/thdl/tib/text/InvalidWylieException.java
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.text;
|
||||
|
||||
/**
|
||||
* Thrown whenever
|
||||
* a process runs into invalid Extended Wylie. This is usually thrown
|
||||
* while converting Wylie to
|
||||
* TibetanMachineWeb when the converter runs into invalid Wylie.
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class InvalidWylieException extends Exception {
|
||||
private String wylie;
|
||||
private int offset;
|
||||
|
||||
/**
|
||||
* Creates an InvalidWylieException.
|
||||
* @param s a string of Wylie text
|
||||
* @param i the offset where problems for the process began
|
||||
*/
|
||||
public InvalidWylieException(String s, int i) {
|
||||
wylie = s;
|
||||
offset = i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the character that caused the problem.
|
||||
* @return the character believed to be the problem for the process
|
||||
*/
|
||||
public char getCulprit() {
|
||||
return wylie.charAt(offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the character that caused the problem, in context.
|
||||
* @return the string of text including and following the character
|
||||
* believed to be the problem for the process
|
||||
*/
|
||||
public String getCulpritInContext() {
|
||||
if (wylie.length() < offset+5)
|
||||
return wylie.substring(offset, wylie.length());
|
||||
else
|
||||
return wylie.substring(offset, offset+5);
|
||||
}
|
||||
}
|
1264
source/org/thdl/tib/text/TibetanDocument.java
Normal file
1264
source/org/thdl/tib/text/TibetanDocument.java
Normal file
File diff suppressed because it is too large
Load diff
144
source/org/thdl/tib/text/TibetanHTML.java
Normal file
144
source/org/thdl/tib/text/TibetanHTML.java
Normal file
|
@ -0,0 +1,144 @@
|
|||
package org.thdl.tib.text;
|
||||
|
||||
public class TibetanHTML {
|
||||
static String[] styleNames =
|
||||
{"tmw","tmw1","tmw2","tmw3","tmw4","tmw5","tmw6","tmw7","tmw8","tmw9"};
|
||||
|
||||
public static String getStyles(String fontSize) {
|
||||
return ".tmw {font: "+fontSize+"pt TibetanMachineWeb}\n"+
|
||||
".tmw1 {font: "+fontSize+"pt TibetanMachineWeb1}\n"+
|
||||
".tmw2 {font: "+fontSize+"pt TibetanMachineWeb2}\n"+
|
||||
".tmw3 {font: "+fontSize+"pt TibetanMachineWeb3}\n"+
|
||||
".tmw4 {font: "+fontSize+"pt TibetanMachineWeb4}\n"+
|
||||
".tmw5 {font: "+fontSize+"pt TibetanMachineWeb5}\n"+
|
||||
".tmw6 {font: "+fontSize+"pt TibetanMachineWeb6}\n"+
|
||||
".tmw7 {font: "+fontSize+"pt TibetanMachineWeb7}\n"+
|
||||
".tmw8 {font: "+fontSize+"pt TibetanMachineWeb8}\n"+
|
||||
".tmw9 {font: "+fontSize+"pt TibetanMachineWeb9}\n";
|
||||
}
|
||||
|
||||
|
||||
public static String getHTML(String wylie) {
|
||||
try {
|
||||
return getHTML(TibetanDocument.getTibetanMachineWeb(wylie));
|
||||
}
|
||||
catch (InvalidWylieException ive) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getHTML(TibetanDocument.DuffData[] duffData) {
|
||||
String[] styleNames =
|
||||
{"tmw","tmw1","tmw2","tmw3","tmw4","tmw5","tmw6","tmw7","tmw8","tmw9"};
|
||||
|
||||
StringBuffer htmlBuffer = new StringBuffer();
|
||||
htmlBuffer.append("<nobr>");
|
||||
|
||||
for (int i=0; i<duffData.length; i++) {
|
||||
char[] c = duffData[i].text.toCharArray();
|
||||
for (int k=0; k<c.length; k++) {
|
||||
htmlBuffer.append("<span class=\"");
|
||||
htmlBuffer.append(styleNames[duffData[i].font-1]);
|
||||
htmlBuffer.append("\">");
|
||||
|
||||
switch (c[k]) {
|
||||
case '"':
|
||||
htmlBuffer.append(""");
|
||||
break;
|
||||
case '<':
|
||||
htmlBuffer.append("<");
|
||||
break;
|
||||
case '>':
|
||||
htmlBuffer.append(">");
|
||||
break;
|
||||
case '&':
|
||||
htmlBuffer.append("&");
|
||||
break;
|
||||
default:
|
||||
htmlBuffer.append(c[k]);
|
||||
break;
|
||||
}
|
||||
|
||||
htmlBuffer.append("</span>");
|
||||
if (c[k] < 32) //must be formatting, like carriage return or tab
|
||||
htmlBuffer.append("<br>");
|
||||
|
||||
else {
|
||||
String wylie = TibetanMachineWeb.getWylieForGlyph(duffData[i].font, c[k]);
|
||||
if (TibetanMachineWeb.isWyliePunc(wylie))
|
||||
htmlBuffer.append("<wbr>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
htmlBuffer.append("</nobr>");
|
||||
return htmlBuffer.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//import org.apache.xerces.dom.DOMImplementationImpl;
|
||||
//import org.w3c.dom.*;
|
||||
|
||||
/*
|
||||
public static Node getHTML(String wylie) {
|
||||
try {
|
||||
return getHTML(TibetanDocument.getTibetanMachineWeb(wylie));
|
||||
}
|
||||
catch (InvalidWylieException ive) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static Node getHTML(TibetanDocument.DuffData[] duffData) {
|
||||
try {
|
||||
DOMImplementationImpl impl = new DOMImplementationImpl();
|
||||
Document doc = impl.createDocument(null, "root", null);
|
||||
// DocumentFragment frag = doc.createDocumentFragment()
|
||||
|
||||
|
||||
Element nobr = doc.createElement("nobr");
|
||||
// frag.appendChild(nobr);
|
||||
|
||||
for (int i=0; i<duffData.length; i++) {
|
||||
char[] c = duffData[i].text.toCharArray();
|
||||
for (int k=0; k<c.length; k++) {
|
||||
Element span = doc.createElement("span");
|
||||
span.setAttribute("class", styleNames[duffData[i].font-1]);
|
||||
// Text tib = doc.createTextNode(String.valueOf(c[k]));
|
||||
// span.appendChild(tib);
|
||||
nobr.appendChild(span);
|
||||
|
||||
String wylie = TibetanMachineWeb.getWylieForGlyph(duffData[i].font, c[k]);
|
||||
if (TibetanMachineWeb.isWyliePunc(wylie)) {
|
||||
Element wbr = doc.createElement("wbr");
|
||||
nobr.appendChild(wbr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//doc.appendChild(nobr);
|
||||
return nobr;
|
||||
|
||||
// return frag;
|
||||
}
|
||||
catch (DOMException dome) {
|
||||
switch (dome.code) {
|
||||
|
||||
case DOMException.HIERARCHY_REQUEST_ERR:
|
||||
System.out.println("hierarchy error!!");
|
||||
break;
|
||||
|
||||
case DOMException.WRONG_DOCUMENT_ERR:
|
||||
System.out.println("wrong doc error!!");
|
||||
break;
|
||||
|
||||
case DOMException.NO_MODIFICATION_ALLOWED_ERR:
|
||||
System.out.println("no mod allowed error!!");
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
*/
|
391
source/org/thdl/tib/text/TibetanKeyboard.java
Normal file
391
source/org/thdl/tib/text/TibetanKeyboard.java
Normal file
|
@ -0,0 +1,391 @@
|
|||
/*
|
||||
The contents of this file are subject to the THDL Open Community License
|
||||
Version 1.0 (the "License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License on the THDL web site
|
||||
(http://www.thdl.org/).
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific terms governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Initial Developer of this software is the Tibetan and Himalayan Digital
|
||||
Library (THDL). Portions created by the THDL are Copyright 2001 THDL.
|
||||
All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
*/
|
||||
|
||||
package org.thdl.tib.text;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import java.lang.*;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* An alternate (non-Extended Wylie) keyboard input
|
||||
* method. A keyboard URL is passed to its constructor. This URL
|
||||
* must follow a particular format, and include particular subparts.
|
||||
* For example, the keyboard URL must specify values for various
|
||||
* input parameters, as well as correspondences for the Wylie
|
||||
* characters this keyboard allows the user to input. For an example,
|
||||
* see the file 'sambhota_keyboard.ini' found in the same
|
||||
* directory as this class.
|
||||
* <p>
|
||||
* It is normative practice for a null keyboard to be
|
||||
* interpreted as the default Wylie keyboard.
|
||||
* A non-null keyboard defines a transformation of the default
|
||||
* Wylie keyboard, setting new values for each Wylie value, as
|
||||
* well as (re-)defining various parameters.
|
||||
*
|
||||
* @author Edward Garrett, Tibetan and Himalayan Digital Library
|
||||
* @version 1.0
|
||||
*/
|
||||
public class TibetanKeyboard {
|
||||
private boolean hasDisambiguatingKey;
|
||||
private char disambiguatingKey;
|
||||
private boolean hasSanskritStackingKey;
|
||||
private boolean hasTibetanStackingKey;
|
||||
private boolean isStackingMedial;
|
||||
private char stackingKey;
|
||||
private boolean isAChenRequiredBeforeVowel;
|
||||
private boolean isAChungConsonant;
|
||||
private boolean hasAVowel;
|
||||
private Map charMap;
|
||||
private Map vowelMap;
|
||||
private Map puncMap;
|
||||
private int command;
|
||||
private final int NO_COMMAND = 0;
|
||||
private final int PARAMETERS = 1;
|
||||
private final int CHARACTERS = 2;
|
||||
private final int VOWELS = 3;
|
||||
private final int PUNCTUATION = 4;
|
||||
|
||||
/**
|
||||
* A generic Exception to indicate an invalid keyboard.
|
||||
*/
|
||||
public class InvalidKeyboardException extends Exception {
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens the URL specified by the parameter,
|
||||
* and tries to construct a keyboard from it. If the file is
|
||||
* missing, or is invalid, an InvalidKeyboardException is
|
||||
* thrown.
|
||||
*
|
||||
* @param url the URL of the keyboard
|
||||
* @throws InvalidKeyboardException a valid keyboard cannot be
|
||||
* constructed from this URL
|
||||
*/
|
||||
public TibetanKeyboard(URL url) throws InvalidKeyboardException {
|
||||
try {
|
||||
InputStreamReader isr = new InputStreamReader(url.openStream());
|
||||
BufferedReader in = new BufferedReader(isr);
|
||||
|
||||
System.out.println("reading "+url.toString());
|
||||
String line;
|
||||
|
||||
charMap = new HashMap();
|
||||
vowelMap = new HashMap();
|
||||
puncMap = new HashMap();
|
||||
|
||||
command = NO_COMMAND;
|
||||
|
||||
boolean bool;
|
||||
|
||||
while ((line = in.readLine()) != null) {
|
||||
|
||||
if (line.startsWith("<?")) { //line is command
|
||||
if (line.equalsIgnoreCase("<?parameters?>"))
|
||||
command = PARAMETERS;
|
||||
|
||||
else if (line.equalsIgnoreCase("<?characters?>"))
|
||||
command = CHARACTERS;
|
||||
|
||||
else if (line.equalsIgnoreCase("<?vowels?>"))
|
||||
command = VOWELS;
|
||||
|
||||
else if (line.equalsIgnoreCase("<?punctuation?>"))
|
||||
command = PUNCTUATION;
|
||||
}
|
||||
else if (line.equals("")) //empty string
|
||||
;
|
||||
|
||||
else {
|
||||
StringTokenizer st = new StringTokenizer(line,"=");
|
||||
String left = null, right = null;
|
||||
|
||||
if (st.hasMoreTokens())
|
||||
left = st.nextToken();
|
||||
|
||||
if (st.hasMoreTokens())
|
||||
right = st.nextToken();
|
||||
|
||||
switch (command) {
|
||||
case NO_COMMAND:
|
||||
break;
|
||||
|
||||
case PARAMETERS:
|
||||
if (left == null)
|
||||
throw new InvalidKeyboardException();
|
||||
|
||||
if (right == null)
|
||||
break;
|
||||
|
||||
if (left.equals("stack key")) {
|
||||
stackingKey = right.charAt(0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (left.equals("disambiguating key")) {
|
||||
disambiguatingKey = right.charAt(0);
|
||||
break;
|
||||
}
|
||||
|
||||
bool = new Boolean(right).booleanValue();
|
||||
|
||||
if (left.equalsIgnoreCase("has sanskrit stacking"))
|
||||
hasSanskritStackingKey = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("has tibetan stacking"))
|
||||
hasTibetanStackingKey = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("is stacking medial"))
|
||||
isStackingMedial = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("has disambiguating key"))
|
||||
hasDisambiguatingKey = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("needs achen before vowels"))
|
||||
isAChenRequiredBeforeVowel = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("has 'a' vowel"))
|
||||
hasAVowel = bool;
|
||||
|
||||
if (left.equalsIgnoreCase("is achung consonant"))
|
||||
isAChungConsonant = bool;
|
||||
|
||||
break;
|
||||
|
||||
case CHARACTERS:
|
||||
if (left == null)
|
||||
throw new InvalidKeyboardException();
|
||||
|
||||
if (right == null)
|
||||
break;
|
||||
|
||||
charMap.put(right, left);
|
||||
break;
|
||||
|
||||
case VOWELS:
|
||||
if (left == null)
|
||||
throw new InvalidKeyboardException();
|
||||
|
||||
if (right == null)
|
||||
break;
|
||||
|
||||
vowelMap.put(right, left);
|
||||
break;
|
||||
|
||||
case PUNCTUATION:
|
||||
if (left == null)
|
||||
throw new InvalidKeyboardException();
|
||||
|
||||
if (right == null)
|
||||
break;
|
||||
|
||||
puncMap.put(right, left);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new InvalidKeyboardException();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this keyboard have a disambiguating key?
|
||||
* @return true if this keyboard has a disambiguating key, e.g.
|
||||
* the period in Wylie 'g.y' vs. Wylie 'gy', false otherwise
|
||||
*/
|
||||
public boolean hasDisambiguatingKey() {
|
||||
return hasDisambiguatingKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the disambiguating key for this keyboard.
|
||||
* @return the disambiguating key, assuming this keyboard has one
|
||||
*/
|
||||
public char getDisambiguatingKey() {
|
||||
return disambiguatingKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this keyboard require a stacking key for Sanskrit stacks?
|
||||
* @return true if this keyboard requires a
|
||||
* stacking key for Sanskrit stacks
|
||||
*/
|
||||
public boolean hasSanskritStackingKey() {
|
||||
return hasSanskritStackingKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this keyboard require a stacking key for Tibetan stacks?
|
||||
* @return true if this keyboard requires a
|
||||
* stacking key for Tibetan stacks
|
||||
*/
|
||||
public boolean hasTibetanStackingKey() {
|
||||
return hasTibetanStackingKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is stacking medial?
|
||||
* @return true if this keyboard has stacking, and
|
||||
* if that stacking is medial rather than pre/post.
|
||||
* In other words, if you want a stack consisting
|
||||
* of the (Wylie) characters 's', 'g', and 'r', and
|
||||
* if the stack key is '+', then if you get the
|
||||
* stack by typing 's+g+r', then this method returns
|
||||
* true. If you get it by typing '+sgr' or '+sgr+',
|
||||
* then the method returns false.
|
||||
*/
|
||||
public boolean isStackingMedial() {
|
||||
return isStackingMedial;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the stacking key.
|
||||
* @return the stacking key, if there is one
|
||||
*/
|
||||
public char getStackingKey() {
|
||||
return stackingKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Must achen be typed first if you want achen plus a vowel?
|
||||
* @return true if it is necessary in this keyboard to
|
||||
* type achen plus a vowel to get achen plus a vowel,
|
||||
* or if you can (as in Wylie), simply type the vowel,
|
||||
* and then automatically get achen plus the vowel,
|
||||
* assuming there is no preceding consonant.
|
||||
*/
|
||||
public boolean isAChenRequiredBeforeVowel() {
|
||||
return isAChenRequiredBeforeVowel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is achung treated as an ordinary consonant?
|
||||
* @return true if achung is counted as a consonant,
|
||||
* and thus treated as stackable like any other
|
||||
* consonant; false if achung is treated as a vowel,
|
||||
* as in Wylie.
|
||||
*/
|
||||
public boolean isAChungConsonant() {
|
||||
return isAChungConsonant;
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the keyboard have a key for the invisible 'a' vowel?
|
||||
* @return true if this keyboard has a keystroke
|
||||
* sequence for the invisible Wylie vowel 'a', false
|
||||
* if there is no way to type this invisible vowel.
|
||||
*/
|
||||
public boolean hasAVowel() {
|
||||
return hasAVowel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether or not a string is a character in this keyboard.
|
||||
* @return true if the parameter is a character
|
||||
* in this keyboard. This method checks to see
|
||||
* if the passed string has been mapped to a
|
||||
* Wylie character - if not, then it returns false.
|
||||
*
|
||||
* @param s the possible character
|
||||
*/
|
||||
public boolean isChar(String s) {
|
||||
if (charMap.containsKey(s))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Gets the Extended Wylie corresponding to this character.
|
||||
* @return the Wylie value corresponding to this
|
||||
* parameter, assuming it is in fact a character
|
||||
* in this keyboard; if not, returns null.
|
||||
*
|
||||
* @param the possible character
|
||||
*/
|
||||
public String getWylieForChar(String s) {
|
||||
if (!charMap.containsKey(s))
|
||||
return null;
|
||||
|
||||
return (String)charMap.get(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether or not a string is a punctuation mark in this keyboard?
|
||||
* @return true if the parameter is punctuation
|
||||
* in this keyboard. This method checks to see if the
|
||||
* passed string has been mapped to Wylie punctuation -
|
||||
* if not, then it returns false.
|
||||
*
|
||||
* @param s the possible punctuation
|
||||
*/
|
||||
public boolean isPunc(String s) {
|
||||
if (puncMap.containsKey(s))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Extended Wylie corresponding to this punctuation.
|
||||
* @return the Wylie value corresponding to this
|
||||
* parameter, assuming it is in fact punctuation
|
||||
* in this keyboard; if not, returns null.
|
||||
*
|
||||
* @param s the possible punctuation
|
||||
*/
|
||||
public String getWylieForPunc(String s) {
|
||||
if (!puncMap.containsKey(s))
|
||||
return null;
|
||||
|
||||
return (String)puncMap.get(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether or not the string is a vowel in this keyboard.
|
||||
* @return true if the parameter is a vowel
|
||||
* in this keyboard. This method checks to see if the
|
||||
* passed string has been mapped to a Wylie vowel -
|
||||
* if not, then it returns false.
|
||||
*
|
||||
* @param s the possible vowel
|
||||
*/
|
||||
public boolean isVowel(String s) {
|
||||
if (vowelMap.containsKey(s))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Extended Wylie corresponding to this vowel.
|
||||
* @return the Wylie value corresponding to this
|
||||
* parameter, assuming it is in fact a vowel
|
||||
* in this keyboard; if not, returns null.
|
||||
*
|
||||
* @param the possible vowel
|
||||
*/
|
||||
public String getWylieForVowel(String s) {
|
||||
if (!vowelMap.containsKey(s))
|
||||
return null;
|
||||
|
||||
return (String)vowelMap.get(s);
|
||||
}
|
||||
}
|
1122
source/org/thdl/tib/text/TibetanMachineWeb.java
Normal file
1122
source/org/thdl/tib/text/TibetanMachineWeb.java
Normal file
File diff suppressed because it is too large
Load diff
171
source/org/thdl/tib/text/TibetanQTText.java
Normal file
171
source/org/thdl/tib/text/TibetanQTText.java
Normal file
|
@ -0,0 +1,171 @@
|
|||
package org.thdl.tib.text;
|
||||
|
||||
import java.util.*;
|
||||
import org.w3c.dom.*;
|
||||
|
||||
public class TibetanQTText {
|
||||
private static String tibFontSize = "28";
|
||||
private Map lines;
|
||||
private Map times;
|
||||
int id;
|
||||
|
||||
public TibetanQTText() {
|
||||
lines = new HashMap();
|
||||
times = new TreeMap();
|
||||
id = 0;
|
||||
}
|
||||
|
||||
public void addLine(String wylie, String t1, String t2) {
|
||||
id++;
|
||||
String lineID = String.valueOf(id);
|
||||
lines.put(lineID, wylie);
|
||||
|
||||
try {
|
||||
Float startTime = new Float(t1);
|
||||
if (!times.containsKey(startTime))
|
||||
times.put(startTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(startTime);
|
||||
val += lineID+",";
|
||||
times.put(startTime, val);
|
||||
}
|
||||
|
||||
Float stopTime = new Float(t2);
|
||||
if (!times.containsKey(stopTime))
|
||||
times.put(stopTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(stopTime);
|
||||
val += lineID+",";
|
||||
times.put(stopTime, val);
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void organizeLines() {
|
||||
List line_list = new ArrayList();
|
||||
|
||||
Iterator iter = times.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Float this_time = (Float)iter.next();
|
||||
String these_lines = (String)times.get(this_time);
|
||||
|
||||
StringTokenizer sTok = new StringTokenizer(these_lines,",");
|
||||
while (sTok.hasMoreTokens()) {
|
||||
String lineID = sTok.nextToken();
|
||||
if (line_list.contains(lineID))
|
||||
line_list.remove(lineID);
|
||||
else
|
||||
line_list.add(lineID);
|
||||
}
|
||||
|
||||
StringBuffer sb = new StringBuffer();
|
||||
Iterator line_list_iter = line_list.iterator();
|
||||
while (line_list_iter.hasNext()) {
|
||||
String lineID = (String)line_list_iter.next();
|
||||
sb.append(lineID);
|
||||
sb.append(',');
|
||||
}
|
||||
|
||||
times.put(this_time, sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public String getQTTextForLines() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
|
||||
Iterator iter = times.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Float this_time = (Float)iter.next();
|
||||
sb.append(getQTTimeTag(String.valueOf(this_time)));
|
||||
String these_lines = (String)times.get(this_time);
|
||||
|
||||
StringTokenizer sTok = new StringTokenizer(these_lines,",");
|
||||
while (sTok.hasMoreTokens()) {
|
||||
String lineID = sTok.nextToken();
|
||||
String wylie = (String)lines.get(lineID);
|
||||
sb.append(getQTText(wylie));
|
||||
sb.append('\n');
|
||||
}
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String getQTHeader() {
|
||||
return "{QTtext}{plain}{anti-alias:off}{size:28}{justify:left}{timeScale:1000}{width:320}{height:120}{timeStamps:absolute}{language:0}{textEncoding:0}\n";
|
||||
}
|
||||
|
||||
public static String getQTTimeTag(String t) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append('[');
|
||||
sb.append(t);
|
||||
sb.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String getQTText(String wylie) {
|
||||
try {
|
||||
return getQTText(TibetanDocument.getTibetanMachineWeb(wylie));
|
||||
}
|
||||
catch (InvalidWylieException ive) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getQTText(TibetanDocument.DuffData[] duffData) {
|
||||
StringBuffer qtBuffer = new StringBuffer();
|
||||
qtBuffer.append("{size:" + tibFontSize + "}");
|
||||
|
||||
for (int i=0; i<duffData.length; i++) {
|
||||
qtBuffer.append("{font:" + TibetanMachineWeb.tmwFontNames[duffData[i].font] + "}");
|
||||
qtBuffer.append(duffData[i].text);
|
||||
}
|
||||
|
||||
return qtBuffer.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public void addLine(NodeList nodes) {
|
||||
|
||||
|
||||
Element line = (Element)nodes.item(0);
|
||||
Node wylie_node = line.getFirstChild();
|
||||
// NodeList wylie_nodes = line.getElementsByTagName("wylie");
|
||||
|
||||
// Node wylie_node = wylie_nodes.item(0);
|
||||
Node wylie_text = wylie_node.getFirstChild();
|
||||
System.out.println(wylie_text.getNodeName());
|
||||
// String wylie = wylie_text.getNodeValue();
|
||||
id++;
|
||||
String lineID = String.valueOf(id);
|
||||
lines.put(lineID, wylie);
|
||||
|
||||
NodeList audio_nodes = line.getElementsByTagName("AUDIO");
|
||||
Element audio_element = (Element)audio_nodes.item(0);
|
||||
try {
|
||||
Integer startTime = Integer.valueOf(audio_element.getAttribute("begin"));
|
||||
if (!times.containsKey(startTime))
|
||||
times.put(startTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(startTime);
|
||||
val += lineID+",";
|
||||
times.put(startTime, val);
|
||||
}
|
||||
|
||||
Integer stopTime = Integer.valueOf(audio_element.getAttribute("end"));
|
||||
if (!times.containsKey(stopTime))
|
||||
times.put(stopTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(stopTime);
|
||||
val += lineID+",";
|
||||
times.put(stopTime, val);
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
}
|
||||
}
|
||||
*/
|
171
source/org/thdl/tib/text/TibetanQTText2.java
Normal file
171
source/org/thdl/tib/text/TibetanQTText2.java
Normal file
|
@ -0,0 +1,171 @@
|
|||
package org.thdl.tib.text;
|
||||
|
||||
import java.util.*;
|
||||
import org.w3c.dom.*;
|
||||
|
||||
public class TibetanQTText2 {
|
||||
private static String tibFontSize = "28";
|
||||
private Map lines;
|
||||
private Map times;
|
||||
int id;
|
||||
|
||||
public TibetanQTText2() {
|
||||
lines = new HashMap();
|
||||
times = new TreeMap();
|
||||
id = 0;
|
||||
}
|
||||
|
||||
public void addLine(String wylie, String t1, String t2) {
|
||||
id++;
|
||||
String lineID = String.valueOf(id);
|
||||
lines.put(lineID, wylie);
|
||||
|
||||
try {
|
||||
Float startTime = new Float(t1);
|
||||
if (!times.containsKey(startTime))
|
||||
times.put(startTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(startTime);
|
||||
val += lineID+",";
|
||||
times.put(startTime, val);
|
||||
}
|
||||
|
||||
Float stopTime = new Float(t2);
|
||||
if (!times.containsKey(stopTime))
|
||||
times.put(stopTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(stopTime);
|
||||
val += lineID+",";
|
||||
times.put(stopTime, val);
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void organizeLines() {
|
||||
List line_list = new ArrayList();
|
||||
|
||||
Iterator iter = times.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Float this_time = (Float)iter.next();
|
||||
String these_lines = (String)times.get(this_time);
|
||||
|
||||
StringTokenizer sTok = new StringTokenizer(these_lines,",");
|
||||
while (sTok.hasMoreTokens()) {
|
||||
String lineID = sTok.nextToken();
|
||||
if (line_list.contains(lineID))
|
||||
line_list.remove(lineID);
|
||||
else
|
||||
line_list.add(lineID);
|
||||
}
|
||||
|
||||
StringBuffer sb = new StringBuffer();
|
||||
Iterator line_list_iter = line_list.iterator();
|
||||
while (line_list_iter.hasNext()) {
|
||||
String lineID = (String)line_list_iter.next();
|
||||
sb.append(lineID);
|
||||
sb.append(',');
|
||||
}
|
||||
|
||||
times.put(this_time, sb.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public String getQTTextForLines() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
|
||||
Iterator iter = times.keySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Float this_time = (Float)iter.next();
|
||||
sb.append(getQTTimeTag(String.valueOf(this_time)));
|
||||
String these_lines = (String)times.get(this_time);
|
||||
|
||||
StringTokenizer sTok = new StringTokenizer(these_lines,",");
|
||||
while (sTok.hasMoreTokens()) {
|
||||
String lineID = sTok.nextToken();
|
||||
String wylie = (String)lines.get(lineID);
|
||||
sb.append(getQTText(wylie));
|
||||
sb.append('\n');
|
||||
}
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String getQTHeader() {
|
||||
return "{QTtext}{plain}{anti-alias:off}{size:28}{justify:left}{timeScale:1000}{width:320}{height:120}{timeStamps:absolute}{language:0}{textEncoding:0}\n";
|
||||
}
|
||||
|
||||
public static String getQTTimeTag(String t) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append('[');
|
||||
sb.append(t);
|
||||
sb.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String getQTText(String wylie) {
|
||||
try {
|
||||
return getQTText(TibetanDocument.getTibetanMachineWeb(wylie));
|
||||
}
|
||||
catch (InvalidWylieException ive) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getQTText(TibetanDocument.DuffData[] duffData) {
|
||||
StringBuffer qtBuffer = new StringBuffer();
|
||||
qtBuffer.append("{size:" + tibFontSize + "}");
|
||||
|
||||
for (int i=0; i<duffData.length; i++) {
|
||||
qtBuffer.append("{font:" + TibetanMachineWeb.tmwFontNames[duffData[i].font] + "}");
|
||||
qtBuffer.append(duffData[i].text);
|
||||
}
|
||||
|
||||
return qtBuffer.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public void addLine(NodeList nodes) {
|
||||
|
||||
|
||||
Element line = (Element)nodes.item(0);
|
||||
Node wylie_node = line.getFirstChild();
|
||||
// NodeList wylie_nodes = line.getElementsByTagName("wylie");
|
||||
|
||||
// Node wylie_node = wylie_nodes.item(0);
|
||||
Node wylie_text = wylie_node.getFirstChild();
|
||||
System.out.println(wylie_text.getNodeName());
|
||||
// String wylie = wylie_text.getNodeValue();
|
||||
id++;
|
||||
String lineID = String.valueOf(id);
|
||||
lines.put(lineID, wylie);
|
||||
|
||||
NodeList audio_nodes = line.getElementsByTagName("AUDIO");
|
||||
Element audio_element = (Element)audio_nodes.item(0);
|
||||
try {
|
||||
Integer startTime = Integer.valueOf(audio_element.getAttribute("begin"));
|
||||
if (!times.containsKey(startTime))
|
||||
times.put(startTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(startTime);
|
||||
val += lineID+",";
|
||||
times.put(startTime, val);
|
||||
}
|
||||
|
||||
Integer stopTime = Integer.valueOf(audio_element.getAttribute("end"));
|
||||
if (!times.containsKey(stopTime))
|
||||
times.put(stopTime, lineID+",");
|
||||
else {
|
||||
String val = (String)times.get(stopTime);
|
||||
val += lineID+",";
|
||||
times.put(stopTime, val);
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
}
|
||||
}
|
||||
*/
|
38
source/org/thdl/tib/text/package.html
Normal file
38
source/org/thdl/tib/text/package.html
Normal file
|
@ -0,0 +1,38 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
|
||||
@(#)package.html
|
||||
|
||||
Copyright 2001 Tibetan and Himalayan Digital Library
|
||||
|
||||
This software is the confidential and proprietary information of
|
||||
the Tibetan and Himalayan Digital Library. You shall use such
|
||||
information only in accordance with the terms of the license
|
||||
agreement you entered into with the THDL.
|
||||
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
|
||||
Provides classes and methods for dealing with Tibetan text.
|
||||
<p>
|
||||
Designed for use with the Tibetan Computer
|
||||
Company's free cross-platform TibetanMachineWeb fonts, this package
|
||||
contains methods for getting the Extended Wylie
|
||||
correspondences for each TibetanMachineWeb glyph, and for
|
||||
convert back and forth between Extended
|
||||
Wylie and TibetanMachineWeb.
|
||||
<p>
|
||||
This package provides a variety of ways to store TibetanMachineWeb data,
|
||||
and includes methods to aid programmers who want to convert from
|
||||
Extended Wylie to HTML or other formats.
|
||||
<p>
|
||||
Here, you can also find methods for installing and managing Tibetan
|
||||
keyboards. Four keyboards have been provided in this release,
|
||||
but users may also create their own keyboards.
|
||||
<h2>Related Documentation</h2>
|
||||
@see org.thdl.tib.input
|
||||
</body>
|
||||
</html>
|
112
source/org/thdl/tib/text/sambhota_keyboard_1.ini
Normal file
112
source/org/thdl/tib/text/sambhota_keyboard_1.ini
Normal file
|
@ -0,0 +1,112 @@
|
|||
Sambhota Keymap One
|
||||
|
||||
<?parameters?>
|
||||
has sanskrit stacking=true
|
||||
has tibetan stacking=true
|
||||
is stacking medial=false
|
||||
stack key=f
|
||||
has disambiguating key=false
|
||||
disambiguating key=
|
||||
needs achen before vowels=true
|
||||
has 'a' vowel=true
|
||||
is achung consonant=true
|
||||
|
||||
<?characters?>
|
||||
k=k
|
||||
kh=K
|
||||
g=g
|
||||
ng=G
|
||||
c=c
|
||||
ch=C
|
||||
j=j
|
||||
ny=N
|
||||
t=t
|
||||
th=T
|
||||
d=d
|
||||
n=n
|
||||
p=p
|
||||
ph=P
|
||||
b=b
|
||||
m=m
|
||||
ts=x
|
||||
tsh=X
|
||||
dz=D
|
||||
w=w
|
||||
zh=Z
|
||||
z=z
|
||||
'='
|
||||
y=y
|
||||
r=r
|
||||
l=l
|
||||
sh=S
|
||||
s=s
|
||||
h=h
|
||||
a=A
|
||||
T=q
|
||||
Th=Q
|
||||
D=v
|
||||
N=V
|
||||
Sh=B
|
||||
0=0
|
||||
1=1
|
||||
2=2
|
||||
3=3
|
||||
4=4
|
||||
5=5
|
||||
6=6
|
||||
7=7
|
||||
8=8
|
||||
9=9
|
||||
<0=
|
||||
<1=
|
||||
<2=
|
||||
<3=
|
||||
<4=
|
||||
<5=
|
||||
<6=
|
||||
<7=
|
||||
<8=
|
||||
<9=
|
||||
>0=
|
||||
>1=
|
||||
>2=
|
||||
>3=
|
||||
>4=
|
||||
>5=
|
||||
>6=
|
||||
>7=
|
||||
>8=
|
||||
>9=
|
||||
|
||||
<?vowels?>
|
||||
a=a
|
||||
i=i
|
||||
u=u
|
||||
e=e
|
||||
o=o
|
||||
I=
|
||||
U=
|
||||
ai=E
|
||||
au=O
|
||||
A=
|
||||
-i=I
|
||||
-I=
|
||||
|
||||
<?punctuation?>
|
||||
_=.
|
||||
=
|
||||
/=,
|
||||
|=-
|
||||
!=
|
||||
:=;
|
||||
;=
|
||||
@=#
|
||||
#=$
|
||||
$=
|
||||
%=
|
||||
(=(
|
||||
)=)
|
||||
H=:
|
||||
M=&
|
||||
`=%
|
||||
&=@
|
115
source/org/thdl/tib/text/tcc_keyboard_1.ini
Normal file
115
source/org/thdl/tib/text/tcc_keyboard_1.ini
Normal file
|
@ -0,0 +1,115 @@
|
|||
Tibetan Computer Company Keyboard #1
|
||||
|
||||
Apparently the same as the Tibkey keyboard except:
|
||||
- 'h' is a pre-post stack key, not a medial stack key
|
||||
|
||||
<?parameters?>
|
||||
has sanskrit stacking=true
|
||||
has tibetan stacking=true
|
||||
is stacking medial=false
|
||||
stack key=h
|
||||
has disambiguating key=false
|
||||
disambiguating key=
|
||||
needs achen before vowels=true
|
||||
has 'a' vowel=false
|
||||
is achung consonant=true
|
||||
|
||||
<?characters?>
|
||||
k=q
|
||||
kh=w
|
||||
g=e
|
||||
ng=r
|
||||
c=t
|
||||
ch=y
|
||||
j=u
|
||||
ny=i
|
||||
t=o
|
||||
th=p
|
||||
d=[
|
||||
n=]
|
||||
p=a
|
||||
ph=s
|
||||
b=d
|
||||
m=f
|
||||
ts=k
|
||||
tsh=l
|
||||
dz=;
|
||||
w='
|
||||
zh=z
|
||||
z=x
|
||||
'=c
|
||||
y=v
|
||||
r=m
|
||||
l=,
|
||||
sh=.
|
||||
s=/
|
||||
h=>
|
||||
a=?
|
||||
T=Q
|
||||
Th=W
|
||||
D=E
|
||||
N=R
|
||||
Sh=T
|
||||
0=0
|
||||
1=1
|
||||
2=2
|
||||
3=3
|
||||
4=4
|
||||
5=5
|
||||
6=6
|
||||
7=7
|
||||
8=8
|
||||
9=9
|
||||
<0=
|
||||
<1=
|
||||
<2=
|
||||
<3=
|
||||
<4=
|
||||
<5=
|
||||
<6=
|
||||
<7=
|
||||
<8=
|
||||
<9=
|
||||
>0=
|
||||
>1=
|
||||
>2=
|
||||
>3=
|
||||
>4=
|
||||
>5=
|
||||
>6=
|
||||
>7=
|
||||
>8=
|
||||
>9=
|
||||
|
||||
<?vowels?>
|
||||
a=
|
||||
i=g
|
||||
u=j
|
||||
e=b
|
||||
o=n
|
||||
I=
|
||||
U=
|
||||
ai=B
|
||||
au=N
|
||||
A=
|
||||
-i=G
|
||||
-I=
|
||||
|
||||
<?punctuation?>
|
||||
_=
|
||||
=
|
||||
/=\
|
||||
|=+
|
||||
!=|
|
||||
:=%
|
||||
;=
|
||||
@=!
|
||||
#=@
|
||||
$=
|
||||
%=
|
||||
(=(
|
||||
)=)
|
||||
H=:
|
||||
M=*
|
||||
`=`
|
||||
&=$
|
112
source/org/thdl/tib/text/tcc_keyboard_2.ini
Normal file
112
source/org/thdl/tib/text/tcc_keyboard_2.ini
Normal file
|
@ -0,0 +1,112 @@
|
|||
Tibetan Computer Company Keyboard #2
|
||||
|
||||
<?parameters?>
|
||||
has sanskrit stacking=true
|
||||
has tibetan stacking=true
|
||||
is stacking medial=false
|
||||
stack key=a
|
||||
has disambiguating key=false
|
||||
disambiguating key=
|
||||
needs achen before vowels=true
|
||||
has 'a' vowel=false
|
||||
is achung consonant=true
|
||||
|
||||
<?characters?>
|
||||
k=q
|
||||
kh=w
|
||||
g=s
|
||||
ng=e
|
||||
c=b
|
||||
ch=n
|
||||
j=m
|
||||
ny=,
|
||||
t=o
|
||||
th=p
|
||||
d=j
|
||||
n=k
|
||||
p=r
|
||||
ph=/
|
||||
b=d
|
||||
m=f
|
||||
ts=;
|
||||
tsh='
|
||||
dz=[
|
||||
w=]
|
||||
zh=z
|
||||
z=x
|
||||
'=c
|
||||
y=g
|
||||
r=h
|
||||
l=v
|
||||
sh=.
|
||||
s=l
|
||||
h=G
|
||||
a=H
|
||||
T=O
|
||||
Th=P
|
||||
D=J
|
||||
N=K
|
||||
Sh=>
|
||||
0=0
|
||||
1=1
|
||||
2=2
|
||||
3=3
|
||||
4=4
|
||||
5=5
|
||||
6=6
|
||||
7=7
|
||||
8=8
|
||||
9=9
|
||||
<0=
|
||||
<1=
|
||||
<2=
|
||||
<3=
|
||||
<4=
|
||||
<5=
|
||||
<6=
|
||||
<7=
|
||||
<8=
|
||||
<9=
|
||||
>0=
|
||||
>1=
|
||||
>2=
|
||||
>3=
|
||||
>4=
|
||||
>5=
|
||||
>6=
|
||||
>7=
|
||||
>8=
|
||||
>9=
|
||||
|
||||
<?vowels?>
|
||||
a=
|
||||
i=t
|
||||
u=u
|
||||
e=y
|
||||
o=i
|
||||
I=
|
||||
U=
|
||||
ai=Y
|
||||
au=I
|
||||
A=
|
||||
-i=T
|
||||
-I=
|
||||
|
||||
<?punctuation?>
|
||||
_=
|
||||
=
|
||||
/=\
|
||||
|=+
|
||||
!=|
|
||||
:=%
|
||||
;=
|
||||
@=!
|
||||
#=@
|
||||
$=
|
||||
%=
|
||||
(=(
|
||||
)=)
|
||||
H=:
|
||||
M=*
|
||||
`=`
|
||||
&=$
|
1015
source/org/thdl/tib/text/tibwn.ini
Normal file
1015
source/org/thdl/tib/text/tibwn.ini
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue