├── .eslintrc
├── .github
└── workflows
│ ├── npm-publish.yaml
│ ├── npm-release.yaml
│ └── run-tests.yaml
├── .gitignore
├── CHANGES.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── package.json
├── src
├── changed.js
├── formats.js
├── index.js
├── myers.js
└── splitter.js
└── test
├── .eslintrc
├── chars.test.js
├── myers.test.js
├── options.test.js
├── resources
├── moons.diff
├── moons_lhs.txt
└── moons_rhs.txt
└── words.test.js
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "parserOptions": {
3 | "ecmaVersion": 2017
4 | },
5 | "extends": ["eslint:recommended"],
6 | "env": {
7 | "browser": true,
8 | "node": true,
9 | "es6": true
10 | },
11 | "rules": {
12 | "indent": ["error", "tab"]
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.github/workflows/npm-publish.yaml:
--------------------------------------------------------------------------------
1 | name: Publish to npm
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 | tag:
7 | description: 'NPM Tag'
8 | required: false
9 | default: 'next'
10 |
11 | jobs:
12 | tag-and-publish:
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - name: Setup node
17 | uses: actions/setup-node@v1
18 | with:
19 | node-version: 14
20 | registry-url: https://registry.npmjs.org
21 |
22 | - name: Git checkout
23 | uses: actions/checkout@v2
24 |
25 | - name: Install dependencies
26 | run: npm install
27 | env:
28 | CI: true
29 |
30 | - name: Get package version
31 | run: |
32 | export VERSION=`cat package.json | grep version | sed -E 's/.*: "(.*)",/\1/'`
33 | echo "PKG_VERSION=$VERSION" >> $GITHUB_ENV
34 | echo "DIST_TAG=v$VERSION" >> $GITHUB_ENV
35 |
36 | - name: Build
37 | run: npm run build --if-present
38 |
39 | - name: Tag repo with $DIST_TAG
40 | run: |
41 | git tag $DIST_TAG
42 | git push origin $DIST_TAG
43 |
44 | - name: Publish to npm with dist-tag next
45 | run: npm publish --access public --tag ${{ github.event.inputs.tag }}
46 | env:
47 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
48 |
--------------------------------------------------------------------------------
/.github/workflows/npm-release.yaml:
--------------------------------------------------------------------------------
1 | name: Release latest on npm
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 |
7 | jobs:
8 | tag-and-publish:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | - name: Setup node
13 | uses: actions/setup-node@v1
14 | with:
15 | node-version: 14
16 | registry-url: https://registry.npmjs.org
17 |
18 | - name: Git checkout
19 | uses: actions/checkout@v2
20 |
21 | - name: Get package version
22 | run: |
23 | export VERSION=`cat package.json | grep version | sed -E 's/.*: "(.*)",/\1/'`
24 | echo "PKG_VERSION=$VERSION" >> $GITHUB_ENV
25 |
26 | - name: Update dist-tag
27 | run: |
28 | npm dist-tag add myers-diff@${PKG_VERSION} latest
29 | npm dist-tag rm next
30 | env:
31 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
32 |
--------------------------------------------------------------------------------
/.github/workflows/run-tests.yaml:
--------------------------------------------------------------------------------
1 | name: Run tests
2 |
3 | # on: [push, pull_request]
4 |
5 | on:
6 | push:
7 | branches-ignore:
8 | - 'master'
9 | tags-ignore:
10 | - 'v*'
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 |
17 | strategy:
18 | matrix:
19 | node-version: [10.x, 12.x, 14.x]
20 |
21 | name: Node.js ${{ matrix.node-version }}
22 |
23 | steps:
24 | - name: Git checkout
25 | uses: actions/checkout@v2
26 |
27 | - name: Use Node.js ${{ matrix.node-version }}
28 | uses: actions/setup-node@v1
29 | with:
30 | node-version: ${{ matrix.node-version }}
31 |
32 | - name: Install dependencies
33 | run: npm install
34 | env:
35 | CI: true
36 |
37 | - name: Build
38 | run: npm run build --if-present
39 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | coverage/
3 | .nyc_output/
4 | npm-debug.log
5 | .npmrc
6 |
--------------------------------------------------------------------------------
/CHANGES.md:
--------------------------------------------------------------------------------
1 | # Changes
2 |
3 | ## 2.0.1
4 | * patch: removed superfluous newline from the GNU normal format
5 |
6 | ## 2.0.0
7 | Major interface change.
8 |
9 | * major: changed minimum version to Node.js 10.x
10 | * major: changed main exported interface
11 | * major: no longer building browser bundled source
12 | * major: dropped bower support
13 | * major: added `getPart` to lhs/rhs change items for easier access (than `ctx`).
14 | * major: removed `ctx` from lhs/rhs change items (this is now not part of the public interface).
15 | * minor: added `changed` function for easier comparison
16 | * minor: lhs/rhs items now have `pos`, `text`, and `length`
17 | * chore: updated dependencies
18 | * chore: updated documenation
19 |
20 | ## 1.x
21 | Initial release.
22 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Thank you for helping make myers-diff better! Every contribution is appreciated. If you plan to implement a new feature, please create an issue first, to make sure your work is not lost, but also so that the maintainers can get an idea of what you are planning.
4 |
5 | ## Documentation
6 |
7 | Your changes must ensure that the documentation in REAMDE.md are up to date.
8 |
9 | ## Development
10 |
11 | Code must have 100% code coverage to be accepted.
12 |
13 | To run the unit-tests:
14 |
15 | ```bash
16 | $ npm test
17 | ```
18 |
19 | To run one test, you can find it in the source, and add `.only`, e.g.:
20 |
21 | ```js
22 | it.only('should compare chars at end of string', function() {
23 | ```
24 |
25 | To run the full build, including linting:
26 |
27 | ```bash
28 | $ npm run build
29 | ```
30 |
31 | ## Code style
32 |
33 | - Use tabs and use the same style that the rest of the module uses.
34 | - With the exception of some iterators (e.g. `i`, do not use single-character variables).
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # myers-diff
2 |
3 | A JavaScript test differentiation implementation based on [An O(ND) Difference Algorithm and Its Variations (1986)](www.xmailserver.org/diff2.pdf). It is a lightweight, low-level, no-frills library that can be used to build bulkier viewers.
4 |
5 | ## Installation
6 |
7 | ```bash
8 | $ npm install myers-diff
9 | ```
10 |
11 | ## Getting started
12 |
13 | With basic usage:
14 |
15 | ```js
16 | const myers = require('myers-diff');
17 |
18 | const lhs = 'the quick red fox jumped\nover the hairy dog';
19 | const rhs = 'the quick brown fox jumped\nover the lazy dog';
20 |
21 | const diff = myers.diff(lhs, rhs);
22 |
23 | console.log(myers.formats.GnuNormalFormat(diff));
24 | console.log(diff);
25 | //
26 | // 1,2c1,2
27 | // < the quick red fox jumped
28 | // < over the hairy dog
29 | // ---
30 | // > the quick brown fox jumped
31 | // > over the lazy dog
32 | ```
33 |
34 | With all options:
35 |
36 | ```js
37 | const myers = require('myers-diff');
38 |
39 | const lhs = 'the quick red fox jumped\nover the hairy dog';
40 | const rhs = 'the quick brown fox jumped\nover the lazy dog';
41 |
42 | const diff = myers.diff(lhs, rhs, {
43 | compare: 'lines',
44 | ignoreWhitespace: false,
45 | ignoreCase: false,
46 | ignoreAccents: false
47 | });
48 | ```
49 |
50 | For building visual editors:
51 |
52 | ```js
53 | const { diff, changed } = require('myers-diff');
54 | const lhs = 'the quick red fox jumped\nover the hairy dog';
55 | const rhs = 'the quick brown fox jumped\nover the lazy dog';
56 | const changes = diff(lhs, rhs);
57 |
58 | for (const change of changes) {
59 | if (changed(change.lhs)) {
60 | // deleted
61 | const { pos, text, del, length } = change.lhs;
62 | }
63 | if (changed(change.rhs)) {
64 | // added
65 | const { pos, text, add, length } = change.rhs;
66 | }
67 | }
68 | ```
69 |
70 | ## API
71 |
72 | - `myers`
73 | - [`myers.diff(lhs, rhs, [options])`](#diff)
74 | - [`myers.formats`](#formats)
75 | - [`GnuNormalFormat`](#formats-gnunormalformat)
76 | - [`myers.changed(part)`](#changed)
77 | - Types
78 | - [`Change`](#change)
79 | - [`LeftPart`](#leftpart)
80 | - [`RightPart`](#rightpart)
81 |
82 |
83 |
84 | ### myers.diff(lhs, rhs, [options])
85 |
86 | Compare `lhs` text to `rhs` text. `lhs` and `rhs` can also be an arbitrary array if `compare` is set to `'chars'`. Changes are compared from left to right such that items are deleted from left or added to right.
87 |
88 | - `lhs` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) - The left-hand side text to compare.
89 | - `rhs` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) - The right-hand side text to compare.
90 | - `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) - Diff options.
91 | - `compare` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) - Comparison mode (`'lines'`, `'words'`, `'chars'`).
92 | - `ignoreWhitespace` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type") - Ignores whitespace characters.
93 | - `ignoreCase` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type") - Ignores whitespace characters.
94 | - `ignoreAccents` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type") - Ignores accent characters.
95 | - Returns: `<`[`Change`](#change)`[]>` - Returns an array of [Change](#change).
96 |
97 |
98 |
99 | ### Change
100 |
101 | An object that describes a change occurrence between the left-hand text and right-hand text.
102 |
103 | - `lhs` [``](#leftpart)- Describes the left-hand change.
104 | - `rhs` [``](#rightpart) - Describes the right-hand change.
105 |
106 |
107 |
108 | ### LeftPart
109 |
110 | Describes a left-hand change occurrence.
111 |
112 | - `at` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The part item identifier. When comparing lines, it is the _n-th_ line; when comparing words, it is the _n-th_ word; when comparing chars, it is the _n-th_ char.
113 | - `del` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The number of parts deleted from the left. When comparing lines, it is the number of lines deleted; when comparing words, it is the number of words deleted; when comparing chars, it is the number of chars deleted.
114 | - `pos` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The zero-based character position of the part from the original text.
115 | - `text` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) - The text that was changed.
116 | - `length` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The number of characters.
117 |
118 |
119 |
120 | ### RightPart
121 |
122 | Describes a right-hand change occurrence.
123 |
124 | - `at` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The part item identifier. When comparing lines, it is the _n-th_ line; when comparing words, it is the _n-th_ word; when comparing chars, it is the _n-th_ char.
125 | - `add` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The number of parts added from the right. When comparing lines, it is the number of lines added; when comparing words, it is the number of words added; when comparing chars, it is the number of chars added.
126 | - `pos` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The zero-based character position of the part from the original text.
127 | - `text` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) - The text that was changed.
128 | - `length` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) - The number of characters.
129 |
130 |
131 |
132 | ### myers.formats
133 |
134 | Formatting functions.
135 |
136 | #### GnuNormalFormat(changes)
137 |
138 | Formats an array of [Change](#change) in [GNU Normal Format](https://www.gnu.org/software/diffutils/manual/html_node/Example-Normal.html#Example-Normal).
139 |
140 | - `changes` `<`[`Change`](#change)`[]>` - An array of changes from [myers.diff](#diff).
141 | - Returns [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The diff text.
142 |
143 |
144 |
145 | ### myers.changed(part)
146 |
147 | Examines the [`LeftPart`](#leftpart) or [`RightPart`](#rightpart) `part` to determine if was changed. It is possible for a [Change](#change) to only affect one side or the other, or both. If changed, it returns `true`, otherwise, it returns `false`.
148 |
149 | - `part` `<`[`LeftPart`](#leftpart) | [`RightPart`](#rightpart)`>`- The left-hand part or right-hand part to compare.
150 | - Returns: [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type") Returns `true` if changed, otherwise, it returns `false`.
151 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "myers-diff",
3 | "author": "Jamie Peabody",
4 | "version": "2.1.0",
5 | "description": "Implementation of the longest common subsequence (diff) algorithm.",
6 | "license": "Apache-2.0",
7 | "main": "src/index.js",
8 | "keywords": [
9 | "diff",
10 | "compare",
11 | "patch"
12 | ],
13 | "files": [
14 | "src",
15 | "README.md",
16 | "LICENSE"
17 | ],
18 | "repository": {
19 | "type": "git",
20 | "url": "https://github.com/wickedest/myers-diff"
21 | },
22 | "bugs": {
23 | "url": "https://github.com/wickedest/myers-diff/issues"
24 | },
25 | "homepage": "https://github.com/wickedest/myers-diff",
26 | "devDependencies": {
27 | "chai": "^4.2.0",
28 | "eslint": "^7.11.0",
29 | "eslint-plugin-chai-expect": "^2.2.0",
30 | "eslint-plugin-mocha": "^8.0.0",
31 | "mocha": "^8.1.3",
32 | "nyc": "^15.1.0"
33 | },
34 | "engines": {
35 | "node": ">=10"
36 | },
37 | "nyc": {
38 | "all": true,
39 | "check-coverage": true,
40 | "branches": 100,
41 | "lines": 100,
42 | "functions": 100,
43 | "statements": 100,
44 | "reporter": [
45 | "lcov"
46 | ]
47 | },
48 | "scripts": {
49 | "build": "npm run lint && npm run test",
50 | "test": "nyc --reporter=lcov --reporter=text-summary mocha --recursive",
51 | "test:watch": "mocha --recursive --watch",
52 | "test:nocoverage": "mocha --recursive",
53 | "lint": "eslint src test"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/changed.js:
--------------------------------------------------------------------------------
1 | function changed(change) {
2 | if (!change.del && change.add) {
3 | return true;
4 | }
5 | if (change.del && !change.add) {
6 | return true;
7 | }
8 | return false;
9 | }
10 |
11 | module.exports = changed;
12 |
--------------------------------------------------------------------------------
/src/formats.js:
--------------------------------------------------------------------------------
1 | // NormalFormat
2 | // http://www.gnu.org/software/diffutils/manual/html_node/Example-Normal.html#Example-Normal
3 | function GnuNormalFormat(change) {
4 | const nf = [];
5 | const str = [];
6 |
7 | // del add description
8 | // 0 >0 added count to rhs
9 | // >0 0 deleted count from lhs
10 | // >0 >0 changed count lines
11 | let op;
12 | if (change.lhs.del === 0 && change.rhs.add > 0) {
13 | op = 'a';
14 | }
15 | else if (change.lhs.del > 0 && change.rhs.add === 0) {
16 | op = 'd';
17 | }
18 | else {
19 | op = 'c';
20 | }
21 |
22 | function encodeSide(side, key) {
23 | // encode side as a start,stop if a range
24 | str.push(side.at + 1);
25 | if (side[key] > 1) {
26 | str.push(',');
27 | str.push(side[key] + side.at);
28 | }
29 | }
30 | encodeSide(change.lhs, 'del');
31 | str.push(op);
32 | encodeSide(change.rhs, 'add');
33 |
34 | nf.push(str.join(''));
35 | for (let i = change.lhs.at; i < change.lhs.at + change.lhs.del; ++i) {
36 | nf.push('< ' + change.lhs.getPart(i).text);
37 | }
38 | if (change.rhs.add && change.lhs.del) {
39 | nf.push('---');
40 | }
41 | for (let i = change.rhs.at; i < change.rhs.at + change.rhs.add; ++i) {
42 | nf.push('> ' + change.rhs.getPart(i).text);
43 | }
44 | return nf.join('\n');
45 | }
46 |
47 | var formats = {
48 | GnuNormalFormat: function (changes) {
49 | var i, out = [];
50 | for (i = 0; i < changes.length; ++i) {
51 | out.push(GnuNormalFormat(changes[i]));
52 | }
53 | return out.join('\n');
54 | }
55 | }
56 |
57 | module.exports = formats;
58 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | const { diff } = require('./myers');
2 | const formats = require('./formats');
3 | const changed = require('./changed');
4 |
5 | module.exports = {
6 | diff,
7 | formats,
8 | changed
9 | };
10 |
--------------------------------------------------------------------------------
/src/myers.js:
--------------------------------------------------------------------------------
1 | const Splitter = require('./splitter');
2 |
3 | function getDefaultSettings() {
4 | return {
5 | compare: 'lines', // lines|words|chars
6 | ignoreWhitespace: false,
7 | ignoreCase: false,
8 | ignoreAccents: false
9 | };
10 | }
11 |
12 | /**
13 | * Encodes text into diff-codes to prepare for Myers diff.
14 | */
15 | class Encoder {
16 | constructor() {
17 | this.code = 0;
18 | this.diff_codes = {};
19 | }
20 |
21 | encode(text, settings) {
22 | return new EncodeContext(this, text, settings);
23 | }
24 |
25 | getCode(line) {
26 | if (this.diff_codes[line]) {
27 | return this.diff_codes[line];
28 | }
29 | this.code = this.code + 1;
30 | this.diff_codes[line] = this.code;
31 | return this.code;
32 | }
33 | }
34 |
35 | /**
36 | * Encoder context
37 | */
38 | class EncodeContext {
39 | constructor(encoder, text, options) {
40 | let re;
41 | if (text) {
42 | if (options.compare === 'chars') {
43 | // split all chars
44 | re = '';
45 | } else if (options.compare === 'words') {
46 | // split all of the text on spaces
47 | re = ' ';
48 | } else { // lines (default)
49 | re = '\n';
50 | }
51 | }
52 |
53 | this.encoder = encoder;
54 | this._codes = {};
55 | this._modified = {};
56 | this._parts = [];
57 |
58 | let count = 0;
59 | const split = new Splitter(text, re);
60 | let part;
61 | while ((part = split.next()) !== null) {
62 | let line = part.text;
63 | if (options.ignoreWhitespace) {
64 | line = line.replace(/\s+/g, '');
65 | }
66 | if (options.ignoreCase) {
67 | line = line.toLowerCase();
68 | }
69 | if (options.ignoreAccents) {
70 | line = line.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
71 | }
72 | const aCode = encoder.getCode(line);
73 | this._codes[count] = aCode;
74 | this._parts.push(part);
75 | count += 1;
76 | }
77 | }
78 |
79 | finish() {
80 | delete this.encoder;
81 | }
82 |
83 | get codes() {
84 | return this._codes;
85 | }
86 |
87 | get length() {
88 | return Object.keys(this._codes).length;
89 | }
90 |
91 | get modified() {
92 | return this._modified;
93 | }
94 | }
95 |
96 | class Myers {
97 | static compareLCS(lhsCtx, rhsCtx, callback) {
98 | let lhsStart = 0;
99 | let rhsStart = 0;
100 | let lhsLine = 0;
101 | let rhsLine = 0;
102 |
103 | while (lhsLine < lhsCtx.length || rhsLine < rhsCtx.length) {
104 | if ((lhsLine < lhsCtx.length) && (!lhsCtx.modified[lhsLine])
105 | && (rhsLine < rhsCtx.length) && (!rhsCtx.modified[rhsLine])) {
106 | // equal lines
107 | lhsLine++;
108 | rhsLine++;
109 | }
110 | else {
111 | // maybe deleted and/or inserted lines
112 | lhsStart = lhsLine;
113 | rhsStart = rhsLine;
114 | while ((lhsLine < lhsCtx.length)
115 | && (rhsLine >= rhsCtx.length || lhsCtx.modified[lhsLine])) {
116 | lhsLine++;
117 | }
118 | while ((rhsLine < rhsCtx.length)
119 | && (lhsLine >= lhsCtx.length || rhsCtx.modified[rhsLine])) {
120 | rhsLine++;
121 | }
122 | // istanbul ignore else
123 | if ((lhsStart < lhsLine) || (rhsStart < rhsLine)) {
124 | const lat = Math.min(lhsStart, (lhsCtx.length) ? lhsCtx.length - 1 : 0);
125 | const rat = Math.min(rhsStart, (rhsCtx.length) ? rhsCtx.length - 1 : 0);
126 | const lpart = lhsCtx._parts[Math.min(lhsStart, lhsCtx.length - 1)];
127 | const rpart = rhsCtx._parts[Math.min(rhsStart, rhsCtx.length - 1)];
128 |
129 | const item = {
130 | lhs: {
131 | at: lat,
132 | del: lhsLine - lhsStart,
133 | pos: lpart ? lpart.pos : null,
134 | text: lpart ? lpart.text : null
135 | },
136 | rhs: {
137 | at: rat,
138 | add: rhsLine - rhsStart,
139 | pos: rpart ? rpart.pos : null,
140 | text: rpart ? rpart.text : null
141 | }
142 | };
143 | callback(item);
144 | }
145 | }
146 | }
147 | }
148 |
149 | static getShortestMiddleSnake(
150 | lhsCtx, lhsLower, lhsUpper,
151 | rhsCtx, rhsLower, rhsUpper,
152 | vectorU, vectorD
153 | ) {
154 | const max = lhsCtx.length + rhsCtx.length + 1;
155 | // istanbul ignore next
156 | if (max === undefined) {
157 | throw new Error('unexpected state');
158 | }
159 | let kdown = lhsLower - rhsLower,
160 | kup = lhsUpper - rhsUpper,
161 | delta = (lhsUpper - lhsLower) - (rhsUpper - rhsLower),
162 | odd = (delta & 1) != 0,
163 | offset_down = max - kdown,
164 | offset_up = max - kup,
165 | maxd = ((lhsUpper - lhsLower + rhsUpper - rhsLower) / 2) + 1,
166 | ret = {x:0, y:0}, d, k, x, y;
167 |
168 | vectorD[offset_down + kdown + 1] = lhsLower;
169 | vectorU[offset_up + kup - 1] = lhsUpper;
170 | for (d = 0; d <= maxd; ++d) {
171 | for (k = kdown - d; k <= kdown + d; k += 2) {
172 | if (k === kdown - d) {
173 | x = vectorD[offset_down + k + 1];//down
174 | }
175 | else {
176 | x = vectorD[offset_down + k - 1] + 1;//right
177 | if ((k < (kdown + d)) && (vectorD[offset_down + k + 1] >= x)) {
178 | x = vectorD[offset_down + k + 1];//down
179 | }
180 | }
181 | y = x - k;
182 | // find the end of the furthest reaching forward D-path in diagonal k.
183 | while ((x < lhsUpper)
184 | && (y < rhsUpper)
185 | && (lhsCtx.codes[x] === rhsCtx.codes[y])
186 | ) {
187 | x++; y++;
188 | }
189 | vectorD[ offset_down + k ] = x;
190 | // overlap ?
191 | if (odd && (kup - d < k) && (k < kup + d)) {
192 | if (vectorU[offset_up + k] <= vectorD[offset_down + k]) {
193 | ret.x = vectorD[offset_down + k];
194 | ret.y = vectorD[offset_down + k] - k;
195 | return (ret);
196 | }
197 | }
198 | }
199 | // Extend the reverse path.
200 | for (k = kup - d; k <= kup + d; k += 2) {
201 | // find the only or better starting point
202 | if (k === kup + d) {
203 | x = vectorU[offset_up + k - 1]; // up
204 | } else {
205 | x = vectorU[offset_up + k + 1] - 1; // left
206 | if ((k > kup - d) && (vectorU[offset_up + k - 1] < x))
207 | x = vectorU[offset_up + k - 1]; // up
208 | }
209 | y = x - k;
210 | while ((x > lhsLower)
211 | && (y > rhsLower)
212 | && (lhsCtx.codes[x - 1] === rhsCtx.codes[y - 1])
213 | ) {
214 | // diagonal
215 | x--;
216 | y--;
217 | }
218 | vectorU[offset_up + k] = x;
219 | // overlap ?
220 | if (!odd && (kdown - d <= k) && (k <= kdown + d)) {
221 | if (vectorU[offset_up + k] <= vectorD[offset_down + k]) {
222 | ret.x = vectorD[offset_down + k];
223 | ret.y = vectorD[offset_down + k] - k;
224 | return (ret);
225 | }
226 | }
227 | }
228 | }
229 | // should never get to this state
230 | // istanbul ignore next
231 | throw new Error('unexpected state');
232 | }
233 |
234 | static getLongestCommonSubsequence(
235 | lhsCtx, lhsLower, lhsUpper,
236 | rhsCtx, rhsLower, rhsUpper,
237 | vectorU = [], vectorD = []
238 | ) {
239 | // trim off the matching items at the beginning
240 | while ( (lhsLower < lhsUpper)
241 | && (rhsLower < rhsUpper)
242 | && (lhsCtx.codes[lhsLower] === rhsCtx.codes[rhsLower]) ) {
243 | ++lhsLower;
244 | ++rhsLower;
245 | }
246 | // trim off the matching items at the end
247 | while ( (lhsLower < lhsUpper)
248 | && (rhsLower < rhsUpper)
249 | && (lhsCtx.codes[lhsUpper - 1] === rhsCtx.codes[rhsUpper - 1]) ) {
250 | --lhsUpper;
251 | --rhsUpper;
252 | }
253 | if (lhsLower === lhsUpper) {
254 | while (rhsLower < rhsUpper) {
255 | rhsCtx.modified[rhsLower++] = true;
256 | }
257 | }
258 | else if (rhsLower === rhsUpper) {
259 | while (lhsLower < lhsUpper) {
260 | lhsCtx.modified[lhsLower++] = true;
261 | }
262 | }
263 | else {
264 | const { x, y } = Myers.getShortestMiddleSnake(
265 | lhsCtx, lhsLower, lhsUpper,
266 | rhsCtx, rhsLower, rhsUpper,
267 | vectorU, vectorD);
268 | Myers.getLongestCommonSubsequence(
269 | lhsCtx, lhsLower, x,
270 | rhsCtx, rhsLower, y,
271 | vectorU, vectorD);
272 | Myers.getLongestCommonSubsequence(
273 | lhsCtx, x, lhsUpper,
274 | rhsCtx, y, rhsUpper,
275 | vectorU, vectorD);
276 | }
277 | }
278 |
279 | /**
280 | * Compare {@code lhs} to {@code rhs}. Changes are compared from left
281 | * to right such that items are deleted from left, or added to right,
282 | * or just otherwise changed between them.
283 | *
284 | * @param {string} lhs - The left-hand source text.
285 | * @param {string} rhs - The right-hand source text.
286 | * @param {object} [options={}] - Optional settings.
287 | */
288 | static diff(lhs, rhs, options = {}) {
289 | const settings = getDefaultSettings();
290 | const encoder = new Encoder();
291 |
292 | if (lhs === undefined) {
293 | throw new Error('illegal argument \'lhs\'');
294 | }
295 | if (rhs === undefined) {
296 | throw new Error('illegal argument \'rhs\'');
297 | }
298 |
299 | Object.assign(settings, options);
300 |
301 | const lhsCtx = encoder.encode(lhs, settings);
302 | const rhsCtx = encoder.encode(rhs, settings);
303 |
304 | // Myers.LCS(lhsCtx, rhsCtx);
305 |
306 | Myers.getLongestCommonSubsequence(
307 | lhsCtx,
308 | 0,
309 | lhsCtx.length,
310 | rhsCtx,
311 | 0,
312 | rhsCtx.length
313 | );
314 |
315 | // compare lhs/rhs codes and build a list of comparisons
316 | const changes = [];
317 | const compare = (options.compare === 'chars') ? 0 : 1;
318 |
319 | Myers.compareLCS(lhsCtx, rhsCtx, function _changeItem(item) {
320 | // add context information
321 | item.lhs.getPart = (n) => lhsCtx._parts[n];
322 | item.rhs.getPart = (n) => rhsCtx._parts[n];
323 | if (compare === 0) {
324 | item.lhs.length = item.lhs.del;
325 | item.rhs.length = item.rhs.add;
326 | } else {
327 | // words and lines
328 | item.lhs.length = 0;
329 | if (item.lhs.del) {
330 | // get the index of the second-last item being deleted,
331 | // plus its length, minus the start pos.
332 | const i = item.lhs.at + item.lhs.del - 1;
333 | const part = lhsCtx._parts[i];
334 | item.lhs.length = part.pos + part.text.length
335 | - lhsCtx._parts[item.lhs.at].pos;
336 | }
337 |
338 | item.rhs.length = 0;
339 | if (item.rhs.add) {
340 | // get the index of the second-last item being added,
341 | // plus its length, minus the start pos.
342 | const i = item.rhs.at + item.rhs.add - 1;
343 | const part = rhsCtx._parts[i];
344 | item.rhs.length = part.pos + part.text.length
345 | - rhsCtx._parts[item.rhs.at].pos;
346 | }
347 | }
348 | changes.push(item);
349 | });
350 |
351 | lhsCtx.finish();
352 | rhsCtx.finish();
353 |
354 | return changes;
355 | }
356 | }
357 |
358 | module.exports = Myers;
359 |
--------------------------------------------------------------------------------
/src/splitter.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Text splitter that also returns character position. Functionally
3 | * equivalent to string.split, but faster.
4 | * @param {string} text - The text to split.
5 | * @param {string} ch - The character on which to split.
6 | * @returns A splitter that can be used to iteratively call `next()` for
7 | * each part.
8 | */
9 | function Splitter(text, ch) {
10 | let start = 0;
11 | let pos = ch ? text.indexOf(ch) : 0;
12 | return {
13 | /**
14 | * Returns the next split.
15 | * @returns The text an character index of the split `{ text, pos }`,
16 | * or `null` when done.
17 | */
18 | next: function _split() {
19 | if (text.length === 0) {
20 | return null;
21 | } else if (!ch) {
22 | if (start >= text.length) {
23 | return null;
24 | }
25 | let ptext;
26 | if (Array.isArray(text)) {
27 | ptext = text[start];
28 | } else {
29 | ptext = text.charAt(start);
30 | }
31 | const part = {
32 | text: ptext,
33 | pos: start
34 | };
35 | start += 1;
36 | return part;
37 | } else if (pos < 0) {
38 | // handle remaining text. the `start` might be at some
39 | // position less than `text.length`. it may also be _exactly_
40 | // `text.length` if the `text` ends with a double `ch`, e.g.
41 | // "\n\n", the `start` is set to `pos + 1` below, which is one
42 | // after the first "\n" of the pair. it would also be split.
43 | if (start <= text.length) {
44 | let ptext;
45 | if (Array.isArray(text)) {
46 | ptext = text.slice(start)
47 | } else {
48 | ptext = text.substr(start)
49 | }
50 |
51 | const part = {
52 | text: ptext,
53 | pos: start
54 | };
55 | pos = -1;
56 | start = text.length + 1;
57 | return part;
58 | } else {
59 | return null;
60 | }
61 | }
62 | const end = pos - start;
63 | const word = text.substr(start, end);
64 | const part = {
65 | text: word,
66 | pos: start
67 | };
68 | start = pos + 1;
69 | pos = text.indexOf(ch, start);
70 | return part;
71 | }
72 | }
73 | }
74 |
75 | module.exports = Splitter;
76 |
--------------------------------------------------------------------------------
/test/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | "mocha",
4 | "chai-expect"
5 | ],
6 | "extends": ["eslint:recommended", "plugin:mocha/recommended"],
7 | "env": {
8 | "node": true,
9 | "amd": true,
10 | "mocha": true
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/test/chars.test.js:
--------------------------------------------------------------------------------
1 | const { expect } = require('chai');
2 | const { diff, changed } = require('../src/');
3 |
4 | describe('compare chars', function() {
5 | it('should compare chars at end of string', function() {
6 | const changes = diff(
7 | 'the quick red fox jumped',
8 | 'the quick red fox swam',
9 | { compare: 'chars' }
10 | );
11 |
12 | expect(changes.length).to.equal(2);
13 | const [ first, second ] = changes;
14 |
15 | // delete: 'ju'
16 | expect(changed(first.lhs)).to.be.true;
17 | expect(first.lhs).to.deep.include({
18 | at: 18, // part
19 | del: 2, // parts deleted
20 | pos: 18, // index
21 | text: 'j',
22 | length: 2 // chars
23 | });
24 | expect(first.lhs.getPart(first.lhs.at))
25 | .to.deep.equal({ text: 'j', pos: 18 });
26 |
27 | // add: 'swa'
28 | expect(changed(first.rhs)).to.be.true;
29 | expect(first.rhs).to.deep.include({
30 | at: 18, // part
31 | add: 3, // parts added
32 | pos: 18, // index
33 | text: 's',
34 | length: 3 // chars
35 | });
36 | expect(first.rhs.getPart(first.rhs.at))
37 | .to.deep.equal({ text: 's', pos: 18 });
38 |
39 | // delete: 'ped'
40 | expect(changed(second.lhs)).to.be.true;
41 | expect(second.lhs).to.deep.include({
42 | at: 21, // part
43 | del: 3, // parts deleted
44 | pos: 21, // index
45 | text: 'p',
46 | length: 3 // chars
47 | });
48 | expect(second.lhs.getPart(second.lhs.at))
49 | .to.deep.equal({ text: 'p', pos: 21 });
50 |
51 | // no change to rhs
52 | expect(changed(second.rhs)).to.be.false;
53 | });
54 |
55 | it('should compare chars at start of string', function() {
56 | const changes = diff(
57 | 'the quick red fox jumped',
58 | 'The quick red fox jumped',
59 | {compare: 'chars'}
60 | );
61 |
62 | expect(changes.length).to.equal(1);
63 | const change = changes[0];
64 | expect(changed(change.lhs)).to.be.true;
65 | expect(change.lhs).to.deep.include({
66 | at: 0, // part
67 | del: 1, // parts deleted
68 | pos: 0, // index
69 | text: 't',
70 | length: 1 // chars
71 | });
72 | expect(changed(change.rhs)).to.be.true;
73 | expect(change.rhs).to.deep.include({
74 | at: 0, // part
75 | add: 1, // parts added
76 | pos: 0, // index
77 | text: 'T',
78 | length: 1 // chars
79 | });
80 | });
81 |
82 | it('should compare change chars at end of string', function() {
83 | const changes = diff(
84 | 'the quick red fox jumped',
85 | 'the quick red fox Jumped',
86 | {compare: 'chars'}
87 | );
88 | expect(changes.length).to.equal(1);
89 | const change = changes[0];
90 | expect(changed(change.lhs)).to.be.true;
91 | expect(change.lhs).to.deep.include({
92 | at: 18, // part
93 | del: 1, // parts deleted
94 | pos: 18, // index
95 | text: 'j',
96 | length: 1 // chars
97 | });
98 | expect(changed(change.rhs)).to.be.true;
99 | expect(change.rhs).to.deep.include({
100 | at: 18, // part
101 | add: 1, // parts added
102 | pos: 18, // index
103 | text: 'J',
104 | length: 1 // chars
105 | });
106 | });
107 |
108 | it('should compare change chars in mid string', function() {
109 | const changes = diff(
110 | 'the quick red fox jumped',
111 | 'the quick RED fox jumped',
112 | {compare: 'chars'}
113 | );
114 |
115 | expect(changes.length).to.equal(1);
116 | const change = changes[0];
117 | expect(changed(change.lhs)).to.be.true;
118 | expect(change.lhs).to.deep.include({
119 | at: 10, // part
120 | del: 3, // parts deleted
121 | pos: 10, // index
122 | text: 'r',
123 | length: 3 // chars
124 | });
125 | expect(changed(change.rhs)).to.be.true;
126 | expect(change.rhs).to.deep.include({
127 | at: 10, // part
128 | add: 3, // parts added
129 | pos: 10, // index
130 | text: 'R',
131 | length: 3 // chars
132 | });
133 | });
134 |
135 | it('should compare add chars at start of string', function() {
136 | const changes = diff(
137 | 'the quick red fox jumped',
138 | '*the quick red fox jumped',
139 | {compare: 'chars'}
140 | );
141 |
142 | expect(changes.length).to.equal(1);
143 | const change = changes[0];
144 | expect(changed(change.lhs)).to.be.false;
145 | expect(change.lhs).to.deep.include({
146 | at: 0, // part
147 | del: 0, // parts deleted
148 | pos: 0, // index
149 | text: 't',
150 | length: 0 // chars
151 | });
152 | expect(changed(change.rhs)).to.be.true;
153 | expect(change.rhs).to.deep.include({
154 | at: 0, // part
155 | add: 1, // parts added
156 | pos: 0, // index
157 | text: '*',
158 | length: 1 // chars
159 | });
160 | });
161 |
162 | it('should compare add chars at end of string', function() {
163 | const changes = diff(
164 | 'the quick red fox jumped',
165 | 'the quick red fox jumped*',
166 | {compare: 'chars'}
167 | );
168 |
169 | expect(changes.length).to.equal(1);
170 | const change = changes[0];
171 | expect(changed(change.lhs)).to.be.false;
172 | expect(change.lhs).to.deep.include({
173 | at: 23, // part
174 | del: 0, // parts deleted
175 | pos: 23, // index
176 | text: 'd',
177 | length: 0 // chars
178 | });
179 | expect(changed(change.rhs)).to.be.true;
180 | expect(change.rhs).to.deep.include({
181 | at: 24, // part
182 | add: 1, // parts added
183 | pos: 24, // index
184 | text: '*',
185 | length: 1 // chars
186 | });
187 | });
188 |
189 | it('should compare del chars at start of string', function() {
190 | const changes = diff(
191 | '*the quick red fox jumped',
192 | 'the quick red fox jumped',
193 | {compare: 'chars'}
194 | );
195 |
196 | expect(changes.length).to.equal(1);
197 | const change = changes[0];
198 | expect(changed(change.lhs)).to.be.true;
199 | expect(change.lhs).to.deep.include({
200 | at: 0, // part
201 | del: 1, // parts deleted
202 | pos: 0, // index
203 | text: '*',
204 | length: 1 // chars
205 | });
206 | expect(changed(change.rhs)).to.be.false;
207 | expect(change.rhs).to.deep.include({
208 | at: 0, // part
209 | add: 0, // parts added
210 | pos: 0, // index
211 | text: 't',
212 | length: 0 // chars
213 | });
214 | });
215 |
216 | it('should compare del chars at end of string', function() {
217 | const changes = diff(
218 | 'the quick red fox jumped*',
219 | 'the quick red fox jumped',
220 | {compare: 'chars'}
221 | );
222 |
223 | expect(changes.length).to.equal(1);
224 | const change = changes[0];
225 | expect(changed(change.lhs)).to.be.true;
226 | expect(change.lhs).to.deep.include({
227 | at: 24, // part
228 | del: 1, // parts deleted
229 | pos: 24, // index
230 | text: '*',
231 | length: 1 // chars
232 | });
233 | expect(changed(change.rhs)).to.be.false;
234 | expect(change.rhs).to.deep.include({
235 | at: 23, // part
236 | add: 0, // parts added
237 | pos: 23, // index
238 | text: 'd',
239 | length: 0 // chars
240 | });
241 | });
242 |
243 | it('compare chars in middle of sentence', function() {
244 | const changes = diff(
245 | 'the quick red scared fox jumped',
246 | 'the quick orange fox jumped',
247 | {compare: 'chars'}
248 | );
249 |
250 | expect(changes.length).to.equal(4);
251 |
252 | const [ first, second, third, fourth ] = changes;
253 |
254 | // deleted: nothing
255 | expect(changed(first.lhs)).to.be.false;
256 | expect(first.lhs).to.deep.include({
257 | at: 10, // part
258 | del: 0, // parts deleted
259 | pos: 10, // index
260 | text: 'r',
261 | length: 0 // chars
262 | });
263 | // added: 'o'
264 | expect(changed(first.rhs)).to.be.true;
265 | expect(first.rhs).to.deep.include({
266 | at: 10, // part
267 | add: 1, // parts added
268 | pos: 10, // index
269 | text: 'o',
270 | length: 1 // chars
271 | });
272 |
273 | // deleted: 'ed sc'
274 | expect(changed(second.lhs)).to.be.true;
275 | expect(second.lhs).to.deep.include({
276 | at: 11, // part
277 | del: 5, // parts deleted
278 | pos: 11, // index
279 | text: 'e',
280 | length: 5 // chars
281 | });
282 | // added: nothing
283 | expect(changed(second.rhs)).to.be.false;
284 | expect(second.rhs).to.deep.include({
285 | at: 12, // part
286 | add: 0, // parts added
287 | pos: 12, // index
288 | text: 'a',
289 | length: 0 // chars
290 | });
291 |
292 | // deleted: 'r'
293 | expect(changed(third.lhs)).to.be.true;
294 | expect(third.lhs).to.deep.include({
295 | at: 17, // part
296 | del: 1, // parts deleted
297 | pos: 17, // index
298 | text: 'r',
299 | length: 1 // chars
300 | });
301 | // added: 'ng'
302 | expect(changed(third.rhs)).to.be.true;
303 | expect(third.rhs).to.deep.include({
304 | at: 13, // part
305 | add: 2, // parts added
306 | pos: 13, // index
307 | text: 'n',
308 | length: 2 // chars
309 | });
310 |
311 | // deleted: 'r'
312 | expect(changed(fourth.lhs)).to.be.true;
313 | expect(fourth.lhs).to.deep.include({
314 | at: 19, // part
315 | del: 1, // parts deleted
316 | pos: 19, // index
317 | text: 'd',
318 | length: 1 // chars
319 | });
320 | // added: nothing
321 | expect(changed(fourth.rhs)).to.be.false;
322 | expect(fourth.rhs).to.deep.include({
323 | at: 16, // part
324 | add: 0, // parts added
325 | pos: 16, // index
326 | text: ' ',
327 | length: 0 // chars
328 | });
329 | });
330 |
331 | it('should compare an added line', function() {
332 | const changes = diff(
333 | '',
334 | 'the quick red fox jumped',
335 | {compare: 'chars'}
336 | );
337 |
338 | expect(changes.length).to.equal(1);
339 | const change = changes[0];
340 | expect(changed(change.lhs)).to.be.false;
341 | expect(change.lhs).to.deep.include({
342 | at: 0, // part
343 | del: 0, // parts deleted
344 | pos: null, // index
345 | text: null,
346 | length: 0 // chars
347 | });
348 | expect(changed(change.rhs)).to.be.true;
349 | expect(change.rhs).to.deep.include({
350 | at: 0, // part
351 | add: 24, // parts added
352 | pos: 0, // index
353 | text: 't',
354 | length: 24 // chars
355 | });
356 | });
357 |
358 | it('should compare a deleted line', function() {
359 | const changes = diff(
360 | 'the quick red fox jumped',
361 | '',
362 | {compare: 'chars'}
363 | );
364 |
365 | expect(changes.length).to.equal(1);
366 | const change = changes[0];
367 | expect(changed(change.lhs)).to.be.true;
368 | expect(change.lhs).to.deep.include({
369 | at: 0, // part
370 | del: 24, // parts deleted
371 | pos: 0, // index
372 | text: 't',
373 | length: 24 // chars
374 | });
375 | expect(changed(change.rhs)).to.be.false;
376 | expect(change.rhs).to.deep.include({
377 | at: 0, // part
378 | add: 0, // parts added
379 | pos: null, // index
380 | text: null,
381 | length: 0 // chars
382 | });
383 | });
384 |
385 | it('should compare arrays', function() {
386 | const changes = diff(
387 | [ 1, 2, 3, 7 ],
388 | [ 1, 2, 3, 4, 5, 6, 7 ],
389 | {compare: 'chars'}
390 | );
391 |
392 | expect(changes.length).to.equal(1);
393 | const [ first ] = changes;
394 |
395 | expect(first.lhs).to.deep.include({
396 | at: 3, // part
397 | del: 0, // parts deleted
398 | pos: 3, // index
399 | text: 7,
400 | length: 0 // chars
401 | });
402 |
403 | expect(first.rhs).to.deep.include({
404 | at: 3,
405 | add: 3,
406 | pos: 3,
407 | text: 4,
408 | length: 3
409 | })
410 | });
411 | });
412 |
--------------------------------------------------------------------------------
/test/myers.test.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const { expect } = require('chai');
3 | const { diff, formats, changed } = require('../src/');
4 |
5 | describe('#diff', function() {
6 | it('should throw illegal argument "lhs"', function() {
7 | expect(diff).to.throw(Error, /illegal argument 'lhs'/);
8 | });
9 |
10 | it('should throw illegal argument "rhs"', function() {
11 | expect(diff.bind(diff, 'lhs')).to.throw(Error, /illegal argument 'rhs'/);
12 | });
13 |
14 | it('should compare one line, no changes', function() {
15 | const changes = diff(
16 | 'the quick red fox jumped',
17 | 'the quick red fox jumped'
18 | );
19 | expect(changes.length).to.equal(0);
20 | });
21 |
22 | it('should compare two lines, no changes', function() {
23 | const changes = diff(
24 | 'the quick red fox jumped\nover the lazy dog',
25 | 'the quick red fox jumped\nover the lazy dog'
26 | );
27 | expect(changes.length).to.equal(0);
28 | });
29 |
30 | it('should compare one line changed', function() {
31 | const changes = diff(
32 | 'the quick red fox jumped',
33 | 'the quick brown fox jumped'
34 | );
35 |
36 | expect(changes).to.have.length(1);
37 | const [ first ] = changes;
38 | expect(changed(first.lhs)).to.be.true;
39 | expect(first.lhs).to.deep.include({
40 | at: 0, // part
41 | del: 1, // parts deleted
42 | pos: 0, // index
43 | text: 'the quick red fox jumped',
44 | length: 24 // chars
45 | });
46 | expect(changed(first.rhs)).to.be.true;
47 | expect(first.rhs).to.deep.include({
48 | at: 0, // part
49 | add: 1, // parts added
50 | pos: 0, // index
51 | text: 'the quick brown fox jumped',
52 | length: 26 // chars
53 | });
54 | expect(formats.GnuNormalFormat(changes)).to.equal(
55 | [
56 | '1c1',
57 | '< the quick red fox jumped',
58 | '---',
59 | '> the quick brown fox jumped'
60 | ].join('\n')
61 | );
62 | });
63 |
64 | it('should compare one line added', function() {
65 | const changes = diff(
66 | 'the quick red fox jumped',
67 | 'the quick red fox jumped\nover the lazy dog'
68 | );
69 |
70 | expect(changes).to.have.length(1);
71 | const [ first ] = changes;
72 | expect(changed(first.lhs)).to.be.false;
73 | expect(first.lhs).to.deep.include({
74 | at: 0, // part
75 | del: 0, // parts deleted
76 | pos: 0, // index
77 | text: 'the quick red fox jumped',
78 | length: 0 // chars
79 | });
80 | expect(changed(first.rhs)).to.be.true;
81 | expect(first.rhs).to.deep.include({
82 | at: 1, // part
83 | add: 1, // parts added
84 | pos: 25, // index
85 | text: 'over the lazy dog',
86 | length: 17 // chars
87 | });
88 | expect(formats.GnuNormalFormat(changes)).to.equal(
89 | [
90 | '1a2',
91 | '> over the lazy dog'
92 | ].join('\n')
93 | );
94 | });
95 |
96 | it('should compare one line removed', function() {
97 | const changes = diff(
98 | 'the quick red fox jumped\nover the hairy dog',
99 | 'the quick red fox jumped'
100 | );
101 |
102 | expect(changes).to.have.length(1);
103 | const [ first ] = changes;
104 | expect(changed(first.lhs)).to.be.true;
105 | expect(first.lhs).to.deep.include({
106 | at: 1, // part
107 | del: 1, // parts deleted
108 | pos: 25, // index
109 | text: 'over the hairy dog',
110 | length: 18 // chars
111 | });
112 | expect(changed(first.rhs)).to.be.false;
113 | expect(first.rhs).to.deep.include({
114 | at: 0, // part
115 | add: 0, // parts added
116 | pos: 0, // index
117 | text: 'the quick red fox jumped',
118 | length: 0 // chars
119 | });
120 |
121 | expect(formats.GnuNormalFormat(changes)).to.equal(
122 | [
123 | '2d1',
124 | '< over the hairy dog'
125 | ].join('\n')
126 | );
127 | });
128 |
129 | it('should compare over multiple lines', function() {
130 | const changes = diff(
131 | 'the quick\n\nbrown fox\n\n\nover the hairy\n\ndog',
132 | 'the quick\n\nred fox\n\njumped\n\nover the lazy dog\n\n'
133 | );
134 |
135 | expect(changes.length).to.equal(4);
136 | const [ first, second, third, fourth ] = changes;
137 |
138 | expect(changed(first.lhs)).to.be.true;
139 | expect(first.lhs).to.deep.include({
140 | at: 2, // part
141 | del: 1, // parts deleted
142 | pos: 11, // index
143 | text: 'brown fox',
144 | length: 9 // chars
145 | });
146 | expect(changed(first.rhs)).to.be.true;
147 | expect(first.rhs).to.deep.include({
148 | at: 2, // part
149 | add: 1, // parts added
150 | pos: 11, // index
151 | text: 'red fox',
152 | length: 7 // chars
153 | });
154 |
155 | expect(changed(second.lhs)).to.be.false;
156 | expect(second.lhs).to.deep.include({
157 | at: 4, // part
158 | del: 0, // parts deleted
159 | pos: 22, // index
160 | text: '',
161 | length: 0 // chars
162 | });
163 | expect(changed(second.rhs)).to.be.true;
164 | expect(second.rhs).to.deep.include({
165 | at: 4, // part
166 | add: 1, // parts added
167 | pos: 20, // index
168 | text: 'jumped',
169 | length: 6 // chars
170 | });
171 |
172 | expect(changed(third.lhs)).to.be.true;
173 | expect(third.lhs).to.deep.include({
174 | at: 5, // part
175 | del: 1, // parts deleted
176 | pos: 23, // index
177 | text: 'over the hairy',
178 | length: 14 // chars
179 | });
180 | expect(changed(third.rhs)).to.be.true;
181 | expect(third.rhs).to.deep.include({
182 | at: 6, // part
183 | add: 2, // parts added
184 | pos: 28, // index
185 | text: 'over the lazy dog',
186 | length: 18 // chars
187 | });
188 |
189 | expect(changed(fourth.lhs)).to.be.true;
190 | expect(fourth.lhs).to.deep.include({
191 | at: 7, // part
192 | del: 1, // parts deleted
193 | pos: 39, // index
194 | text: 'dog',
195 | length: 3 // chars
196 | });
197 | expect(changed(fourth.rhs)).to.be.false;
198 | expect(fourth.rhs).to.deep.include({
199 | at: 8, // part
200 | add: 0, // parts added
201 | pos: 47, // index
202 | text: '',
203 | length: 0 // chars
204 | });
205 |
206 | // this is actually different from GNU diff and I think the
207 | // reason is shift_boundaries.
208 | expect(formats.GnuNormalFormat(changes)).to.equal(
209 | [
210 | '3c3',
211 | '< brown fox',
212 | '---',
213 | '> red fox',
214 | '5a5',
215 | '> jumped',
216 | '6c7,8',
217 | '< over the hairy',
218 | '---',
219 | '> over the lazy dog',
220 | '> ',
221 | '8d9',
222 | '< dog'
223 | ].join('\n')
224 | );
225 | });
226 |
227 | it('should compare both lines with only changes', function() {
228 | const changes = diff(
229 | 'the quick red fox jumped\nover the hairy dog',
230 | 'the quick brown fox jumped\nover the lazy dog'
231 | );
232 |
233 | expect(changes).to.have.length(1);
234 | const [ first ] = changes;
235 | expect(changed(first.lhs)).to.be.true;
236 | expect(first.lhs).to.deep.include({
237 | at: 0, // part
238 | del: 2, // parts deleted
239 | pos: 0, // index
240 | text: 'the quick red fox jumped',
241 | length: 43 // chars
242 | });
243 | expect(changed(first.rhs)).to.be.true;
244 | expect(first.rhs).to.deep.include({
245 | at: 0, // part
246 | add: 2, // parts added
247 | pos: 0, // index
248 | text: 'the quick brown fox jumped',
249 | length: 44 // chars
250 | });
251 | });
252 |
253 | it('should compare an added line', function() {
254 | const changes = diff(
255 | '',
256 | 'the\nquick\nred\nfox\njumped\nover\nthe\nlazy\ndog'
257 | );
258 |
259 | expect(changes).to.have.length(1);
260 | const [ first ] = changes;
261 | expect(changed(first.lhs)).to.be.false;
262 | expect(first.lhs).to.deep.include({
263 | at: 0, // part
264 | del: 0, // parts deleted
265 | pos: null, // index
266 | text: null,
267 | length: 0 // chars
268 | });
269 | expect(changed(first.rhs)).to.be.true;
270 | expect(first.rhs).to.deep.include({
271 | at: 0, // part
272 | add: 9, // parts added
273 | pos: 0, // index
274 | text: 'the',
275 | length: 42 // chars
276 | });
277 | });
278 |
279 | it('should compare many lines that repeat', function() {
280 | const changes = diff(
281 | fs.readFileSync('./test/resources/moons_lhs.txt', 'utf-8'),
282 | fs.readFileSync('./test/resources/moons_rhs.txt', 'utf-8')
283 | );
284 | expect(formats.GnuNormalFormat(changes)).to.equal(
285 | fs.readFileSync('./test/resources/moons.diff', 'utf-8')
286 | );
287 | });
288 |
289 | it('should show a blank line on rhs as being deleted', function() {
290 | const changes = diff(
291 | 'next',
292 | ''
293 | );
294 | expect(formats.GnuNormalFormat(changes)).to.equal('1d1\n< next');
295 | });
296 |
297 | it('should show a blank line on lhs as being added', function() {
298 | const changes = diff(
299 | '',
300 | 'next'
301 | );
302 | expect(formats.GnuNormalFormat(changes)).to.equal('1a1\n> next');
303 | });
304 |
305 | it('should show lhs and rhs blank lines as the same', function() {
306 | const changes = diff(
307 | '',
308 | ''
309 | );
310 | expect(changes).to.have.length(0);
311 | });
312 | });
313 |
--------------------------------------------------------------------------------
/test/options.test.js:
--------------------------------------------------------------------------------
1 | const { expect } = require('chai');
2 | const { diff } = require('../src/');
3 |
4 | describe('options', function() {
5 | it('should ignore whitespace', function() {
6 | const changes = diff(
7 | 'the quick red fox jumped',
8 | 'the quick red fox jumped',
9 | {
10 | ignoreWhitespace: true
11 | }
12 | );
13 | expect(changes.length).to.equal(0);
14 | });
15 |
16 | it('should ignore case', function() {
17 | const changes = diff(
18 | 'the quick red fox jumped',
19 | 'the quick red FOX jumped',
20 | {
21 | ignoreCase: true
22 | }
23 | );
24 | expect(changes.length).to.equal(0);
25 | });
26 |
27 | it('should ignore accents', function() {
28 | const changes = diff(
29 | 'the quick red fox jumped',
30 | 'the quick réd fóx jumped',
31 | {
32 | ignoreAccents: true
33 | }
34 | );
35 | expect(changes.length).to.equal(0);
36 | });
37 |
38 | it('should ignore whitespace, case, and accents', function() {
39 | const changes = diff(
40 | 'the quick red fox jumped',
41 | 'the quick réd fóx JUMPED',
42 | {
43 | ignoreWhitespace: true,
44 | ignoreCase: true,
45 | ignoreAccents: true
46 | }
47 | );
48 | expect(changes.length).to.equal(0);
49 | });
50 | });
51 |
--------------------------------------------------------------------------------
/test/resources/moons.diff:
--------------------------------------------------------------------------------
1 | 2323c2323
2 | < S/2004 N 1
3 | ---
4 | > S/2004 N 1 S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1
5 | 2340c2340
6 | < Sinope
7 | ---
8 | > Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope
9 | 2344c2344
10 | < Stephano
11 | ---
12 | > Stephano Stephano Stephano Stephano Stephano Stephano Stephano
13 | 2364c2364
14 | < Umbriel
15 | ---
16 | > Umbrella
--------------------------------------------------------------------------------
/test/resources/moons_lhs.txt:
--------------------------------------------------------------------------------
1 | 2005
2 | Adrastea
3 | Aegaeon
4 | Aegir
5 | Aitne
6 | Albiorix
7 | Amalthea
8 | Ananke
9 | Anthe
10 | Aoede
11 | Arche
12 | Ariel
13 | Atlas
14 | Autonoe
15 | Bebhionn
16 | Belinda
17 | Bergelmir
18 | Bestla
19 | Bianca
20 | Caliban
21 | Callirrhoe
22 | Callisto
23 | Calypso
24 | Carme
25 | Carpo
26 | Chaldene
27 | Cordelia
28 | Cressida
29 | Cupid
30 | Cyllene
31 | Daphnis
32 | Deimos
33 | Desdemona
34 | Despina
35 | Dia
36 | Dione
37 | Dysnomia
38 | Elara
39 | Enceladus
40 | Erinome
41 | Erriapus
42 | Euanthe
43 | Eukelade
44 | Euporie
45 | Europa
46 | Eurydome
47 | Farbauti
48 | Fenrir
49 | Ferdinand
50 | Fornjot
51 | Francisco
52 | Galatea
53 | Ganymede
54 | Greip
55 | Halimede
56 | Harpalyke
57 | Hati
58 | Hegemone
59 | Helene
60 | Helike
61 | Hermippe
62 | Herse
63 | Hi?iaka
64 | Himalia
65 | Hyperion
66 | Hyrrokkin
67 | I
68 | Iapetus
69 | II
70 | III
71 | Ijiraq
72 | Io
73 | Iocaste
74 | Isonoe
75 | Janus
76 | Jarnsaxa
77 | Juliet
78 | Kale
79 | Kallichore
80 | Kalyke
81 | Kari
82 | Kerberos
83 | Kiviuq
84 | Kore
85 | Laomedeia
86 | Larissa
87 | Leda
88 | Loge
89 | Lysithea
90 | Mab
91 | Margaret
92 | Megaclite
93 | Methone
94 | Metis
95 | Mimas
96 | Miranda
97 | Mneme
98 | Moon
99 | Mundilfari
100 | Naiad
101 | Namaka
102 | Narvi
103 | Nereid
104 | Neso
105 | Oberon
106 | Ophelia
107 | Orthosie
108 | Paaliaq
109 | Pallene
110 | Pan
111 | Pandora
112 | Pasiphae
113 | Pasithee
114 | Perdita
115 | Phobos
116 | Phoebe
117 | Polydeuces
118 | Portia
119 | Praxidike
120 | Prometheus
121 | Prospero
122 | Proteus
123 | Psamathe
124 | Puck
125 | Rhea
126 | Rosalind
127 | S/2003 J 10
128 | S/2003 J 12
129 | S/2003 J 15
130 | S/2003 J 16
131 | S/2003 J 18
132 | S/2003 J 19
133 | S/2003 J 2
134 | S/2003 J 23
135 | S/2003 J 3
136 | S/2003 J 4
137 | S/2003 J 5
138 | S/2003 J 9
139 | S/2004 N 1
140 | S/2004 S 12
141 | S/2004 S 13
142 | S/2004 S 17
143 | S/2004 S 7
144 | S/2006 S 1
145 | S/2006 S 3
146 | S/2007 S 2
147 | S/2007 S 3
148 | S/2009 S 1
149 | S/2010 J 1
150 | S/2010 J 2
151 | S/2011 J 1
152 | S/2011 J 2
153 | Sao
154 | Setebos
155 | Siarnaq
156 | Sinope
157 | Skathi
158 | Skoll
159 | Sponde
160 | Stephano
161 | Styx
162 | Surtur
163 | Suttungr
164 | Sycorax
165 | Tarqeq
166 | Tarvos
167 | Taygete
168 | Telesto
169 | Tethys
170 | Thalassa
171 | Thebe
172 | Thelxinoe
173 | Themisto
174 | Thrymr
175 | Thyone
176 | Titan
177 | Titania
178 | Trinculo
179 | Triton
180 | Umbrella
181 | XI
182 | Ymir
183 | 2005
184 | Adrastea
185 | Aegaeon
186 | Aegir
187 | Aitne
188 | Albiorix
189 | Amalthea
190 | Ananke
191 | Anthe
192 | Aoede
193 | Arche
194 | Ariel
195 | Atlas
196 | Autonoe
197 | Bebhionn
198 | Belinda
199 | Bergelmir
200 | Bestla
201 | Bianca
202 | Caliban
203 | Callirrhoe
204 | Callisto
205 | Calypso
206 | Carme
207 | Carpo
208 | Chaldene
209 | Cordelia
210 | Cressida
211 | Cupid
212 | Cyllene
213 | Daphnis
214 | Deimos
215 | Desdemona
216 | Despina
217 | Dia
218 | Dione
219 | Dysnomia
220 | Elara
221 | Enceladus
222 | Erinome
223 | Erriapus
224 | Euanthe
225 | Eukelade
226 | Euporie
227 | Europa
228 | Eurydome
229 | Farbauti
230 | Fenrir
231 | Ferdinand
232 | Fornjot
233 | Francisco
234 | Galatea
235 | Ganymede
236 | Greip
237 | Halimede
238 | Harpalyke
239 | Hati
240 | Hegemone
241 | Helene
242 | Helike
243 | Hermippe
244 | Herse
245 | Hi?iaka
246 | Himalia
247 | Hyperion
248 | Hyrrokkin
249 | I
250 | Iapetus
251 | II
252 | III
253 | Ijiraq
254 | Io
255 | Iocaste
256 | Isonoe
257 | Janus
258 | Jarnsaxa
259 | Juliet
260 | Kale
261 | Kallichore
262 | Kalyke
263 | Kari
264 | Kerberos
265 | Kiviuq
266 | Kore
267 | Laomedeia
268 | Larissa
269 | Leda
270 | Loge
271 | Lysithea
272 | Mab
273 | Margaret
274 | Megaclite
275 | Methone
276 | Metis
277 | Mimas
278 | Miranda
279 | Mneme
280 | Moon
281 | Mundilfari
282 | Naiad
283 | Namaka
284 | Narvi
285 | Nereid
286 | Neso
287 | Oberon
288 | Ophelia
289 | Orthosie
290 | Paaliaq
291 | Pallene
292 | Pan
293 | Pandora
294 | Pasiphae
295 | Pasithee
296 | Perdita
297 | Phobos
298 | Phoebe
299 | Polydeuces
300 | Portia
301 | Praxidike
302 | Prometheus
303 | Prospero
304 | Proteus
305 | Psamathe
306 | Puck
307 | Rhea
308 | Rosalind
309 | S/2003 J 10
310 | S/2003 J 12
311 | S/2003 J 15
312 | S/2003 J 16
313 | S/2003 J 18
314 | S/2003 J 19
315 | S/2003 J 2
316 | S/2003 J 23
317 | S/2003 J 3
318 | S/2003 J 4
319 | S/2003 J 5
320 | S/2003 J 9
321 | S/2004 N 1
322 | S/2004 S 12
323 | S/2004 S 13
324 | S/2004 S 17
325 | S/2004 S 7
326 | S/2006 S 1
327 | S/2006 S 3
328 | S/2007 S 2
329 | S/2007 S 3
330 | S/2009 S 1
331 | S/2010 J 1
332 | S/2010 J 2
333 | S/2011 J 1
334 | S/2011 J 2
335 | Sao
336 | Setebos
337 | Siarnaq
338 | Sinope
339 | Skathi
340 | Skoll
341 | Sponde
342 | Stephano
343 | Styx
344 | Surtur
345 | Suttungr
346 | Sycorax
347 | Tarqeq
348 | Tarvos
349 | Taygete
350 | Telesto
351 | Tethys
352 | Thalassa
353 | Thebe
354 | Thelxinoe
355 | Themisto
356 | Thrymr
357 | Thyone
358 | Titan
359 | Titania
360 | Trinculo
361 | Triton
362 | Umbrella
363 | XI
364 | Ymir
365 | 2005
366 | Adrastea
367 | Aegaeon
368 | Aegir
369 | Aitne
370 | Albiorix
371 | Amalthea
372 | Ananke
373 | Anthe
374 | Aoede
375 | Arche
376 | Ariel
377 | Atlas
378 | Autonoe
379 | Bebhionn
380 | Belinda
381 | Bergelmir
382 | Bestla
383 | Bianca
384 | Caliban
385 | Callirrhoe
386 | Callisto
387 | Calypso
388 | Carme
389 | Carpo
390 | Chaldene
391 | Cordelia
392 | Cressida
393 | Cupid
394 | Cyllene
395 | Daphnis
396 | Deimos
397 | Desdemona
398 | Despina
399 | Dia
400 | Dione
401 | Dysnomia
402 | Elara
403 | Enceladus
404 | Erinome
405 | Erriapus
406 | Euanthe
407 | Eukelade
408 | Euporie
409 | Europa
410 | Eurydome
411 | Farbauti
412 | Fenrir
413 | Ferdinand
414 | Fornjot
415 | Francisco
416 | Galatea
417 | Ganymede
418 | Greip
419 | Halimede
420 | Harpalyke
421 | Hati
422 | Hegemone
423 | Helene
424 | Helike
425 | Hermippe
426 | Herse
427 | Hi?iaka
428 | Himalia
429 | Hyperion
430 | Hyrrokkin
431 | I
432 | Iapetus
433 | II
434 | III
435 | Ijiraq
436 | Io
437 | Iocaste
438 | Isonoe
439 | Janus
440 | Jarnsaxa
441 | Juliet
442 | Kale
443 | Kallichore
444 | Kalyke
445 | Kari
446 | Kerberos
447 | Kiviuq
448 | Kore
449 | Laomedeia
450 | Larissa
451 | Leda
452 | Loge
453 | Lysithea
454 | Mab
455 | Margaret
456 | Megaclite
457 | Methone
458 | Metis
459 | Mimas
460 | Miranda
461 | Mneme
462 | Moon
463 | Mundilfari
464 | Naiad
465 | Namaka
466 | Narvi
467 | Nereid
468 | Neso
469 | Oberon
470 | Ophelia
471 | Orthosie
472 | Paaliaq
473 | Pallene
474 | Pan
475 | Pandora
476 | Pasiphae
477 | Pasithee
478 | Perdita
479 | Phobos
480 | Phoebe
481 | Polydeuces
482 | Portia
483 | Praxidike
484 | Prometheus
485 | Prospero
486 | Proteus
487 | Psamathe
488 | Puck
489 | Rhea
490 | Rosalind
491 | S/2003 J 10
492 | S/2003 J 12
493 | S/2003 J 15
494 | S/2003 J 16
495 | S/2003 J 18
496 | S/2003 J 19
497 | S/2003 J 2
498 | S/2003 J 23
499 | S/2003 J 3
500 | S/2003 J 4
501 | S/2003 J 5
502 | S/2003 J 9
503 | S/2004 N 1
504 | S/2004 S 12
505 | S/2004 S 13
506 | S/2004 S 17
507 | S/2004 S 7
508 | S/2006 S 1
509 | S/2006 S 3
510 | S/2007 S 2
511 | S/2007 S 3
512 | S/2009 S 1
513 | S/2010 J 1
514 | S/2010 J 2
515 | S/2011 J 1
516 | S/2011 J 2
517 | Sao
518 | Setebos
519 | Siarnaq
520 | Sinope
521 | Skathi
522 | Skoll
523 | Sponde
524 | Stephano
525 | Styx
526 | Surtur
527 | Suttungr
528 | Sycorax
529 | Tarqeq
530 | Tarvos
531 | Taygete
532 | Telesto
533 | Tethys
534 | Thalassa
535 | Thebe
536 | Thelxinoe
537 | Themisto
538 | Thrymr
539 | Thyone
540 | Titan
541 | Titania
542 | Trinculo
543 | Triton
544 | Umbrella
545 | XI
546 | Ymir
547 | 2005
548 | Adrastea
549 | Aegaeon
550 | Aegir
551 | Aitne
552 | Albiorix
553 | Amalthea
554 | Ananke
555 | Anthe
556 | Aoede
557 | Arche
558 | Ariel
559 | Atlas
560 | Autonoe
561 | Bebhionn
562 | Belinda
563 | Bergelmir
564 | Bestla
565 | Bianca
566 | Caliban
567 | Callirrhoe
568 | Callisto
569 | Calypso
570 | Carme
571 | Carpo
572 | Chaldene
573 | Cordelia
574 | Cressida
575 | Cupid
576 | Cyllene
577 | Daphnis
578 | Deimos
579 | Desdemona
580 | Despina
581 | Dia
582 | Dione
583 | Dysnomia
584 | Elara
585 | Enceladus
586 | Erinome
587 | Erriapus
588 | Euanthe
589 | Eukelade
590 | Euporie
591 | Europa
592 | Eurydome
593 | Farbauti
594 | Fenrir
595 | Ferdinand
596 | Fornjot
597 | Francisco
598 | Galatea
599 | Ganymede
600 | Greip
601 | Halimede
602 | Harpalyke
603 | Hati
604 | Hegemone
605 | Helene
606 | Helike
607 | Hermippe
608 | Herse
609 | Hi?iaka
610 | Himalia
611 | Hyperion
612 | Hyrrokkin
613 | I
614 | Iapetus
615 | II
616 | III
617 | Ijiraq
618 | Io
619 | Iocaste
620 | Isonoe
621 | Janus
622 | Jarnsaxa
623 | Juliet
624 | Kale
625 | Kallichore
626 | Kalyke
627 | Kari
628 | Kerberos
629 | Kiviuq
630 | Kore
631 | Laomedeia
632 | Larissa
633 | Leda
634 | Loge
635 | Lysithea
636 | Mab
637 | Margaret
638 | Megaclite
639 | Methone
640 | Metis
641 | Mimas
642 | Miranda
643 | Mneme
644 | Moon
645 | Mundilfari
646 | Naiad
647 | Namaka
648 | Narvi
649 | Nereid
650 | Neso
651 | Oberon
652 | Ophelia
653 | Orthosie
654 | Paaliaq
655 | Pallene
656 | Pan
657 | Pandora
658 | Pasiphae
659 | Pasithee
660 | Perdita
661 | Phobos
662 | Phoebe
663 | Polydeuces
664 | Portia
665 | Praxidike
666 | Prometheus
667 | Prospero
668 | Proteus
669 | Psamathe
670 | Puck
671 | Rhea
672 | Rosalind
673 | S/2003 J 10
674 | S/2003 J 12
675 | S/2003 J 15
676 | S/2003 J 16
677 | S/2003 J 18
678 | S/2003 J 19
679 | S/2003 J 2
680 | S/2003 J 23
681 | S/2003 J 3
682 | S/2003 J 4
683 | S/2003 J 5
684 | S/2003 J 9
685 | S/2004 N 1
686 | S/2004 S 12
687 | S/2004 S 13
688 | S/2004 S 17
689 | S/2004 S 7
690 | S/2006 S 1
691 | S/2006 S 3
692 | S/2007 S 2
693 | S/2007 S 3
694 | S/2009 S 1
695 | S/2010 J 1
696 | S/2010 J 2
697 | S/2011 J 1
698 | S/2011 J 2
699 | Sao
700 | Setebos
701 | Siarnaq
702 | Sinope
703 | Skathi
704 | Skoll
705 | Sponde
706 | Stephano
707 | Styx
708 | Surtur
709 | Suttungr
710 | Sycorax
711 | Tarqeq
712 | Tarvos
713 | Taygete
714 | Telesto
715 | Tethys
716 | Thalassa
717 | Thebe
718 | Thelxinoe
719 | Themisto
720 | Thrymr
721 | Thyone
722 | Titan
723 | Titania
724 | Trinculo
725 | Triton
726 | Umbrella
727 | XI
728 | Ymir
729 | 2005
730 | Adrastea
731 | Aegaeon
732 | Aegir
733 | Aitne
734 | Albiorix
735 | Amalthea
736 | Ananke
737 | Anthe
738 | Aoede
739 | Arche
740 | Ariel
741 | Atlas
742 | Autonoe
743 | Bebhionn
744 | Belinda
745 | Bergelmir
746 | Bestla
747 | Bianca
748 | Caliban
749 | Callirrhoe
750 | Callisto
751 | Calypso
752 | Carme
753 | Carpo
754 | Chaldene
755 | Cordelia
756 | Cressida
757 | Cupid
758 | Cyllene
759 | Daphnis
760 | Deimos
761 | Desdemona
762 | Despina
763 | Dia
764 | Dione
765 | Dysnomia
766 | Elara
767 | Enceladus
768 | Erinome
769 | Erriapus
770 | Euanthe
771 | Eukelade
772 | Euporie
773 | Europa
774 | Eurydome
775 | Farbauti
776 | Fenrir
777 | Ferdinand
778 | Fornjot
779 | Francisco
780 | Galatea
781 | Ganymede
782 | Greip
783 | Halimede
784 | Harpalyke
785 | Hati
786 | Hegemone
787 | Helene
788 | Helike
789 | Hermippe
790 | Herse
791 | Hi?iaka
792 | Himalia
793 | Hyperion
794 | Hyrrokkin
795 | I
796 | Iapetus
797 | II
798 | III
799 | Ijiraq
800 | Io
801 | Iocaste
802 | Isonoe
803 | Janus
804 | Jarnsaxa
805 | Juliet
806 | Kale
807 | Kallichore
808 | Kalyke
809 | Kari
810 | Kerberos
811 | Kiviuq
812 | Kore
813 | Laomedeia
814 | Larissa
815 | Leda
816 | Loge
817 | Lysithea
818 | Mab
819 | Margaret
820 | Megaclite
821 | Methone
822 | Metis
823 | Mimas
824 | Miranda
825 | Mneme
826 | Moon
827 | Mundilfari
828 | Naiad
829 | Namaka
830 | Narvi
831 | Nereid
832 | Neso
833 | Oberon
834 | Ophelia
835 | Orthosie
836 | Paaliaq
837 | Pallene
838 | Pan
839 | Pandora
840 | Pasiphae
841 | Pasithee
842 | Perdita
843 | Phobos
844 | Phoebe
845 | Polydeuces
846 | Portia
847 | Praxidike
848 | Prometheus
849 | Prospero
850 | Proteus
851 | Psamathe
852 | Puck
853 | Rhea
854 | Rosalind
855 | S/2003 J 10
856 | S/2003 J 12
857 | S/2003 J 15
858 | S/2003 J 16
859 | S/2003 J 18
860 | S/2003 J 19
861 | S/2003 J 2
862 | S/2003 J 23
863 | S/2003 J 3
864 | S/2003 J 4
865 | S/2003 J 5
866 | S/2003 J 9
867 | S/2004 N 1
868 | S/2004 S 12
869 | S/2004 S 13
870 | S/2004 S 17
871 | S/2004 S 7
872 | S/2006 S 1
873 | S/2006 S 3
874 | S/2007 S 2
875 | S/2007 S 3
876 | S/2009 S 1
877 | S/2010 J 1
878 | S/2010 J 2
879 | S/2011 J 1
880 | S/2011 J 2
881 | Sao
882 | Setebos
883 | Siarnaq
884 | Sinope
885 | Skathi
886 | Skoll
887 | Sponde
888 | Stephano
889 | Styx
890 | Surtur
891 | Suttungr
892 | Sycorax
893 | Tarqeq
894 | Tarvos
895 | Taygete
896 | Telesto
897 | Tethys
898 | Thalassa
899 | Thebe
900 | Thelxinoe
901 | Themisto
902 | Thrymr
903 | Thyone
904 | Titan
905 | Titania
906 | Trinculo
907 | Triton
908 | Umbrella
909 | XI
910 | Ymir
911 | 2005
912 | Adrastea
913 | Aegaeon
914 | Aegir
915 | Aitne
916 | Albiorix
917 | Amalthea
918 | Ananke
919 | Anthe
920 | Aoede
921 | Arche
922 | Ariel
923 | Atlas
924 | Autonoe
925 | Bebhionn
926 | Belinda
927 | Bergelmir
928 | Bestla
929 | Bianca
930 | Caliban
931 | Callirrhoe
932 | Callisto
933 | Calypso
934 | Carme
935 | Carpo
936 | Chaldene
937 | Cordelia
938 | Cressida
939 | Cupid
940 | Cyllene
941 | Daphnis
942 | Deimos
943 | Desdemona
944 | Despina
945 | Dia
946 | Dione
947 | Dysnomia
948 | Elara
949 | Enceladus
950 | Erinome
951 | Erriapus
952 | Euanthe
953 | Eukelade
954 | Euporie
955 | Europa
956 | Eurydome
957 | Farbauti
958 | Fenrir
959 | Ferdinand
960 | Fornjot
961 | Francisco
962 | Galatea
963 | Ganymede
964 | Greip
965 | Halimede
966 | Harpalyke
967 | Hati
968 | Hegemone
969 | Helene
970 | Helike
971 | Hermippe
972 | Herse
973 | Hi?iaka
974 | Himalia
975 | Hyperion
976 | Hyrrokkin
977 | I
978 | Iapetus
979 | II
980 | III
981 | Ijiraq
982 | Io
983 | Iocaste
984 | Isonoe
985 | Janus
986 | Jarnsaxa
987 | Juliet
988 | Kale
989 | Kallichore
990 | Kalyke
991 | Kari
992 | Kerberos
993 | Kiviuq
994 | Kore
995 | Laomedeia
996 | Larissa
997 | Leda
998 | Loge
999 | Lysithea
1000 | Mab
1001 | Margaret
1002 | Megaclite
1003 | Methone
1004 | Metis
1005 | Mimas
1006 | Miranda
1007 | Mneme
1008 | Moon
1009 | Mundilfari
1010 | Naiad
1011 | Namaka
1012 | Narvi
1013 | Nereid
1014 | Neso
1015 | Oberon
1016 | Ophelia
1017 | Orthosie
1018 | Paaliaq
1019 | Pallene
1020 | Pan
1021 | Pandora
1022 | Pasiphae
1023 | Pasithee
1024 | Perdita
1025 | Phobos
1026 | Phoebe
1027 | Polydeuces
1028 | Portia
1029 | Praxidike
1030 | Prometheus
1031 | Prospero
1032 | Proteus
1033 | Psamathe
1034 | Puck
1035 | Rhea
1036 | Rosalind
1037 | S/2003 J 10
1038 | S/2003 J 12
1039 | S/2003 J 15
1040 | S/2003 J 16
1041 | S/2003 J 18
1042 | S/2003 J 19
1043 | S/2003 J 2
1044 | S/2003 J 23
1045 | S/2003 J 3
1046 | S/2003 J 4
1047 | S/2003 J 5
1048 | S/2003 J 9
1049 | S/2004 N 1
1050 | S/2004 S 12
1051 | S/2004 S 13
1052 | S/2004 S 17
1053 | S/2004 S 7
1054 | S/2006 S 1
1055 | S/2006 S 3
1056 | S/2007 S 2
1057 | S/2007 S 3
1058 | S/2009 S 1
1059 | S/2010 J 1
1060 | S/2010 J 2
1061 | S/2011 J 1
1062 | S/2011 J 2
1063 | Sao
1064 | Setebos
1065 | Siarnaq
1066 | Sinope
1067 | Skathi
1068 | Skoll
1069 | Sponde
1070 | Stephano
1071 | Styx
1072 | Surtur
1073 | Suttungr
1074 | Sycorax
1075 | Tarqeq
1076 | Tarvos
1077 | Taygete
1078 | Telesto
1079 | Tethys
1080 | Thalassa
1081 | Thebe
1082 | Thelxinoe
1083 | Themisto
1084 | Thrymr
1085 | Thyone
1086 | Titan
1087 | Titania
1088 | Trinculo
1089 | Triton
1090 | Umbrella
1091 | XI
1092 | Ymir
1093 | 2005
1094 | Adrastea
1095 | Aegaeon
1096 | Aegir
1097 | Aitne
1098 | Albiorix
1099 | Amalthea
1100 | Ananke
1101 | Anthe
1102 | Aoede
1103 | Arche
1104 | Ariel
1105 | Atlas
1106 | Autonoe
1107 | Bebhionn
1108 | Belinda
1109 | Bergelmir
1110 | Bestla
1111 | Bianca
1112 | Caliban
1113 | Callirrhoe
1114 | Callisto
1115 | Calypso
1116 | Carme
1117 | Carpo
1118 | Chaldene
1119 | Cordelia
1120 | Cressida
1121 | Cupid
1122 | Cyllene
1123 | Daphnis
1124 | Deimos
1125 | Desdemona
1126 | Despina
1127 | Dia
1128 | Dione
1129 | Dysnomia
1130 | Elara
1131 | Enceladus
1132 | Erinome
1133 | Erriapus
1134 | Euanthe
1135 | Eukelade
1136 | Euporie
1137 | Europa
1138 | Eurydome
1139 | Farbauti
1140 | Fenrir
1141 | Ferdinand
1142 | Fornjot
1143 | Francisco
1144 | Galatea
1145 | Ganymede
1146 | Greip
1147 | Halimede
1148 | Harpalyke
1149 | Hati
1150 | Hegemone
1151 | Helene
1152 | Helike
1153 | Hermippe
1154 | Herse
1155 | Hi?iaka
1156 | Himalia
1157 | Hyperion
1158 | Hyrrokkin
1159 | I
1160 | Iapetus
1161 | II
1162 | III
1163 | Ijiraq
1164 | Io
1165 | Iocaste
1166 | Isonoe
1167 | Janus
1168 | Jarnsaxa
1169 | Juliet
1170 | Kale
1171 | Kallichore
1172 | Kalyke
1173 | Kari
1174 | Kerberos
1175 | Kiviuq
1176 | Kore
1177 | Laomedeia
1178 | Larissa
1179 | Leda
1180 | Loge
1181 | Lysithea
1182 | Mab
1183 | Margaret
1184 | Megaclite
1185 | Methone
1186 | Metis
1187 | Mimas
1188 | Miranda
1189 | Mneme
1190 | Moon
1191 | Mundilfari
1192 | Naiad
1193 | Namaka
1194 | Narvi
1195 | Nereid
1196 | Neso
1197 | Oberon
1198 | Ophelia
1199 | Orthosie
1200 | Paaliaq
1201 | Pallene
1202 | Pan
1203 | Pandora
1204 | Pasiphae
1205 | Pasithee
1206 | Perdita
1207 | Phobos
1208 | Phoebe
1209 | Polydeuces
1210 | Portia
1211 | Praxidike
1212 | Prometheus
1213 | Prospero
1214 | Proteus
1215 | Psamathe
1216 | Puck
1217 | Rhea
1218 | Rosalind
1219 | S/2003 J 10
1220 | S/2003 J 12
1221 | S/2003 J 15
1222 | S/2003 J 16
1223 | S/2003 J 18
1224 | S/2003 J 19
1225 | S/2003 J 2
1226 | S/2003 J 23
1227 | S/2003 J 3
1228 | S/2003 J 4
1229 | S/2003 J 5
1230 | S/2003 J 9
1231 | S/2004 N 1
1232 | S/2004 S 12
1233 | S/2004 S 13
1234 | S/2004 S 17
1235 | S/2004 S 7
1236 | S/2006 S 1
1237 | S/2006 S 3
1238 | S/2007 S 2
1239 | S/2007 S 3
1240 | S/2009 S 1
1241 | S/2010 J 1
1242 | S/2010 J 2
1243 | S/2011 J 1
1244 | S/2011 J 2
1245 | Sao
1246 | Setebos
1247 | Siarnaq
1248 | Sinope
1249 | Skathi
1250 | Skoll
1251 | Sponde
1252 | Stephano
1253 | Styx
1254 | Surtur
1255 | Suttungr
1256 | Sycorax
1257 | Tarqeq
1258 | Tarvos
1259 | Taygete
1260 | Telesto
1261 | Tethys
1262 | Thalassa
1263 | Thebe
1264 | Thelxinoe
1265 | Themisto
1266 | Thrymr
1267 | Thyone
1268 | Titan
1269 | Titania
1270 | Trinculo
1271 | Triton
1272 | Umbrella
1273 | XI
1274 | Ymir
1275 | 2005
1276 | Adrastea
1277 | Aegaeon
1278 | Aegir
1279 | Aitne
1280 | Albiorix
1281 | Amalthea
1282 | Ananke
1283 | Anthe
1284 | Aoede
1285 | Arche
1286 | Ariel
1287 | Atlas
1288 | Autonoe
1289 | Bebhionn
1290 | Belinda
1291 | Bergelmir
1292 | Bestla
1293 | Bianca
1294 | Caliban
1295 | Callirrhoe
1296 | Callisto
1297 | Calypso
1298 | Carme
1299 | Carpo
1300 | Chaldene
1301 | Cordelia
1302 | Cressida
1303 | Cupid
1304 | Cyllene
1305 | Daphnis
1306 | Deimos
1307 | Desdemona
1308 | Despina
1309 | Dia
1310 | Dione
1311 | Dysnomia
1312 | Elara
1313 | Enceladus
1314 | Erinome
1315 | Erriapus
1316 | Euanthe
1317 | Eukelade
1318 | Euporie
1319 | Europa
1320 | Eurydome
1321 | Farbauti
1322 | Fenrir
1323 | Ferdinand
1324 | Fornjot
1325 | Francisco
1326 | Galatea
1327 | Ganymede
1328 | Greip
1329 | Halimede
1330 | Harpalyke
1331 | Hati
1332 | Hegemone
1333 | Helene
1334 | Helike
1335 | Hermippe
1336 | Herse
1337 | Hi?iaka
1338 | Himalia
1339 | Hyperion
1340 | Hyrrokkin
1341 | I
1342 | Iapetus
1343 | II
1344 | III
1345 | Ijiraq
1346 | Io
1347 | Iocaste
1348 | Isonoe
1349 | Janus
1350 | Jarnsaxa
1351 | Juliet
1352 | Kale
1353 | Kallichore
1354 | Kalyke
1355 | Kari
1356 | Kerberos
1357 | Kiviuq
1358 | Kore
1359 | Laomedeia
1360 | Larissa
1361 | Leda
1362 | Loge
1363 | Lysithea
1364 | Mab
1365 | Margaret
1366 | Megaclite
1367 | Methone
1368 | Metis
1369 | Mimas
1370 | Miranda
1371 | Mneme
1372 | Moon
1373 | Mundilfari
1374 | Naiad
1375 | Namaka
1376 | Narvi
1377 | Nereid
1378 | Neso
1379 | Oberon
1380 | Ophelia
1381 | Orthosie
1382 | Paaliaq
1383 | Pallene
1384 | Pan
1385 | Pandora
1386 | Pasiphae
1387 | Pasithee
1388 | Perdita
1389 | Phobos
1390 | Phoebe
1391 | Polydeuces
1392 | Portia
1393 | Praxidike
1394 | Prometheus
1395 | Prospero
1396 | Proteus
1397 | Psamathe
1398 | Puck
1399 | Rhea
1400 | Rosalind
1401 | S/2003 J 10
1402 | S/2003 J 12
1403 | S/2003 J 15
1404 | S/2003 J 16
1405 | S/2003 J 18
1406 | S/2003 J 19
1407 | S/2003 J 2
1408 | S/2003 J 23
1409 | S/2003 J 3
1410 | S/2003 J 4
1411 | S/2003 J 5
1412 | S/2003 J 9
1413 | S/2004 N 1
1414 | S/2004 S 12
1415 | S/2004 S 13
1416 | S/2004 S 17
1417 | S/2004 S 7
1418 | S/2006 S 1
1419 | S/2006 S 3
1420 | S/2007 S 2
1421 | S/2007 S 3
1422 | S/2009 S 1
1423 | S/2010 J 1
1424 | S/2010 J 2
1425 | S/2011 J 1
1426 | S/2011 J 2
1427 | Sao
1428 | Setebos
1429 | Siarnaq
1430 | Sinope
1431 | Skathi
1432 | Skoll
1433 | Sponde
1434 | Stephano
1435 | Styx
1436 | Surtur
1437 | Suttungr
1438 | Sycorax
1439 | Tarqeq
1440 | Tarvos
1441 | Taygete
1442 | Telesto
1443 | Tethys
1444 | Thalassa
1445 | Thebe
1446 | Thelxinoe
1447 | Themisto
1448 | Thrymr
1449 | Thyone
1450 | Titan
1451 | Titania
1452 | Trinculo
1453 | Triton
1454 | Umbrella
1455 | XI
1456 | Ymir
1457 | 2005
1458 | Adrastea
1459 | Aegaeon
1460 | Aegir
1461 | Aitne
1462 | Albiorix
1463 | Amalthea
1464 | Ananke
1465 | Anthe
1466 | Aoede
1467 | Arche
1468 | Ariel
1469 | Atlas
1470 | Autonoe
1471 | Bebhionn
1472 | Belinda
1473 | Bergelmir
1474 | Bestla
1475 | Bianca
1476 | Caliban
1477 | Callirrhoe
1478 | Callisto
1479 | Calypso
1480 | Carme
1481 | Carpo
1482 | Chaldene
1483 | Cordelia
1484 | Cressida
1485 | Cupid
1486 | Cyllene
1487 | Daphnis
1488 | Deimos
1489 | Desdemona
1490 | Despina
1491 | Dia
1492 | Dione
1493 | Dysnomia
1494 | Elara
1495 | Enceladus
1496 | Erinome
1497 | Erriapus
1498 | Euanthe
1499 | Eukelade
1500 | Euporie
1501 | Europa
1502 | Eurydome
1503 | Farbauti
1504 | Fenrir
1505 | Ferdinand
1506 | Fornjot
1507 | Francisco
1508 | Galatea
1509 | Ganymede
1510 | Greip
1511 | Halimede
1512 | Harpalyke
1513 | Hati
1514 | Hegemone
1515 | Helene
1516 | Helike
1517 | Hermippe
1518 | Herse
1519 | Hi?iaka
1520 | Himalia
1521 | Hyperion
1522 | Hyrrokkin
1523 | I
1524 | Iapetus
1525 | II
1526 | III
1527 | Ijiraq
1528 | Io
1529 | Iocaste
1530 | Isonoe
1531 | Janus
1532 | Jarnsaxa
1533 | Juliet
1534 | Kale
1535 | Kallichore
1536 | Kalyke
1537 | Kari
1538 | Kerberos
1539 | Kiviuq
1540 | Kore
1541 | Laomedeia
1542 | Larissa
1543 | Leda
1544 | Loge
1545 | Lysithea
1546 | Mab
1547 | Margaret
1548 | Megaclite
1549 | Methone
1550 | Metis
1551 | Mimas
1552 | Miranda
1553 | Mneme
1554 | Moon
1555 | Mundilfari
1556 | Naiad
1557 | Namaka
1558 | Narvi
1559 | Nereid
1560 | Neso
1561 | Oberon
1562 | Ophelia
1563 | Orthosie
1564 | Paaliaq
1565 | Pallene
1566 | Pan
1567 | Pandora
1568 | Pasiphae
1569 | Pasithee
1570 | Perdita
1571 | Phobos
1572 | Phoebe
1573 | Polydeuces
1574 | Portia
1575 | Praxidike
1576 | Prometheus
1577 | Prospero
1578 | Proteus
1579 | Psamathe
1580 | Puck
1581 | Rhea
1582 | Rosalind
1583 | S/2003 J 10
1584 | S/2003 J 12
1585 | S/2003 J 15
1586 | S/2003 J 16
1587 | S/2003 J 18
1588 | S/2003 J 19
1589 | S/2003 J 2
1590 | S/2003 J 23
1591 | S/2003 J 3
1592 | S/2003 J 4
1593 | S/2003 J 5
1594 | S/2003 J 9
1595 | S/2004 N 1
1596 | S/2004 S 12
1597 | S/2004 S 13
1598 | S/2004 S 17
1599 | S/2004 S 7
1600 | S/2006 S 1
1601 | S/2006 S 3
1602 | S/2007 S 2
1603 | S/2007 S 3
1604 | S/2009 S 1
1605 | S/2010 J 1
1606 | S/2010 J 2
1607 | S/2011 J 1
1608 | S/2011 J 2
1609 | Sao
1610 | Setebos
1611 | Siarnaq
1612 | Sinope
1613 | Skathi
1614 | Skoll
1615 | Sponde
1616 | Stephano
1617 | Styx
1618 | Surtur
1619 | Suttungr
1620 | Sycorax
1621 | Tarqeq
1622 | Tarvos
1623 | Taygete
1624 | Telesto
1625 | Tethys
1626 | Thalassa
1627 | Thebe
1628 | Thelxinoe
1629 | Themisto
1630 | Thrymr
1631 | Thyone
1632 | Titan
1633 | Titania
1634 | Trinculo
1635 | Triton
1636 | Umbrella
1637 | XI
1638 | Ymir
1639 | 2005
1640 | Adrastea
1641 | Aegaeon
1642 | Aegir
1643 | Aitne
1644 | Albiorix
1645 | Amalthea
1646 | Ananke
1647 | Anthe
1648 | Aoede
1649 | Arche
1650 | Ariel
1651 | Atlas
1652 | Autonoe
1653 | Bebhionn
1654 | Belinda
1655 | Bergelmir
1656 | Bestla
1657 | Bianca
1658 | Caliban
1659 | Callirrhoe
1660 | Callisto
1661 | Calypso
1662 | Carme
1663 | Carpo
1664 | Chaldene
1665 | Cordelia
1666 | Cressida
1667 | Cupid
1668 | Cyllene
1669 | Daphnis
1670 | Deimos
1671 | Desdemona
1672 | Despina
1673 | Dia
1674 | Dione
1675 | Dysnomia
1676 | Elara
1677 | Enceladus
1678 | Erinome
1679 | Erriapus
1680 | Euanthe
1681 | Eukelade
1682 | Euporie
1683 | Europa
1684 | Eurydome
1685 | Farbauti
1686 | Fenrir
1687 | Ferdinand
1688 | Fornjot
1689 | Francisco
1690 | Galatea
1691 | Ganymede
1692 | Greip
1693 | Halimede
1694 | Harpalyke
1695 | Hati
1696 | Hegemone
1697 | Helene
1698 | Helike
1699 | Hermippe
1700 | Herse
1701 | Hi?iaka
1702 | Himalia
1703 | Hyperion
1704 | Hyrrokkin
1705 | I
1706 | Iapetus
1707 | II
1708 | III
1709 | Ijiraq
1710 | Io
1711 | Iocaste
1712 | Isonoe
1713 | Janus
1714 | Jarnsaxa
1715 | Juliet
1716 | Kale
1717 | Kallichore
1718 | Kalyke
1719 | Kari
1720 | Kerberos
1721 | Kiviuq
1722 | Kore
1723 | Laomedeia
1724 | Larissa
1725 | Leda
1726 | Loge
1727 | Lysithea
1728 | Mab
1729 | Margaret
1730 | Megaclite
1731 | Methone
1732 | Metis
1733 | Mimas
1734 | Miranda
1735 | Mneme
1736 | Moon
1737 | Mundilfari
1738 | Naiad
1739 | Namaka
1740 | Narvi
1741 | Nereid
1742 | Neso
1743 | Oberon
1744 | Ophelia
1745 | Orthosie
1746 | Paaliaq
1747 | Pallene
1748 | Pan
1749 | Pandora
1750 | Pasiphae
1751 | Pasithee
1752 | Perdita
1753 | Phobos
1754 | Phoebe
1755 | Polydeuces
1756 | Portia
1757 | Praxidike
1758 | Prometheus
1759 | Prospero
1760 | Proteus
1761 | Psamathe
1762 | Puck
1763 | Rhea
1764 | Rosalind
1765 | S/2003 J 10
1766 | S/2003 J 12
1767 | S/2003 J 15
1768 | S/2003 J 16
1769 | S/2003 J 18
1770 | S/2003 J 19
1771 | S/2003 J 2
1772 | S/2003 J 23
1773 | S/2003 J 3
1774 | S/2003 J 4
1775 | S/2003 J 5
1776 | S/2003 J 9
1777 | S/2004 N 1
1778 | S/2004 S 12
1779 | S/2004 S 13
1780 | S/2004 S 17
1781 | S/2004 S 7
1782 | S/2006 S 1
1783 | S/2006 S 3
1784 | S/2007 S 2
1785 | S/2007 S 3
1786 | S/2009 S 1
1787 | S/2010 J 1
1788 | S/2010 J 2
1789 | S/2011 J 1
1790 | S/2011 J 2
1791 | Sao
1792 | Setebos
1793 | Siarnaq
1794 | Sinope
1795 | Skathi
1796 | Skoll
1797 | Sponde
1798 | Stephano
1799 | Styx
1800 | Surtur
1801 | Suttungr
1802 | Sycorax
1803 | Tarqeq
1804 | Tarvos
1805 | Taygete
1806 | Telesto
1807 | Tethys
1808 | Thalassa
1809 | Thebe
1810 | Thelxinoe
1811 | Themisto
1812 | Thrymr
1813 | Thyone
1814 | Titan
1815 | Titania
1816 | Trinculo
1817 | Triton
1818 | Umbrella
1819 | XI
1820 | Ymir
1821 | 2005
1822 | Adrastea
1823 | Aegaeon
1824 | Aegir
1825 | Aitne
1826 | Albiorix
1827 | Amalthea
1828 | Ananke
1829 | Anthe
1830 | Aoede
1831 | Arche
1832 | Ariel
1833 | Atlas
1834 | Autonoe
1835 | Bebhionn
1836 | Belinda
1837 | Bergelmir
1838 | Bestla
1839 | Bianca
1840 | Caliban
1841 | Callirrhoe
1842 | Callisto
1843 | Calypso
1844 | Carme
1845 | Carpo
1846 | Chaldene
1847 | Cordelia
1848 | Cressida
1849 | Cupid
1850 | Cyllene
1851 | Daphnis
1852 | Deimos
1853 | Desdemona
1854 | Despina
1855 | Dia
1856 | Dione
1857 | Dysnomia
1858 | Elara
1859 | Enceladus
1860 | Erinome
1861 | Erriapus
1862 | Euanthe
1863 | Eukelade
1864 | Euporie
1865 | Europa
1866 | Eurydome
1867 | Farbauti
1868 | Fenrir
1869 | Ferdinand
1870 | Fornjot
1871 | Francisco
1872 | Galatea
1873 | Ganymede
1874 | Greip
1875 | Halimede
1876 | Harpalyke
1877 | Hati
1878 | Hegemone
1879 | Helene
1880 | Helike
1881 | Hermippe
1882 | Herse
1883 | Hi?iaka
1884 | Himalia
1885 | Hyperion
1886 | Hyrrokkin
1887 | I
1888 | Iapetus
1889 | II
1890 | III
1891 | Ijiraq
1892 | Io
1893 | Iocaste
1894 | Isonoe
1895 | Janus
1896 | Jarnsaxa
1897 | Juliet
1898 | Kale
1899 | Kallichore
1900 | Kalyke
1901 | Kari
1902 | Kerberos
1903 | Kiviuq
1904 | Kore
1905 | Laomedeia
1906 | Larissa
1907 | Leda
1908 | Loge
1909 | Lysithea
1910 | Mab
1911 | Margaret
1912 | Megaclite
1913 | Methone
1914 | Metis
1915 | Mimas
1916 | Miranda
1917 | Mneme
1918 | Moon
1919 | Mundilfari
1920 | Naiad
1921 | Namaka
1922 | Narvi
1923 | Nereid
1924 | Neso
1925 | Oberon
1926 | Ophelia
1927 | Orthosie
1928 | Paaliaq
1929 | Pallene
1930 | Pan
1931 | Pandora
1932 | Pasiphae
1933 | Pasithee
1934 | Perdita
1935 | Phobos
1936 | Phoebe
1937 | Polydeuces
1938 | Portia
1939 | Praxidike
1940 | Prometheus
1941 | Prospero
1942 | Proteus
1943 | Psamathe
1944 | Puck
1945 | Rhea
1946 | Rosalind
1947 | S/2003 J 10
1948 | S/2003 J 12
1949 | S/2003 J 15
1950 | S/2003 J 16
1951 | S/2003 J 18
1952 | S/2003 J 19
1953 | S/2003 J 2
1954 | S/2003 J 23
1955 | S/2003 J 3
1956 | S/2003 J 4
1957 | S/2003 J 5
1958 | S/2003 J 9
1959 | S/2004 N 1
1960 | S/2004 S 12
1961 | S/2004 S 13
1962 | S/2004 S 17
1963 | S/2004 S 7
1964 | S/2006 S 1
1965 | S/2006 S 3
1966 | S/2007 S 2
1967 | S/2007 S 3
1968 | S/2009 S 1
1969 | S/2010 J 1
1970 | S/2010 J 2
1971 | S/2011 J 1
1972 | S/2011 J 2
1973 | Sao
1974 | Setebos
1975 | Siarnaq
1976 | Sinope
1977 | Skathi
1978 | Skoll
1979 | Sponde
1980 | Stephano
1981 | Styx
1982 | Surtur
1983 | Suttungr
1984 | Sycorax
1985 | Tarqeq
1986 | Tarvos
1987 | Taygete
1988 | Telesto
1989 | Tethys
1990 | Thalassa
1991 | Thebe
1992 | Thelxinoe
1993 | Themisto
1994 | Thrymr
1995 | Thyone
1996 | Titan
1997 | Titania
1998 | Trinculo
1999 | Triton
2000 | Umbrella
2001 | XI
2002 | Ymir
2003 | 2005
2004 | Adrastea
2005 | Aegaeon
2006 | Aegir
2007 | Aitne
2008 | Albiorix
2009 | Amalthea
2010 | Ananke
2011 | Anthe
2012 | Aoede
2013 | Arche
2014 | Ariel
2015 | Atlas
2016 | Autonoe
2017 | Bebhionn
2018 | Belinda
2019 | Bergelmir
2020 | Bestla
2021 | Bianca
2022 | Caliban
2023 | Callirrhoe
2024 | Callisto
2025 | Calypso
2026 | Carme
2027 | Carpo
2028 | Chaldene
2029 | Cordelia
2030 | Cressida
2031 | Cupid
2032 | Cyllene
2033 | Daphnis
2034 | Deimos
2035 | Desdemona
2036 | Despina
2037 | Dia
2038 | Dione
2039 | Dysnomia
2040 | Elara
2041 | Enceladus
2042 | Erinome
2043 | Erriapus
2044 | Euanthe
2045 | Eukelade
2046 | Euporie
2047 | Europa
2048 | Eurydome
2049 | Farbauti
2050 | Fenrir
2051 | Ferdinand
2052 | Fornjot
2053 | Francisco
2054 | Galatea
2055 | Ganymede
2056 | Greip
2057 | Halimede
2058 | Harpalyke
2059 | Hati
2060 | Hegemone
2061 | Helene
2062 | Helike
2063 | Hermippe
2064 | Herse
2065 | Hi?iaka
2066 | Himalia
2067 | Hyperion
2068 | Hyrrokkin
2069 | I
2070 | Iapetus
2071 | II
2072 | III
2073 | Ijiraq
2074 | Io
2075 | Iocaste
2076 | Isonoe
2077 | Janus
2078 | Jarnsaxa
2079 | Juliet
2080 | Kale
2081 | Kallichore
2082 | Kalyke
2083 | Kari
2084 | Kerberos
2085 | Kiviuq
2086 | Kore
2087 | Laomedeia
2088 | Larissa
2089 | Leda
2090 | Loge
2091 | Lysithea
2092 | Mab
2093 | Margaret
2094 | Megaclite
2095 | Methone
2096 | Metis
2097 | Mimas
2098 | Miranda
2099 | Mneme
2100 | Moon
2101 | Mundilfari
2102 | Naiad
2103 | Namaka
2104 | Narvi
2105 | Nereid
2106 | Neso
2107 | Oberon
2108 | Ophelia
2109 | Orthosie
2110 | Paaliaq
2111 | Pallene
2112 | Pan
2113 | Pandora
2114 | Pasiphae
2115 | Pasithee
2116 | Perdita
2117 | Phobos
2118 | Phoebe
2119 | Polydeuces
2120 | Portia
2121 | Praxidike
2122 | Prometheus
2123 | Prospero
2124 | Proteus
2125 | Psamathe
2126 | Puck
2127 | Rhea
2128 | Rosalind
2129 | S/2003 J 10
2130 | S/2003 J 12
2131 | S/2003 J 15
2132 | S/2003 J 16
2133 | S/2003 J 18
2134 | S/2003 J 19
2135 | S/2003 J 2
2136 | S/2003 J 23
2137 | S/2003 J 3
2138 | S/2003 J 4
2139 | S/2003 J 5
2140 | S/2003 J 9
2141 | S/2004 N 1
2142 | S/2004 S 12
2143 | S/2004 S 13
2144 | S/2004 S 17
2145 | S/2004 S 7
2146 | S/2006 S 1
2147 | S/2006 S 3
2148 | S/2007 S 2
2149 | S/2007 S 3
2150 | S/2009 S 1
2151 | S/2010 J 1
2152 | S/2010 J 2
2153 | S/2011 J 1
2154 | S/2011 J 2
2155 | Sao
2156 | Setebos
2157 | Siarnaq
2158 | Sinope
2159 | Skathi
2160 | Skoll
2161 | Sponde
2162 | Stephano
2163 | Styx
2164 | Surtur
2165 | Suttungr
2166 | Sycorax
2167 | Tarqeq
2168 | Tarvos
2169 | Taygete
2170 | Telesto
2171 | Tethys
2172 | Thalassa
2173 | Thebe
2174 | Thelxinoe
2175 | Themisto
2176 | Thrymr
2177 | Thyone
2178 | Titan
2179 | Titania
2180 | Trinculo
2181 | Triton
2182 | Umbrella
2183 | XI
2184 | Ymir
2185 | 2005
2186 | Adrastea
2187 | Aegaeon
2188 | Aegir
2189 | Aitne
2190 | Albiorix
2191 | Amalthea
2192 | Ananke
2193 | Anthe
2194 | Aoede
2195 | Arche
2196 | Ariel
2197 | Atlas
2198 | Autonoe
2199 | Bebhionn
2200 | Belinda
2201 | Bergelmir
2202 | Bestla
2203 | Bianca
2204 | Caliban
2205 | Callirrhoe
2206 | Callisto
2207 | Calypso
2208 | Carme
2209 | Carpo
2210 | Chaldene
2211 | Cordelia
2212 | Cressida
2213 | Cupid
2214 | Cyllene
2215 | Daphnis
2216 | Deimos
2217 | Desdemona
2218 | Despina
2219 | Dia
2220 | Dione
2221 | Dysnomia
2222 | Elara
2223 | Enceladus
2224 | Erinome
2225 | Erriapus
2226 | Euanthe
2227 | Eukelade
2228 | Euporie
2229 | Europa
2230 | Eurydome
2231 | Farbauti
2232 | Fenrir
2233 | Ferdinand
2234 | Fornjot
2235 | Francisco
2236 | Galatea
2237 | Ganymede
2238 | Greip
2239 | Halimede
2240 | Harpalyke
2241 | Hati
2242 | Hegemone
2243 | Helene
2244 | Helike
2245 | Hermippe
2246 | Herse
2247 | Hi?iaka
2248 | Himalia
2249 | Hyperion
2250 | Hyrrokkin
2251 | I
2252 | Iapetus
2253 | II
2254 | III
2255 | Ijiraq
2256 | Io
2257 | Iocaste
2258 | Isonoe
2259 | Janus
2260 | Jarnsaxa
2261 | Juliet
2262 | Kale
2263 | Kallichore
2264 | Kalyke
2265 | Kari
2266 | Kerberos
2267 | Kiviuq
2268 | Kore
2269 | Laomedeia
2270 | Larissa
2271 | Leda
2272 | Loge
2273 | Lysithea
2274 | Mab
2275 | Margaret
2276 | Megaclite
2277 | Methone
2278 | Metis
2279 | Mimas
2280 | Miranda
2281 | Mneme
2282 | Moon
2283 | Mundilfari
2284 | Naiad
2285 | Namaka
2286 | Narvi
2287 | Nereid
2288 | Neso
2289 | Oberon
2290 | Ophelia
2291 | Orthosie
2292 | Paaliaq
2293 | Pallene
2294 | Pan
2295 | Pandora
2296 | Pasiphae
2297 | Pasithee
2298 | Perdita
2299 | Phobos
2300 | Phoebe
2301 | Polydeuces
2302 | Portia
2303 | Praxidike
2304 | Prometheus
2305 | Prospero
2306 | Proteus
2307 | Psamathe
2308 | Puck
2309 | Rhea
2310 | Rosalind
2311 | S/2003 J 10
2312 | S/2003 J 12
2313 | S/2003 J 15
2314 | S/2003 J 16
2315 | S/2003 J 18
2316 | S/2003 J 19
2317 | S/2003 J 2
2318 | S/2003 J 23
2319 | S/2003 J 3
2320 | S/2003 J 4
2321 | S/2003 J 5
2322 | S/2003 J 9
2323 | S/2004 N 1
2324 | S/2004 S 12
2325 | S/2004 S 13
2326 | S/2004 S 17
2327 | S/2004 S 7
2328 | S/2006 S 1
2329 | S/2006 S 3
2330 | S/2007 S 2
2331 | S/2007 S 3
2332 | S/2009 S 1
2333 | S/2010 J 1
2334 | S/2010 J 2
2335 | S/2011 J 1
2336 | S/2011 J 2
2337 | Sao
2338 | Setebos
2339 | Siarnaq
2340 | Sinope
2341 | Skathi
2342 | Skoll
2343 | Sponde
2344 | Stephano
2345 | Styx
2346 | Surtur
2347 | Suttungr
2348 | Sycorax
2349 | Tarqeq
2350 | Tarvos
2351 | Taygete
2352 | Telesto
2353 | Tethys
2354 | Thalassa
2355 | Thebe
2356 | Thelxinoe
2357 | Themisto
2358 | Thrymr
2359 | Thyone
2360 | Titan
2361 | Titania
2362 | Trinculo
2363 | Triton
2364 | Umbriel
2365 | XI
2366 | Ymir
2367 |
--------------------------------------------------------------------------------
/test/resources/moons_rhs.txt:
--------------------------------------------------------------------------------
1 | 2005
2 | Adrastea
3 | Aegaeon
4 | Aegir
5 | Aitne
6 | Albiorix
7 | Amalthea
8 | Ananke
9 | Anthe
10 | Aoede
11 | Arche
12 | Ariel
13 | Atlas
14 | Autonoe
15 | Bebhionn
16 | Belinda
17 | Bergelmir
18 | Bestla
19 | Bianca
20 | Caliban
21 | Callirrhoe
22 | Callisto
23 | Calypso
24 | Carme
25 | Carpo
26 | Chaldene
27 | Cordelia
28 | Cressida
29 | Cupid
30 | Cyllene
31 | Daphnis
32 | Deimos
33 | Desdemona
34 | Despina
35 | Dia
36 | Dione
37 | Dysnomia
38 | Elara
39 | Enceladus
40 | Erinome
41 | Erriapus
42 | Euanthe
43 | Eukelade
44 | Euporie
45 | Europa
46 | Eurydome
47 | Farbauti
48 | Fenrir
49 | Ferdinand
50 | Fornjot
51 | Francisco
52 | Galatea
53 | Ganymede
54 | Greip
55 | Halimede
56 | Harpalyke
57 | Hati
58 | Hegemone
59 | Helene
60 | Helike
61 | Hermippe
62 | Herse
63 | Hi?iaka
64 | Himalia
65 | Hyperion
66 | Hyrrokkin
67 | I
68 | Iapetus
69 | II
70 | III
71 | Ijiraq
72 | Io
73 | Iocaste
74 | Isonoe
75 | Janus
76 | Jarnsaxa
77 | Juliet
78 | Kale
79 | Kallichore
80 | Kalyke
81 | Kari
82 | Kerberos
83 | Kiviuq
84 | Kore
85 | Laomedeia
86 | Larissa
87 | Leda
88 | Loge
89 | Lysithea
90 | Mab
91 | Margaret
92 | Megaclite
93 | Methone
94 | Metis
95 | Mimas
96 | Miranda
97 | Mneme
98 | Moon
99 | Mundilfari
100 | Naiad
101 | Namaka
102 | Narvi
103 | Nereid
104 | Neso
105 | Oberon
106 | Ophelia
107 | Orthosie
108 | Paaliaq
109 | Pallene
110 | Pan
111 | Pandora
112 | Pasiphae
113 | Pasithee
114 | Perdita
115 | Phobos
116 | Phoebe
117 | Polydeuces
118 | Portia
119 | Praxidike
120 | Prometheus
121 | Prospero
122 | Proteus
123 | Psamathe
124 | Puck
125 | Rhea
126 | Rosalind
127 | S/2003 J 10
128 | S/2003 J 12
129 | S/2003 J 15
130 | S/2003 J 16
131 | S/2003 J 18
132 | S/2003 J 19
133 | S/2003 J 2
134 | S/2003 J 23
135 | S/2003 J 3
136 | S/2003 J 4
137 | S/2003 J 5
138 | S/2003 J 9
139 | S/2004 N 1
140 | S/2004 S 12
141 | S/2004 S 13
142 | S/2004 S 17
143 | S/2004 S 7
144 | S/2006 S 1
145 | S/2006 S 3
146 | S/2007 S 2
147 | S/2007 S 3
148 | S/2009 S 1
149 | S/2010 J 1
150 | S/2010 J 2
151 | S/2011 J 1
152 | S/2011 J 2
153 | Sao
154 | Setebos
155 | Siarnaq
156 | Sinope
157 | Skathi
158 | Skoll
159 | Sponde
160 | Stephano
161 | Styx
162 | Surtur
163 | Suttungr
164 | Sycorax
165 | Tarqeq
166 | Tarvos
167 | Taygete
168 | Telesto
169 | Tethys
170 | Thalassa
171 | Thebe
172 | Thelxinoe
173 | Themisto
174 | Thrymr
175 | Thyone
176 | Titan
177 | Titania
178 | Trinculo
179 | Triton
180 | Umbrella
181 | XI
182 | Ymir
183 | 2005
184 | Adrastea
185 | Aegaeon
186 | Aegir
187 | Aitne
188 | Albiorix
189 | Amalthea
190 | Ananke
191 | Anthe
192 | Aoede
193 | Arche
194 | Ariel
195 | Atlas
196 | Autonoe
197 | Bebhionn
198 | Belinda
199 | Bergelmir
200 | Bestla
201 | Bianca
202 | Caliban
203 | Callirrhoe
204 | Callisto
205 | Calypso
206 | Carme
207 | Carpo
208 | Chaldene
209 | Cordelia
210 | Cressida
211 | Cupid
212 | Cyllene
213 | Daphnis
214 | Deimos
215 | Desdemona
216 | Despina
217 | Dia
218 | Dione
219 | Dysnomia
220 | Elara
221 | Enceladus
222 | Erinome
223 | Erriapus
224 | Euanthe
225 | Eukelade
226 | Euporie
227 | Europa
228 | Eurydome
229 | Farbauti
230 | Fenrir
231 | Ferdinand
232 | Fornjot
233 | Francisco
234 | Galatea
235 | Ganymede
236 | Greip
237 | Halimede
238 | Harpalyke
239 | Hati
240 | Hegemone
241 | Helene
242 | Helike
243 | Hermippe
244 | Herse
245 | Hi?iaka
246 | Himalia
247 | Hyperion
248 | Hyrrokkin
249 | I
250 | Iapetus
251 | II
252 | III
253 | Ijiraq
254 | Io
255 | Iocaste
256 | Isonoe
257 | Janus
258 | Jarnsaxa
259 | Juliet
260 | Kale
261 | Kallichore
262 | Kalyke
263 | Kari
264 | Kerberos
265 | Kiviuq
266 | Kore
267 | Laomedeia
268 | Larissa
269 | Leda
270 | Loge
271 | Lysithea
272 | Mab
273 | Margaret
274 | Megaclite
275 | Methone
276 | Metis
277 | Mimas
278 | Miranda
279 | Mneme
280 | Moon
281 | Mundilfari
282 | Naiad
283 | Namaka
284 | Narvi
285 | Nereid
286 | Neso
287 | Oberon
288 | Ophelia
289 | Orthosie
290 | Paaliaq
291 | Pallene
292 | Pan
293 | Pandora
294 | Pasiphae
295 | Pasithee
296 | Perdita
297 | Phobos
298 | Phoebe
299 | Polydeuces
300 | Portia
301 | Praxidike
302 | Prometheus
303 | Prospero
304 | Proteus
305 | Psamathe
306 | Puck
307 | Rhea
308 | Rosalind
309 | S/2003 J 10
310 | S/2003 J 12
311 | S/2003 J 15
312 | S/2003 J 16
313 | S/2003 J 18
314 | S/2003 J 19
315 | S/2003 J 2
316 | S/2003 J 23
317 | S/2003 J 3
318 | S/2003 J 4
319 | S/2003 J 5
320 | S/2003 J 9
321 | S/2004 N 1
322 | S/2004 S 12
323 | S/2004 S 13
324 | S/2004 S 17
325 | S/2004 S 7
326 | S/2006 S 1
327 | S/2006 S 3
328 | S/2007 S 2
329 | S/2007 S 3
330 | S/2009 S 1
331 | S/2010 J 1
332 | S/2010 J 2
333 | S/2011 J 1
334 | S/2011 J 2
335 | Sao
336 | Setebos
337 | Siarnaq
338 | Sinope
339 | Skathi
340 | Skoll
341 | Sponde
342 | Stephano
343 | Styx
344 | Surtur
345 | Suttungr
346 | Sycorax
347 | Tarqeq
348 | Tarvos
349 | Taygete
350 | Telesto
351 | Tethys
352 | Thalassa
353 | Thebe
354 | Thelxinoe
355 | Themisto
356 | Thrymr
357 | Thyone
358 | Titan
359 | Titania
360 | Trinculo
361 | Triton
362 | Umbrella
363 | XI
364 | Ymir
365 | 2005
366 | Adrastea
367 | Aegaeon
368 | Aegir
369 | Aitne
370 | Albiorix
371 | Amalthea
372 | Ananke
373 | Anthe
374 | Aoede
375 | Arche
376 | Ariel
377 | Atlas
378 | Autonoe
379 | Bebhionn
380 | Belinda
381 | Bergelmir
382 | Bestla
383 | Bianca
384 | Caliban
385 | Callirrhoe
386 | Callisto
387 | Calypso
388 | Carme
389 | Carpo
390 | Chaldene
391 | Cordelia
392 | Cressida
393 | Cupid
394 | Cyllene
395 | Daphnis
396 | Deimos
397 | Desdemona
398 | Despina
399 | Dia
400 | Dione
401 | Dysnomia
402 | Elara
403 | Enceladus
404 | Erinome
405 | Erriapus
406 | Euanthe
407 | Eukelade
408 | Euporie
409 | Europa
410 | Eurydome
411 | Farbauti
412 | Fenrir
413 | Ferdinand
414 | Fornjot
415 | Francisco
416 | Galatea
417 | Ganymede
418 | Greip
419 | Halimede
420 | Harpalyke
421 | Hati
422 | Hegemone
423 | Helene
424 | Helike
425 | Hermippe
426 | Herse
427 | Hi?iaka
428 | Himalia
429 | Hyperion
430 | Hyrrokkin
431 | I
432 | Iapetus
433 | II
434 | III
435 | Ijiraq
436 | Io
437 | Iocaste
438 | Isonoe
439 | Janus
440 | Jarnsaxa
441 | Juliet
442 | Kale
443 | Kallichore
444 | Kalyke
445 | Kari
446 | Kerberos
447 | Kiviuq
448 | Kore
449 | Laomedeia
450 | Larissa
451 | Leda
452 | Loge
453 | Lysithea
454 | Mab
455 | Margaret
456 | Megaclite
457 | Methone
458 | Metis
459 | Mimas
460 | Miranda
461 | Mneme
462 | Moon
463 | Mundilfari
464 | Naiad
465 | Namaka
466 | Narvi
467 | Nereid
468 | Neso
469 | Oberon
470 | Ophelia
471 | Orthosie
472 | Paaliaq
473 | Pallene
474 | Pan
475 | Pandora
476 | Pasiphae
477 | Pasithee
478 | Perdita
479 | Phobos
480 | Phoebe
481 | Polydeuces
482 | Portia
483 | Praxidike
484 | Prometheus
485 | Prospero
486 | Proteus
487 | Psamathe
488 | Puck
489 | Rhea
490 | Rosalind
491 | S/2003 J 10
492 | S/2003 J 12
493 | S/2003 J 15
494 | S/2003 J 16
495 | S/2003 J 18
496 | S/2003 J 19
497 | S/2003 J 2
498 | S/2003 J 23
499 | S/2003 J 3
500 | S/2003 J 4
501 | S/2003 J 5
502 | S/2003 J 9
503 | S/2004 N 1
504 | S/2004 S 12
505 | S/2004 S 13
506 | S/2004 S 17
507 | S/2004 S 7
508 | S/2006 S 1
509 | S/2006 S 3
510 | S/2007 S 2
511 | S/2007 S 3
512 | S/2009 S 1
513 | S/2010 J 1
514 | S/2010 J 2
515 | S/2011 J 1
516 | S/2011 J 2
517 | Sao
518 | Setebos
519 | Siarnaq
520 | Sinope
521 | Skathi
522 | Skoll
523 | Sponde
524 | Stephano
525 | Styx
526 | Surtur
527 | Suttungr
528 | Sycorax
529 | Tarqeq
530 | Tarvos
531 | Taygete
532 | Telesto
533 | Tethys
534 | Thalassa
535 | Thebe
536 | Thelxinoe
537 | Themisto
538 | Thrymr
539 | Thyone
540 | Titan
541 | Titania
542 | Trinculo
543 | Triton
544 | Umbrella
545 | XI
546 | Ymir
547 | 2005
548 | Adrastea
549 | Aegaeon
550 | Aegir
551 | Aitne
552 | Albiorix
553 | Amalthea
554 | Ananke
555 | Anthe
556 | Aoede
557 | Arche
558 | Ariel
559 | Atlas
560 | Autonoe
561 | Bebhionn
562 | Belinda
563 | Bergelmir
564 | Bestla
565 | Bianca
566 | Caliban
567 | Callirrhoe
568 | Callisto
569 | Calypso
570 | Carme
571 | Carpo
572 | Chaldene
573 | Cordelia
574 | Cressida
575 | Cupid
576 | Cyllene
577 | Daphnis
578 | Deimos
579 | Desdemona
580 | Despina
581 | Dia
582 | Dione
583 | Dysnomia
584 | Elara
585 | Enceladus
586 | Erinome
587 | Erriapus
588 | Euanthe
589 | Eukelade
590 | Euporie
591 | Europa
592 | Eurydome
593 | Farbauti
594 | Fenrir
595 | Ferdinand
596 | Fornjot
597 | Francisco
598 | Galatea
599 | Ganymede
600 | Greip
601 | Halimede
602 | Harpalyke
603 | Hati
604 | Hegemone
605 | Helene
606 | Helike
607 | Hermippe
608 | Herse
609 | Hi?iaka
610 | Himalia
611 | Hyperion
612 | Hyrrokkin
613 | I
614 | Iapetus
615 | II
616 | III
617 | Ijiraq
618 | Io
619 | Iocaste
620 | Isonoe
621 | Janus
622 | Jarnsaxa
623 | Juliet
624 | Kale
625 | Kallichore
626 | Kalyke
627 | Kari
628 | Kerberos
629 | Kiviuq
630 | Kore
631 | Laomedeia
632 | Larissa
633 | Leda
634 | Loge
635 | Lysithea
636 | Mab
637 | Margaret
638 | Megaclite
639 | Methone
640 | Metis
641 | Mimas
642 | Miranda
643 | Mneme
644 | Moon
645 | Mundilfari
646 | Naiad
647 | Namaka
648 | Narvi
649 | Nereid
650 | Neso
651 | Oberon
652 | Ophelia
653 | Orthosie
654 | Paaliaq
655 | Pallene
656 | Pan
657 | Pandora
658 | Pasiphae
659 | Pasithee
660 | Perdita
661 | Phobos
662 | Phoebe
663 | Polydeuces
664 | Portia
665 | Praxidike
666 | Prometheus
667 | Prospero
668 | Proteus
669 | Psamathe
670 | Puck
671 | Rhea
672 | Rosalind
673 | S/2003 J 10
674 | S/2003 J 12
675 | S/2003 J 15
676 | S/2003 J 16
677 | S/2003 J 18
678 | S/2003 J 19
679 | S/2003 J 2
680 | S/2003 J 23
681 | S/2003 J 3
682 | S/2003 J 4
683 | S/2003 J 5
684 | S/2003 J 9
685 | S/2004 N 1
686 | S/2004 S 12
687 | S/2004 S 13
688 | S/2004 S 17
689 | S/2004 S 7
690 | S/2006 S 1
691 | S/2006 S 3
692 | S/2007 S 2
693 | S/2007 S 3
694 | S/2009 S 1
695 | S/2010 J 1
696 | S/2010 J 2
697 | S/2011 J 1
698 | S/2011 J 2
699 | Sao
700 | Setebos
701 | Siarnaq
702 | Sinope
703 | Skathi
704 | Skoll
705 | Sponde
706 | Stephano
707 | Styx
708 | Surtur
709 | Suttungr
710 | Sycorax
711 | Tarqeq
712 | Tarvos
713 | Taygete
714 | Telesto
715 | Tethys
716 | Thalassa
717 | Thebe
718 | Thelxinoe
719 | Themisto
720 | Thrymr
721 | Thyone
722 | Titan
723 | Titania
724 | Trinculo
725 | Triton
726 | Umbrella
727 | XI
728 | Ymir
729 | 2005
730 | Adrastea
731 | Aegaeon
732 | Aegir
733 | Aitne
734 | Albiorix
735 | Amalthea
736 | Ananke
737 | Anthe
738 | Aoede
739 | Arche
740 | Ariel
741 | Atlas
742 | Autonoe
743 | Bebhionn
744 | Belinda
745 | Bergelmir
746 | Bestla
747 | Bianca
748 | Caliban
749 | Callirrhoe
750 | Callisto
751 | Calypso
752 | Carme
753 | Carpo
754 | Chaldene
755 | Cordelia
756 | Cressida
757 | Cupid
758 | Cyllene
759 | Daphnis
760 | Deimos
761 | Desdemona
762 | Despina
763 | Dia
764 | Dione
765 | Dysnomia
766 | Elara
767 | Enceladus
768 | Erinome
769 | Erriapus
770 | Euanthe
771 | Eukelade
772 | Euporie
773 | Europa
774 | Eurydome
775 | Farbauti
776 | Fenrir
777 | Ferdinand
778 | Fornjot
779 | Francisco
780 | Galatea
781 | Ganymede
782 | Greip
783 | Halimede
784 | Harpalyke
785 | Hati
786 | Hegemone
787 | Helene
788 | Helike
789 | Hermippe
790 | Herse
791 | Hi?iaka
792 | Himalia
793 | Hyperion
794 | Hyrrokkin
795 | I
796 | Iapetus
797 | II
798 | III
799 | Ijiraq
800 | Io
801 | Iocaste
802 | Isonoe
803 | Janus
804 | Jarnsaxa
805 | Juliet
806 | Kale
807 | Kallichore
808 | Kalyke
809 | Kari
810 | Kerberos
811 | Kiviuq
812 | Kore
813 | Laomedeia
814 | Larissa
815 | Leda
816 | Loge
817 | Lysithea
818 | Mab
819 | Margaret
820 | Megaclite
821 | Methone
822 | Metis
823 | Mimas
824 | Miranda
825 | Mneme
826 | Moon
827 | Mundilfari
828 | Naiad
829 | Namaka
830 | Narvi
831 | Nereid
832 | Neso
833 | Oberon
834 | Ophelia
835 | Orthosie
836 | Paaliaq
837 | Pallene
838 | Pan
839 | Pandora
840 | Pasiphae
841 | Pasithee
842 | Perdita
843 | Phobos
844 | Phoebe
845 | Polydeuces
846 | Portia
847 | Praxidike
848 | Prometheus
849 | Prospero
850 | Proteus
851 | Psamathe
852 | Puck
853 | Rhea
854 | Rosalind
855 | S/2003 J 10
856 | S/2003 J 12
857 | S/2003 J 15
858 | S/2003 J 16
859 | S/2003 J 18
860 | S/2003 J 19
861 | S/2003 J 2
862 | S/2003 J 23
863 | S/2003 J 3
864 | S/2003 J 4
865 | S/2003 J 5
866 | S/2003 J 9
867 | S/2004 N 1
868 | S/2004 S 12
869 | S/2004 S 13
870 | S/2004 S 17
871 | S/2004 S 7
872 | S/2006 S 1
873 | S/2006 S 3
874 | S/2007 S 2
875 | S/2007 S 3
876 | S/2009 S 1
877 | S/2010 J 1
878 | S/2010 J 2
879 | S/2011 J 1
880 | S/2011 J 2
881 | Sao
882 | Setebos
883 | Siarnaq
884 | Sinope
885 | Skathi
886 | Skoll
887 | Sponde
888 | Stephano
889 | Styx
890 | Surtur
891 | Suttungr
892 | Sycorax
893 | Tarqeq
894 | Tarvos
895 | Taygete
896 | Telesto
897 | Tethys
898 | Thalassa
899 | Thebe
900 | Thelxinoe
901 | Themisto
902 | Thrymr
903 | Thyone
904 | Titan
905 | Titania
906 | Trinculo
907 | Triton
908 | Umbrella
909 | XI
910 | Ymir
911 | 2005
912 | Adrastea
913 | Aegaeon
914 | Aegir
915 | Aitne
916 | Albiorix
917 | Amalthea
918 | Ananke
919 | Anthe
920 | Aoede
921 | Arche
922 | Ariel
923 | Atlas
924 | Autonoe
925 | Bebhionn
926 | Belinda
927 | Bergelmir
928 | Bestla
929 | Bianca
930 | Caliban
931 | Callirrhoe
932 | Callisto
933 | Calypso
934 | Carme
935 | Carpo
936 | Chaldene
937 | Cordelia
938 | Cressida
939 | Cupid
940 | Cyllene
941 | Daphnis
942 | Deimos
943 | Desdemona
944 | Despina
945 | Dia
946 | Dione
947 | Dysnomia
948 | Elara
949 | Enceladus
950 | Erinome
951 | Erriapus
952 | Euanthe
953 | Eukelade
954 | Euporie
955 | Europa
956 | Eurydome
957 | Farbauti
958 | Fenrir
959 | Ferdinand
960 | Fornjot
961 | Francisco
962 | Galatea
963 | Ganymede
964 | Greip
965 | Halimede
966 | Harpalyke
967 | Hati
968 | Hegemone
969 | Helene
970 | Helike
971 | Hermippe
972 | Herse
973 | Hi?iaka
974 | Himalia
975 | Hyperion
976 | Hyrrokkin
977 | I
978 | Iapetus
979 | II
980 | III
981 | Ijiraq
982 | Io
983 | Iocaste
984 | Isonoe
985 | Janus
986 | Jarnsaxa
987 | Juliet
988 | Kale
989 | Kallichore
990 | Kalyke
991 | Kari
992 | Kerberos
993 | Kiviuq
994 | Kore
995 | Laomedeia
996 | Larissa
997 | Leda
998 | Loge
999 | Lysithea
1000 | Mab
1001 | Margaret
1002 | Megaclite
1003 | Methone
1004 | Metis
1005 | Mimas
1006 | Miranda
1007 | Mneme
1008 | Moon
1009 | Mundilfari
1010 | Naiad
1011 | Namaka
1012 | Narvi
1013 | Nereid
1014 | Neso
1015 | Oberon
1016 | Ophelia
1017 | Orthosie
1018 | Paaliaq
1019 | Pallene
1020 | Pan
1021 | Pandora
1022 | Pasiphae
1023 | Pasithee
1024 | Perdita
1025 | Phobos
1026 | Phoebe
1027 | Polydeuces
1028 | Portia
1029 | Praxidike
1030 | Prometheus
1031 | Prospero
1032 | Proteus
1033 | Psamathe
1034 | Puck
1035 | Rhea
1036 | Rosalind
1037 | S/2003 J 10
1038 | S/2003 J 12
1039 | S/2003 J 15
1040 | S/2003 J 16
1041 | S/2003 J 18
1042 | S/2003 J 19
1043 | S/2003 J 2
1044 | S/2003 J 23
1045 | S/2003 J 3
1046 | S/2003 J 4
1047 | S/2003 J 5
1048 | S/2003 J 9
1049 | S/2004 N 1
1050 | S/2004 S 12
1051 | S/2004 S 13
1052 | S/2004 S 17
1053 | S/2004 S 7
1054 | S/2006 S 1
1055 | S/2006 S 3
1056 | S/2007 S 2
1057 | S/2007 S 3
1058 | S/2009 S 1
1059 | S/2010 J 1
1060 | S/2010 J 2
1061 | S/2011 J 1
1062 | S/2011 J 2
1063 | Sao
1064 | Setebos
1065 | Siarnaq
1066 | Sinope
1067 | Skathi
1068 | Skoll
1069 | Sponde
1070 | Stephano
1071 | Styx
1072 | Surtur
1073 | Suttungr
1074 | Sycorax
1075 | Tarqeq
1076 | Tarvos
1077 | Taygete
1078 | Telesto
1079 | Tethys
1080 | Thalassa
1081 | Thebe
1082 | Thelxinoe
1083 | Themisto
1084 | Thrymr
1085 | Thyone
1086 | Titan
1087 | Titania
1088 | Trinculo
1089 | Triton
1090 | Umbrella
1091 | XI
1092 | Ymir
1093 | 2005
1094 | Adrastea
1095 | Aegaeon
1096 | Aegir
1097 | Aitne
1098 | Albiorix
1099 | Amalthea
1100 | Ananke
1101 | Anthe
1102 | Aoede
1103 | Arche
1104 | Ariel
1105 | Atlas
1106 | Autonoe
1107 | Bebhionn
1108 | Belinda
1109 | Bergelmir
1110 | Bestla
1111 | Bianca
1112 | Caliban
1113 | Callirrhoe
1114 | Callisto
1115 | Calypso
1116 | Carme
1117 | Carpo
1118 | Chaldene
1119 | Cordelia
1120 | Cressida
1121 | Cupid
1122 | Cyllene
1123 | Daphnis
1124 | Deimos
1125 | Desdemona
1126 | Despina
1127 | Dia
1128 | Dione
1129 | Dysnomia
1130 | Elara
1131 | Enceladus
1132 | Erinome
1133 | Erriapus
1134 | Euanthe
1135 | Eukelade
1136 | Euporie
1137 | Europa
1138 | Eurydome
1139 | Farbauti
1140 | Fenrir
1141 | Ferdinand
1142 | Fornjot
1143 | Francisco
1144 | Galatea
1145 | Ganymede
1146 | Greip
1147 | Halimede
1148 | Harpalyke
1149 | Hati
1150 | Hegemone
1151 | Helene
1152 | Helike
1153 | Hermippe
1154 | Herse
1155 | Hi?iaka
1156 | Himalia
1157 | Hyperion
1158 | Hyrrokkin
1159 | I
1160 | Iapetus
1161 | II
1162 | III
1163 | Ijiraq
1164 | Io
1165 | Iocaste
1166 | Isonoe
1167 | Janus
1168 | Jarnsaxa
1169 | Juliet
1170 | Kale
1171 | Kallichore
1172 | Kalyke
1173 | Kari
1174 | Kerberos
1175 | Kiviuq
1176 | Kore
1177 | Laomedeia
1178 | Larissa
1179 | Leda
1180 | Loge
1181 | Lysithea
1182 | Mab
1183 | Margaret
1184 | Megaclite
1185 | Methone
1186 | Metis
1187 | Mimas
1188 | Miranda
1189 | Mneme
1190 | Moon
1191 | Mundilfari
1192 | Naiad
1193 | Namaka
1194 | Narvi
1195 | Nereid
1196 | Neso
1197 | Oberon
1198 | Ophelia
1199 | Orthosie
1200 | Paaliaq
1201 | Pallene
1202 | Pan
1203 | Pandora
1204 | Pasiphae
1205 | Pasithee
1206 | Perdita
1207 | Phobos
1208 | Phoebe
1209 | Polydeuces
1210 | Portia
1211 | Praxidike
1212 | Prometheus
1213 | Prospero
1214 | Proteus
1215 | Psamathe
1216 | Puck
1217 | Rhea
1218 | Rosalind
1219 | S/2003 J 10
1220 | S/2003 J 12
1221 | S/2003 J 15
1222 | S/2003 J 16
1223 | S/2003 J 18
1224 | S/2003 J 19
1225 | S/2003 J 2
1226 | S/2003 J 23
1227 | S/2003 J 3
1228 | S/2003 J 4
1229 | S/2003 J 5
1230 | S/2003 J 9
1231 | S/2004 N 1
1232 | S/2004 S 12
1233 | S/2004 S 13
1234 | S/2004 S 17
1235 | S/2004 S 7
1236 | S/2006 S 1
1237 | S/2006 S 3
1238 | S/2007 S 2
1239 | S/2007 S 3
1240 | S/2009 S 1
1241 | S/2010 J 1
1242 | S/2010 J 2
1243 | S/2011 J 1
1244 | S/2011 J 2
1245 | Sao
1246 | Setebos
1247 | Siarnaq
1248 | Sinope
1249 | Skathi
1250 | Skoll
1251 | Sponde
1252 | Stephano
1253 | Styx
1254 | Surtur
1255 | Suttungr
1256 | Sycorax
1257 | Tarqeq
1258 | Tarvos
1259 | Taygete
1260 | Telesto
1261 | Tethys
1262 | Thalassa
1263 | Thebe
1264 | Thelxinoe
1265 | Themisto
1266 | Thrymr
1267 | Thyone
1268 | Titan
1269 | Titania
1270 | Trinculo
1271 | Triton
1272 | Umbrella
1273 | XI
1274 | Ymir
1275 | 2005
1276 | Adrastea
1277 | Aegaeon
1278 | Aegir
1279 | Aitne
1280 | Albiorix
1281 | Amalthea
1282 | Ananke
1283 | Anthe
1284 | Aoede
1285 | Arche
1286 | Ariel
1287 | Atlas
1288 | Autonoe
1289 | Bebhionn
1290 | Belinda
1291 | Bergelmir
1292 | Bestla
1293 | Bianca
1294 | Caliban
1295 | Callirrhoe
1296 | Callisto
1297 | Calypso
1298 | Carme
1299 | Carpo
1300 | Chaldene
1301 | Cordelia
1302 | Cressida
1303 | Cupid
1304 | Cyllene
1305 | Daphnis
1306 | Deimos
1307 | Desdemona
1308 | Despina
1309 | Dia
1310 | Dione
1311 | Dysnomia
1312 | Elara
1313 | Enceladus
1314 | Erinome
1315 | Erriapus
1316 | Euanthe
1317 | Eukelade
1318 | Euporie
1319 | Europa
1320 | Eurydome
1321 | Farbauti
1322 | Fenrir
1323 | Ferdinand
1324 | Fornjot
1325 | Francisco
1326 | Galatea
1327 | Ganymede
1328 | Greip
1329 | Halimede
1330 | Harpalyke
1331 | Hati
1332 | Hegemone
1333 | Helene
1334 | Helike
1335 | Hermippe
1336 | Herse
1337 | Hi?iaka
1338 | Himalia
1339 | Hyperion
1340 | Hyrrokkin
1341 | I
1342 | Iapetus
1343 | II
1344 | III
1345 | Ijiraq
1346 | Io
1347 | Iocaste
1348 | Isonoe
1349 | Janus
1350 | Jarnsaxa
1351 | Juliet
1352 | Kale
1353 | Kallichore
1354 | Kalyke
1355 | Kari
1356 | Kerberos
1357 | Kiviuq
1358 | Kore
1359 | Laomedeia
1360 | Larissa
1361 | Leda
1362 | Loge
1363 | Lysithea
1364 | Mab
1365 | Margaret
1366 | Megaclite
1367 | Methone
1368 | Metis
1369 | Mimas
1370 | Miranda
1371 | Mneme
1372 | Moon
1373 | Mundilfari
1374 | Naiad
1375 | Namaka
1376 | Narvi
1377 | Nereid
1378 | Neso
1379 | Oberon
1380 | Ophelia
1381 | Orthosie
1382 | Paaliaq
1383 | Pallene
1384 | Pan
1385 | Pandora
1386 | Pasiphae
1387 | Pasithee
1388 | Perdita
1389 | Phobos
1390 | Phoebe
1391 | Polydeuces
1392 | Portia
1393 | Praxidike
1394 | Prometheus
1395 | Prospero
1396 | Proteus
1397 | Psamathe
1398 | Puck
1399 | Rhea
1400 | Rosalind
1401 | S/2003 J 10
1402 | S/2003 J 12
1403 | S/2003 J 15
1404 | S/2003 J 16
1405 | S/2003 J 18
1406 | S/2003 J 19
1407 | S/2003 J 2
1408 | S/2003 J 23
1409 | S/2003 J 3
1410 | S/2003 J 4
1411 | S/2003 J 5
1412 | S/2003 J 9
1413 | S/2004 N 1
1414 | S/2004 S 12
1415 | S/2004 S 13
1416 | S/2004 S 17
1417 | S/2004 S 7
1418 | S/2006 S 1
1419 | S/2006 S 3
1420 | S/2007 S 2
1421 | S/2007 S 3
1422 | S/2009 S 1
1423 | S/2010 J 1
1424 | S/2010 J 2
1425 | S/2011 J 1
1426 | S/2011 J 2
1427 | Sao
1428 | Setebos
1429 | Siarnaq
1430 | Sinope
1431 | Skathi
1432 | Skoll
1433 | Sponde
1434 | Stephano
1435 | Styx
1436 | Surtur
1437 | Suttungr
1438 | Sycorax
1439 | Tarqeq
1440 | Tarvos
1441 | Taygete
1442 | Telesto
1443 | Tethys
1444 | Thalassa
1445 | Thebe
1446 | Thelxinoe
1447 | Themisto
1448 | Thrymr
1449 | Thyone
1450 | Titan
1451 | Titania
1452 | Trinculo
1453 | Triton
1454 | Umbrella
1455 | XI
1456 | Ymir
1457 | 2005
1458 | Adrastea
1459 | Aegaeon
1460 | Aegir
1461 | Aitne
1462 | Albiorix
1463 | Amalthea
1464 | Ananke
1465 | Anthe
1466 | Aoede
1467 | Arche
1468 | Ariel
1469 | Atlas
1470 | Autonoe
1471 | Bebhionn
1472 | Belinda
1473 | Bergelmir
1474 | Bestla
1475 | Bianca
1476 | Caliban
1477 | Callirrhoe
1478 | Callisto
1479 | Calypso
1480 | Carme
1481 | Carpo
1482 | Chaldene
1483 | Cordelia
1484 | Cressida
1485 | Cupid
1486 | Cyllene
1487 | Daphnis
1488 | Deimos
1489 | Desdemona
1490 | Despina
1491 | Dia
1492 | Dione
1493 | Dysnomia
1494 | Elara
1495 | Enceladus
1496 | Erinome
1497 | Erriapus
1498 | Euanthe
1499 | Eukelade
1500 | Euporie
1501 | Europa
1502 | Eurydome
1503 | Farbauti
1504 | Fenrir
1505 | Ferdinand
1506 | Fornjot
1507 | Francisco
1508 | Galatea
1509 | Ganymede
1510 | Greip
1511 | Halimede
1512 | Harpalyke
1513 | Hati
1514 | Hegemone
1515 | Helene
1516 | Helike
1517 | Hermippe
1518 | Herse
1519 | Hi?iaka
1520 | Himalia
1521 | Hyperion
1522 | Hyrrokkin
1523 | I
1524 | Iapetus
1525 | II
1526 | III
1527 | Ijiraq
1528 | Io
1529 | Iocaste
1530 | Isonoe
1531 | Janus
1532 | Jarnsaxa
1533 | Juliet
1534 | Kale
1535 | Kallichore
1536 | Kalyke
1537 | Kari
1538 | Kerberos
1539 | Kiviuq
1540 | Kore
1541 | Laomedeia
1542 | Larissa
1543 | Leda
1544 | Loge
1545 | Lysithea
1546 | Mab
1547 | Margaret
1548 | Megaclite
1549 | Methone
1550 | Metis
1551 | Mimas
1552 | Miranda
1553 | Mneme
1554 | Moon
1555 | Mundilfari
1556 | Naiad
1557 | Namaka
1558 | Narvi
1559 | Nereid
1560 | Neso
1561 | Oberon
1562 | Ophelia
1563 | Orthosie
1564 | Paaliaq
1565 | Pallene
1566 | Pan
1567 | Pandora
1568 | Pasiphae
1569 | Pasithee
1570 | Perdita
1571 | Phobos
1572 | Phoebe
1573 | Polydeuces
1574 | Portia
1575 | Praxidike
1576 | Prometheus
1577 | Prospero
1578 | Proteus
1579 | Psamathe
1580 | Puck
1581 | Rhea
1582 | Rosalind
1583 | S/2003 J 10
1584 | S/2003 J 12
1585 | S/2003 J 15
1586 | S/2003 J 16
1587 | S/2003 J 18
1588 | S/2003 J 19
1589 | S/2003 J 2
1590 | S/2003 J 23
1591 | S/2003 J 3
1592 | S/2003 J 4
1593 | S/2003 J 5
1594 | S/2003 J 9
1595 | S/2004 N 1
1596 | S/2004 S 12
1597 | S/2004 S 13
1598 | S/2004 S 17
1599 | S/2004 S 7
1600 | S/2006 S 1
1601 | S/2006 S 3
1602 | S/2007 S 2
1603 | S/2007 S 3
1604 | S/2009 S 1
1605 | S/2010 J 1
1606 | S/2010 J 2
1607 | S/2011 J 1
1608 | S/2011 J 2
1609 | Sao
1610 | Setebos
1611 | Siarnaq
1612 | Sinope
1613 | Skathi
1614 | Skoll
1615 | Sponde
1616 | Stephano
1617 | Styx
1618 | Surtur
1619 | Suttungr
1620 | Sycorax
1621 | Tarqeq
1622 | Tarvos
1623 | Taygete
1624 | Telesto
1625 | Tethys
1626 | Thalassa
1627 | Thebe
1628 | Thelxinoe
1629 | Themisto
1630 | Thrymr
1631 | Thyone
1632 | Titan
1633 | Titania
1634 | Trinculo
1635 | Triton
1636 | Umbrella
1637 | XI
1638 | Ymir
1639 | 2005
1640 | Adrastea
1641 | Aegaeon
1642 | Aegir
1643 | Aitne
1644 | Albiorix
1645 | Amalthea
1646 | Ananke
1647 | Anthe
1648 | Aoede
1649 | Arche
1650 | Ariel
1651 | Atlas
1652 | Autonoe
1653 | Bebhionn
1654 | Belinda
1655 | Bergelmir
1656 | Bestla
1657 | Bianca
1658 | Caliban
1659 | Callirrhoe
1660 | Callisto
1661 | Calypso
1662 | Carme
1663 | Carpo
1664 | Chaldene
1665 | Cordelia
1666 | Cressida
1667 | Cupid
1668 | Cyllene
1669 | Daphnis
1670 | Deimos
1671 | Desdemona
1672 | Despina
1673 | Dia
1674 | Dione
1675 | Dysnomia
1676 | Elara
1677 | Enceladus
1678 | Erinome
1679 | Erriapus
1680 | Euanthe
1681 | Eukelade
1682 | Euporie
1683 | Europa
1684 | Eurydome
1685 | Farbauti
1686 | Fenrir
1687 | Ferdinand
1688 | Fornjot
1689 | Francisco
1690 | Galatea
1691 | Ganymede
1692 | Greip
1693 | Halimede
1694 | Harpalyke
1695 | Hati
1696 | Hegemone
1697 | Helene
1698 | Helike
1699 | Hermippe
1700 | Herse
1701 | Hi?iaka
1702 | Himalia
1703 | Hyperion
1704 | Hyrrokkin
1705 | I
1706 | Iapetus
1707 | II
1708 | III
1709 | Ijiraq
1710 | Io
1711 | Iocaste
1712 | Isonoe
1713 | Janus
1714 | Jarnsaxa
1715 | Juliet
1716 | Kale
1717 | Kallichore
1718 | Kalyke
1719 | Kari
1720 | Kerberos
1721 | Kiviuq
1722 | Kore
1723 | Laomedeia
1724 | Larissa
1725 | Leda
1726 | Loge
1727 | Lysithea
1728 | Mab
1729 | Margaret
1730 | Megaclite
1731 | Methone
1732 | Metis
1733 | Mimas
1734 | Miranda
1735 | Mneme
1736 | Moon
1737 | Mundilfari
1738 | Naiad
1739 | Namaka
1740 | Narvi
1741 | Nereid
1742 | Neso
1743 | Oberon
1744 | Ophelia
1745 | Orthosie
1746 | Paaliaq
1747 | Pallene
1748 | Pan
1749 | Pandora
1750 | Pasiphae
1751 | Pasithee
1752 | Perdita
1753 | Phobos
1754 | Phoebe
1755 | Polydeuces
1756 | Portia
1757 | Praxidike
1758 | Prometheus
1759 | Prospero
1760 | Proteus
1761 | Psamathe
1762 | Puck
1763 | Rhea
1764 | Rosalind
1765 | S/2003 J 10
1766 | S/2003 J 12
1767 | S/2003 J 15
1768 | S/2003 J 16
1769 | S/2003 J 18
1770 | S/2003 J 19
1771 | S/2003 J 2
1772 | S/2003 J 23
1773 | S/2003 J 3
1774 | S/2003 J 4
1775 | S/2003 J 5
1776 | S/2003 J 9
1777 | S/2004 N 1
1778 | S/2004 S 12
1779 | S/2004 S 13
1780 | S/2004 S 17
1781 | S/2004 S 7
1782 | S/2006 S 1
1783 | S/2006 S 3
1784 | S/2007 S 2
1785 | S/2007 S 3
1786 | S/2009 S 1
1787 | S/2010 J 1
1788 | S/2010 J 2
1789 | S/2011 J 1
1790 | S/2011 J 2
1791 | Sao
1792 | Setebos
1793 | Siarnaq
1794 | Sinope
1795 | Skathi
1796 | Skoll
1797 | Sponde
1798 | Stephano
1799 | Styx
1800 | Surtur
1801 | Suttungr
1802 | Sycorax
1803 | Tarqeq
1804 | Tarvos
1805 | Taygete
1806 | Telesto
1807 | Tethys
1808 | Thalassa
1809 | Thebe
1810 | Thelxinoe
1811 | Themisto
1812 | Thrymr
1813 | Thyone
1814 | Titan
1815 | Titania
1816 | Trinculo
1817 | Triton
1818 | Umbrella
1819 | XI
1820 | Ymir
1821 | 2005
1822 | Adrastea
1823 | Aegaeon
1824 | Aegir
1825 | Aitne
1826 | Albiorix
1827 | Amalthea
1828 | Ananke
1829 | Anthe
1830 | Aoede
1831 | Arche
1832 | Ariel
1833 | Atlas
1834 | Autonoe
1835 | Bebhionn
1836 | Belinda
1837 | Bergelmir
1838 | Bestla
1839 | Bianca
1840 | Caliban
1841 | Callirrhoe
1842 | Callisto
1843 | Calypso
1844 | Carme
1845 | Carpo
1846 | Chaldene
1847 | Cordelia
1848 | Cressida
1849 | Cupid
1850 | Cyllene
1851 | Daphnis
1852 | Deimos
1853 | Desdemona
1854 | Despina
1855 | Dia
1856 | Dione
1857 | Dysnomia
1858 | Elara
1859 | Enceladus
1860 | Erinome
1861 | Erriapus
1862 | Euanthe
1863 | Eukelade
1864 | Euporie
1865 | Europa
1866 | Eurydome
1867 | Farbauti
1868 | Fenrir
1869 | Ferdinand
1870 | Fornjot
1871 | Francisco
1872 | Galatea
1873 | Ganymede
1874 | Greip
1875 | Halimede
1876 | Harpalyke
1877 | Hati
1878 | Hegemone
1879 | Helene
1880 | Helike
1881 | Hermippe
1882 | Herse
1883 | Hi?iaka
1884 | Himalia
1885 | Hyperion
1886 | Hyrrokkin
1887 | I
1888 | Iapetus
1889 | II
1890 | III
1891 | Ijiraq
1892 | Io
1893 | Iocaste
1894 | Isonoe
1895 | Janus
1896 | Jarnsaxa
1897 | Juliet
1898 | Kale
1899 | Kallichore
1900 | Kalyke
1901 | Kari
1902 | Kerberos
1903 | Kiviuq
1904 | Kore
1905 | Laomedeia
1906 | Larissa
1907 | Leda
1908 | Loge
1909 | Lysithea
1910 | Mab
1911 | Margaret
1912 | Megaclite
1913 | Methone
1914 | Metis
1915 | Mimas
1916 | Miranda
1917 | Mneme
1918 | Moon
1919 | Mundilfari
1920 | Naiad
1921 | Namaka
1922 | Narvi
1923 | Nereid
1924 | Neso
1925 | Oberon
1926 | Ophelia
1927 | Orthosie
1928 | Paaliaq
1929 | Pallene
1930 | Pan
1931 | Pandora
1932 | Pasiphae
1933 | Pasithee
1934 | Perdita
1935 | Phobos
1936 | Phoebe
1937 | Polydeuces
1938 | Portia
1939 | Praxidike
1940 | Prometheus
1941 | Prospero
1942 | Proteus
1943 | Psamathe
1944 | Puck
1945 | Rhea
1946 | Rosalind
1947 | S/2003 J 10
1948 | S/2003 J 12
1949 | S/2003 J 15
1950 | S/2003 J 16
1951 | S/2003 J 18
1952 | S/2003 J 19
1953 | S/2003 J 2
1954 | S/2003 J 23
1955 | S/2003 J 3
1956 | S/2003 J 4
1957 | S/2003 J 5
1958 | S/2003 J 9
1959 | S/2004 N 1
1960 | S/2004 S 12
1961 | S/2004 S 13
1962 | S/2004 S 17
1963 | S/2004 S 7
1964 | S/2006 S 1
1965 | S/2006 S 3
1966 | S/2007 S 2
1967 | S/2007 S 3
1968 | S/2009 S 1
1969 | S/2010 J 1
1970 | S/2010 J 2
1971 | S/2011 J 1
1972 | S/2011 J 2
1973 | Sao
1974 | Setebos
1975 | Siarnaq
1976 | Sinope
1977 | Skathi
1978 | Skoll
1979 | Sponde
1980 | Stephano
1981 | Styx
1982 | Surtur
1983 | Suttungr
1984 | Sycorax
1985 | Tarqeq
1986 | Tarvos
1987 | Taygete
1988 | Telesto
1989 | Tethys
1990 | Thalassa
1991 | Thebe
1992 | Thelxinoe
1993 | Themisto
1994 | Thrymr
1995 | Thyone
1996 | Titan
1997 | Titania
1998 | Trinculo
1999 | Triton
2000 | Umbrella
2001 | XI
2002 | Ymir
2003 | 2005
2004 | Adrastea
2005 | Aegaeon
2006 | Aegir
2007 | Aitne
2008 | Albiorix
2009 | Amalthea
2010 | Ananke
2011 | Anthe
2012 | Aoede
2013 | Arche
2014 | Ariel
2015 | Atlas
2016 | Autonoe
2017 | Bebhionn
2018 | Belinda
2019 | Bergelmir
2020 | Bestla
2021 | Bianca
2022 | Caliban
2023 | Callirrhoe
2024 | Callisto
2025 | Calypso
2026 | Carme
2027 | Carpo
2028 | Chaldene
2029 | Cordelia
2030 | Cressida
2031 | Cupid
2032 | Cyllene
2033 | Daphnis
2034 | Deimos
2035 | Desdemona
2036 | Despina
2037 | Dia
2038 | Dione
2039 | Dysnomia
2040 | Elara
2041 | Enceladus
2042 | Erinome
2043 | Erriapus
2044 | Euanthe
2045 | Eukelade
2046 | Euporie
2047 | Europa
2048 | Eurydome
2049 | Farbauti
2050 | Fenrir
2051 | Ferdinand
2052 | Fornjot
2053 | Francisco
2054 | Galatea
2055 | Ganymede
2056 | Greip
2057 | Halimede
2058 | Harpalyke
2059 | Hati
2060 | Hegemone
2061 | Helene
2062 | Helike
2063 | Hermippe
2064 | Herse
2065 | Hi?iaka
2066 | Himalia
2067 | Hyperion
2068 | Hyrrokkin
2069 | I
2070 | Iapetus
2071 | II
2072 | III
2073 | Ijiraq
2074 | Io
2075 | Iocaste
2076 | Isonoe
2077 | Janus
2078 | Jarnsaxa
2079 | Juliet
2080 | Kale
2081 | Kallichore
2082 | Kalyke
2083 | Kari
2084 | Kerberos
2085 | Kiviuq
2086 | Kore
2087 | Laomedeia
2088 | Larissa
2089 | Leda
2090 | Loge
2091 | Lysithea
2092 | Mab
2093 | Margaret
2094 | Megaclite
2095 | Methone
2096 | Metis
2097 | Mimas
2098 | Miranda
2099 | Mneme
2100 | Moon
2101 | Mundilfari
2102 | Naiad
2103 | Namaka
2104 | Narvi
2105 | Nereid
2106 | Neso
2107 | Oberon
2108 | Ophelia
2109 | Orthosie
2110 | Paaliaq
2111 | Pallene
2112 | Pan
2113 | Pandora
2114 | Pasiphae
2115 | Pasithee
2116 | Perdita
2117 | Phobos
2118 | Phoebe
2119 | Polydeuces
2120 | Portia
2121 | Praxidike
2122 | Prometheus
2123 | Prospero
2124 | Proteus
2125 | Psamathe
2126 | Puck
2127 | Rhea
2128 | Rosalind
2129 | S/2003 J 10
2130 | S/2003 J 12
2131 | S/2003 J 15
2132 | S/2003 J 16
2133 | S/2003 J 18
2134 | S/2003 J 19
2135 | S/2003 J 2
2136 | S/2003 J 23
2137 | S/2003 J 3
2138 | S/2003 J 4
2139 | S/2003 J 5
2140 | S/2003 J 9
2141 | S/2004 N 1
2142 | S/2004 S 12
2143 | S/2004 S 13
2144 | S/2004 S 17
2145 | S/2004 S 7
2146 | S/2006 S 1
2147 | S/2006 S 3
2148 | S/2007 S 2
2149 | S/2007 S 3
2150 | S/2009 S 1
2151 | S/2010 J 1
2152 | S/2010 J 2
2153 | S/2011 J 1
2154 | S/2011 J 2
2155 | Sao
2156 | Setebos
2157 | Siarnaq
2158 | Sinope
2159 | Skathi
2160 | Skoll
2161 | Sponde
2162 | Stephano
2163 | Styx
2164 | Surtur
2165 | Suttungr
2166 | Sycorax
2167 | Tarqeq
2168 | Tarvos
2169 | Taygete
2170 | Telesto
2171 | Tethys
2172 | Thalassa
2173 | Thebe
2174 | Thelxinoe
2175 | Themisto
2176 | Thrymr
2177 | Thyone
2178 | Titan
2179 | Titania
2180 | Trinculo
2181 | Triton
2182 | Umbrella
2183 | XI
2184 | Ymir
2185 | 2005
2186 | Adrastea
2187 | Aegaeon
2188 | Aegir
2189 | Aitne
2190 | Albiorix
2191 | Amalthea
2192 | Ananke
2193 | Anthe
2194 | Aoede
2195 | Arche
2196 | Ariel
2197 | Atlas
2198 | Autonoe
2199 | Bebhionn
2200 | Belinda
2201 | Bergelmir
2202 | Bestla
2203 | Bianca
2204 | Caliban
2205 | Callirrhoe
2206 | Callisto
2207 | Calypso
2208 | Carme
2209 | Carpo
2210 | Chaldene
2211 | Cordelia
2212 | Cressida
2213 | Cupid
2214 | Cyllene
2215 | Daphnis
2216 | Deimos
2217 | Desdemona
2218 | Despina
2219 | Dia
2220 | Dione
2221 | Dysnomia
2222 | Elara
2223 | Enceladus
2224 | Erinome
2225 | Erriapus
2226 | Euanthe
2227 | Eukelade
2228 | Euporie
2229 | Europa
2230 | Eurydome
2231 | Farbauti
2232 | Fenrir
2233 | Ferdinand
2234 | Fornjot
2235 | Francisco
2236 | Galatea
2237 | Ganymede
2238 | Greip
2239 | Halimede
2240 | Harpalyke
2241 | Hati
2242 | Hegemone
2243 | Helene
2244 | Helike
2245 | Hermippe
2246 | Herse
2247 | Hi?iaka
2248 | Himalia
2249 | Hyperion
2250 | Hyrrokkin
2251 | I
2252 | Iapetus
2253 | II
2254 | III
2255 | Ijiraq
2256 | Io
2257 | Iocaste
2258 | Isonoe
2259 | Janus
2260 | Jarnsaxa
2261 | Juliet
2262 | Kale
2263 | Kallichore
2264 | Kalyke
2265 | Kari
2266 | Kerberos
2267 | Kiviuq
2268 | Kore
2269 | Laomedeia
2270 | Larissa
2271 | Leda
2272 | Loge
2273 | Lysithea
2274 | Mab
2275 | Margaret
2276 | Megaclite
2277 | Methone
2278 | Metis
2279 | Mimas
2280 | Miranda
2281 | Mneme
2282 | Moon
2283 | Mundilfari
2284 | Naiad
2285 | Namaka
2286 | Narvi
2287 | Nereid
2288 | Neso
2289 | Oberon
2290 | Ophelia
2291 | Orthosie
2292 | Paaliaq
2293 | Pallene
2294 | Pan
2295 | Pandora
2296 | Pasiphae
2297 | Pasithee
2298 | Perdita
2299 | Phobos
2300 | Phoebe
2301 | Polydeuces
2302 | Portia
2303 | Praxidike
2304 | Prometheus
2305 | Prospero
2306 | Proteus
2307 | Psamathe
2308 | Puck
2309 | Rhea
2310 | Rosalind
2311 | S/2003 J 10
2312 | S/2003 J 12
2313 | S/2003 J 15
2314 | S/2003 J 16
2315 | S/2003 J 18
2316 | S/2003 J 19
2317 | S/2003 J 2
2318 | S/2003 J 23
2319 | S/2003 J 3
2320 | S/2003 J 4
2321 | S/2003 J 5
2322 | S/2003 J 9
2323 | S/2004 N 1 S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1S/2004 N 1
2324 | S/2004 S 12
2325 | S/2004 S 13
2326 | S/2004 S 17
2327 | S/2004 S 7
2328 | S/2006 S 1
2329 | S/2006 S 3
2330 | S/2007 S 2
2331 | S/2007 S 3
2332 | S/2009 S 1
2333 | S/2010 J 1
2334 | S/2010 J 2
2335 | S/2011 J 1
2336 | S/2011 J 2
2337 | Sao
2338 | Setebos
2339 | Siarnaq
2340 | Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope Sinope
2341 | Skathi
2342 | Skoll
2343 | Sponde
2344 | Stephano Stephano Stephano Stephano Stephano Stephano Stephano
2345 | Styx
2346 | Surtur
2347 | Suttungr
2348 | Sycorax
2349 | Tarqeq
2350 | Tarvos
2351 | Taygete
2352 | Telesto
2353 | Tethys
2354 | Thalassa
2355 | Thebe
2356 | Thelxinoe
2357 | Themisto
2358 | Thrymr
2359 | Thyone
2360 | Titan
2361 | Titania
2362 | Trinculo
2363 | Triton
2364 | Umbrella
2365 | XI
2366 | Ymir
2367 |
--------------------------------------------------------------------------------
/test/words.test.js:
--------------------------------------------------------------------------------
1 | const { expect } = require('chai');
2 | const { diff, formats, changed } = require('../src/');
3 |
4 | describe('compare words', function() {
5 | it('should compare words at start of string', function() {
6 | const changes = diff(
7 | 'the quick red fox jumped',
8 | 'The quick red fox jumped',
9 | {compare: 'words'}
10 | );
11 |
12 | expect(changes.length).to.equal(1);
13 | const [ first ] = changes;
14 | // delete: 'the'
15 | expect(changed(first.lhs)).to.be.true;
16 | expect(first.lhs).to.deep.include({
17 | at: 0, // part
18 | del: 1, // parts deleted
19 | pos: 0, // index
20 | text: 'the',
21 | length: 3 // chars
22 | });
23 | // add: 'The'
24 | expect(changed(first.rhs)).to.be.true;
25 | expect(first.rhs).to.deep.include({
26 | at: 0, // part
27 | add: 1, // parts added
28 | pos: 0, // index
29 | text: 'The',
30 | length: 3 // chars
31 | });
32 |
33 | expect(formats.GnuNormalFormat(changes)).to.equal(
34 | [
35 | '1c1',
36 | '< the',
37 | '---',
38 | '> The'
39 | ].join('\n')
40 | );
41 | });
42 |
43 | it('should compare words in mid string', function() {
44 | const changes = diff(
45 | 'the quick red fox jumped',
46 | 'the quick brown fox jumped',
47 | {compare: 'words'}
48 | );
49 |
50 | expect(changes.length).to.equal(1);
51 | const [ first ] = changes;
52 | // delete: 'red'
53 | expect(changed(first.lhs)).to.be.true;
54 | expect(first.lhs).to.deep.include({
55 | at: 2, // part
56 | del: 1, // parts deleted
57 | pos: 10, // index
58 | text: 'red',
59 | length: 3 // chars
60 | });
61 | // add: 'brown'
62 | expect(changed(first.rhs)).to.be.true;
63 | expect(first.rhs).to.deep.include({
64 | at: 2, // part
65 | add: 1, // parts added
66 | pos: 10, // index
67 | text: 'brown',
68 | length: 5 // chars
69 | });
70 |
71 | expect(formats.GnuNormalFormat(changes)).to.equal(
72 | [
73 | '3c3',
74 | '< red',
75 | '---',
76 | '> brown'
77 | ].join('\n')
78 | );
79 | });
80 |
81 | it('should compare words at end of string', function() {
82 | const changes = diff(
83 | 'the quick red fox jumped',
84 | 'the quick red fox swam',
85 | {compare: 'words'}
86 | );
87 |
88 | expect(changes.length).to.equal(1);
89 | const [ first ] = changes;
90 | // delete: 'red'
91 | expect(changed(first.lhs)).to.be.true;
92 | expect(first.lhs).to.deep.include({
93 | at: 4, // part
94 | del: 1, // parts deleted
95 | pos: 18, // index
96 | text: 'jumped',
97 | length: 6 // chars
98 | });
99 | // add: 'brown'
100 | expect(changed(first.rhs)).to.be.true;
101 | expect(first.rhs).to.deep.include({
102 | at: 4, // part
103 | add: 1, // parts added
104 | pos: 18, // index
105 | text: 'swam',
106 | length: 4 // chars
107 | });
108 |
109 | expect(formats.GnuNormalFormat(changes)).to.equal(
110 | [
111 | '5c5',
112 | '< jumped',
113 | '---',
114 | '> swam'
115 | ].join('\n')
116 | );
117 | });
118 |
119 | it('should compare multiple words added at start of string', function() {
120 | const changes = diff(
121 | 'the quick red fox jumped',
122 | 'The scared quick red fox jumped',
123 | {compare: 'words'}
124 | );
125 |
126 | expect(changes.length).to.equal(1);
127 | const [ first ] = changes;
128 | // delete: 'the'
129 | expect(changed(first.lhs)).to.be.true;
130 | expect(first.lhs).to.deep.include({
131 | at: 0, // part
132 | del: 1, // parts deleted
133 | pos: 0, // index
134 | text: 'the',
135 | length: 3 // chars
136 | });
137 | // add: 'The scared'
138 | expect(changed(first.rhs)).to.be.true;
139 | expect(first.rhs).to.deep.include({
140 | at: 0, // part
141 | add: 2, // parts added
142 | pos: 0, // index
143 | text: 'The',
144 | length: 10 // chars
145 | });
146 |
147 | expect(formats.GnuNormalFormat(changes)).to.equal(
148 | [
149 | '1c1,2',
150 | '< the',
151 | '---',
152 | '> The',
153 | '> scared'
154 | ].join('\n')
155 | );
156 | });
157 |
158 | it('should compare multiple words deleted at start of string', function() {
159 | const changes = diff(
160 | 'The scared quick red fox jumped',
161 | 'the quick red fox jumped',
162 | {compare: 'words'}
163 | );
164 |
165 | expect(changes.length).to.equal(1);
166 | const [ first ] = changes;
167 | // delete: 'The scared'
168 | expect(changed(first.lhs)).to.be.true;
169 | expect(first.lhs).to.deep.include({
170 | at: 0, // part
171 | del: 2, // parts deleted
172 | pos: 0, // index
173 | text: 'The',
174 | length: 10 // chars
175 | });
176 | // add: 'the'
177 | expect(changed(first.rhs)).to.be.true;
178 | expect(first.rhs).to.deep.include({
179 | at: 0, // part
180 | add: 1, // parts added
181 | pos: 0, // index
182 | text: 'the',
183 | length: 3 // chars
184 | });
185 |
186 | expect(formats.GnuNormalFormat(changes)).to.equal(
187 | [
188 | '1,2c1',
189 | '< The',
190 | '< scared',
191 | '---',
192 | '> the'
193 | ].join('\n')
194 | );
195 | });
196 |
197 | it('should compare an added line', function() {
198 | const changes = diff(
199 | '',
200 | 'The quick red fox jumped',
201 | {compare: 'words'}
202 | );
203 |
204 | expect(changes.length).to.equal(1);
205 | const [ first ] = changes;
206 | // delete: nothing
207 | expect(changed(first.lhs)).to.be.false;
208 | expect(first.lhs).to.deep.include({
209 | at: 0, // part
210 | del: 0, // parts deleted
211 | pos: null, // index
212 | text: null,
213 | length: 0 // chars
214 | });
215 | // add: 'The scared'
216 | expect(changed(first.rhs)).to.be.true;
217 | expect(first.rhs).to.deep.include({
218 | at: 0, // part
219 | add: 5, // parts added
220 | pos: 0, // index
221 | text: 'The',
222 | length: 24 // chars
223 | });
224 |
225 | expect(formats.GnuNormalFormat(changes)).to.equal(
226 | [
227 | '1a1,5',
228 | '> The',
229 | '> quick',
230 | '> red',
231 | '> fox',
232 | '> jumped'
233 | ].join('\n')
234 | );
235 | });
236 |
237 | it('should compare a deleted line', function() {
238 | const changes = diff(
239 | 'The quick red fox jumped',
240 | '',
241 | {compare: 'words'}
242 | );
243 |
244 | expect(changes.length).to.equal(1);
245 | const [ first ] = changes;
246 | // delete: nothing
247 | expect(changed(first.lhs)).to.be.true;
248 | expect(first.lhs).to.deep.include({
249 | at: 0, // part
250 | del: 5, // parts deleted
251 | pos: 0, // index
252 | text: 'The',
253 | length: 24 // chars
254 | });
255 | // add: 'The scared'
256 | expect(changed(first.rhs)).to.be.false;
257 | expect(first.rhs).to.deep.include({
258 | at: 0, // part
259 | add: 0, // parts added
260 | pos: null, // index
261 | text: null,
262 | length: 0 // chars
263 | });
264 |
265 | expect(formats.GnuNormalFormat(changes)).to.equal(
266 | [
267 | '1,5d1',
268 | '< The',
269 | '< quick',
270 | '< red',
271 | '< fox',
272 | '< jumped'
273 | ].join('\n')
274 | );
275 | });
276 |
277 | it('should compare arrays', function() {
278 | const changes = diff(
279 | [ 1, 2, 3, 7 ],
280 | [ 1, 2, 3, 4, 5, 6, 7 ],
281 | {compare: 'words'}
282 | );
283 |
284 | expect(changes.length).to.equal(1);
285 | const [ first ] = changes;
286 |
287 | expect(first.lhs).to.deep.include({
288 | at: 0, // part
289 | del: 1, // parts deleted
290 | pos: 0, // index
291 | text: [ 1, 2, 3, 7 ],
292 | length: 4 // chars
293 | });
294 |
295 | expect(first.rhs).to.deep.include({
296 | at: 0,
297 | add: 1,
298 | pos: 0,
299 | text: [ 1, 2, 3, 4, 5, 6, 7 ],
300 | length: 7
301 | })
302 | });
303 | });
304 |
--------------------------------------------------------------------------------