aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna (navi) Figueiredo Gomes <navi@vlhl.dev>2023-11-09 16:58:59 +0100
committerAnna (navi) Figueiredo Gomes <navi@vlhl.dev>2023-11-13 03:54:48 +0100
commitb61f6f4d53803ecf83d9d6152a48bc39c1f2dd42 (patch)
treef8f68b649c39e61aceb1afdae8eaa5afb081ffd0
init
Signed-off-by: Anna (navi) Figueiredo Gomes <navi@vlhl.dev>
-rw-r--r--README.md36
-rw-r--r--main.c391
-rw-r--r--meson.build6
-rw-r--r--stargaze/andromeda12
-rw-r--r--stargaze/antlia10
-rw-r--r--stargaze/apus10
-rw-r--r--stargaze/aquarius19
-rw-r--r--stargaze/aquila13
-rw-r--r--stargaze/ara12
-rw-r--r--stargaze/aries10
-rw-r--r--stargaze/auriga12
-rw-r--r--stargaze/bootes16
-rw-r--r--stargaze/caelum10
-rw-r--r--stargaze/camelopardalis16
-rw-r--r--stargaze/cancer11
-rw-r--r--stargaze/canes_venatici14
-rw-r--r--stargaze/canis_major15
-rw-r--r--stargaze/canis_minor8
-rw-r--r--stargaze/capricorn17
-rw-r--r--stargaze/carina15
-rw-r--r--stargaze/cassiopeia11
-rw-r--r--stargaze/centaurus17
-rw-r--r--stargaze/circinus11
-rw-r--r--stargaze/corona_borealis13
-rw-r--r--stargaze/crux10
-rw-r--r--stargaze/cygnus14
-rw-r--r--stargaze/friggerock9
-rw-r--r--stargaze/gemini22
-rw-r--r--stargaze/leo15
-rw-r--r--stargaze/libra13
-rw-r--r--stargaze/lupus15
-rw-r--r--stargaze/lyra12
-rw-r--r--stargaze/monoceros15
-rw-r--r--stargaze/ophiuchus16
-rw-r--r--stargaze/orion14
-rw-r--r--stargaze/pisces24
-rw-r--r--stargaze/puppis15
-rw-r--r--stargaze/sagittarius14
-rw-r--r--stargaze/scorpio22
-rw-r--r--stargaze/taurus17
-rw-r--r--stargaze/ursa_major13
-rw-r--r--stargaze/ursa_minor13
-rw-r--r--stargaze/virgo15
43 files changed, 993 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..90d285f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,36 @@
+# stargaze -- pretty view of star constellations
+
+the program looks up starfiles in
+* `${XDG_DATA_HOME}/stargaze`, defaulting to `~/.local/share`.
+* `${prefix}/share/stargaze`, defaulting to /usr/local, but probably set to /usr by your distribution.
+* a `stargaze/` folder in the current directory.
+
+see `stargaze -h` for options.
+
+## starfile format
+
+the file is made out of attribute names and data.
+the following attributes are supported:
+`name` used to generate the fullwidth borders
+`quadrant`, `ascension`, `declination`, `area`, and `n_stars`, used to generate the info box.
+`star`, which is followed by `<x> <y>` coordenates. the coordenates must be between 0 and 19, inclusive.
+
+## installation
+
+the prefered way to install stargaze is via your distributions package manager.
+
+in the case it's not packaged for you distro, install `notcurses`,
+clone this repo or grab the tarball, and use meson to install:
+
+`meson setup -Dbuildtype=release build`
+`meson install -C build`
+
+you will be prompted to elevate priveldges.
+
+(or, consider packaging it ~w~)
+
+## known bug
+
+notcurses seems to have a bug when handling escape sequences in specific terminal emulators.
+
+depending on your terminal, rarely it might hang when running. i don't think i can fix this without patching notcurses.
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..1f33800
--- /dev/null
+++ b/main.c
@@ -0,0 +1,391 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <dirent.h>
+#include <time.h>
+#include <notcurses/notcurses.h>
+
+#ifndef DATADIR
+#define DATADIR "/usr/local"
+#endif
+
+#define STARBOX_HEIGHT 12
+#define STARBOX_WIDTH 24
+#define INFOBOX_WIDTH 40
+#define STARBOX_MAX_TITLE ((STARBOX_WIDTH - 2) / 2)
+
+char *pick_constellation(void) {
+ char *xdg_dir = getenv("XDG_DATA_HOME");
+ if (!xdg_dir)
+ xdg_dir = "~/.local/share";
+ size_t len = snprintf(NULL, 0, "%s/%s", xdg_dir, "stargaze");
+ char *user_dir = malloc(++len);
+ snprintf(user_dir, len, "%s/%s", xdg_dir, "stargaze");
+
+ const char * const dirs[] = {
+ "./stargaze/",
+ user_dir,
+ DATADIR "/stargaze/",
+ };
+
+ char **files = calloc(10, sizeof(*files));
+ size_t nfiles = 0, max_files = 10;
+ for (size_t i = 0; i < sizeof(dirs) / sizeof(*dirs); i++) {
+ DIR *dir = opendir(dirs[i]);
+ if (!dir)
+ continue;
+
+ struct dirent *dirent;
+ while ((dirent = readdir(dir))) {
+ if (dirent->d_type != DT_REG)
+ continue;
+ if (nfiles + 1 > max_files)
+ files = (max_files += 10, realloc(files, sizeof(*files) * max_files));
+ size_t len = snprintf(NULL, 0, "%s/%s", dirs[i], dirent->d_name);
+ files[nfiles] = malloc(++len);
+ snprintf(files[nfiles++], len, "%s/%s", dirs[i], dirent->d_name);
+ }
+ closedir(dir);
+ }
+
+ char *out = NULL;
+ if (nfiles > 0) {
+ srand(time(NULL));
+ int choice = rand() % nfiles;
+ out = files[choice];
+ files[choice] = files[--nfiles];
+ }
+
+ for (size_t i = 0; i < nfiles; i++)
+ free(files[i]);
+ free(files);
+
+ free(user_dir);
+
+ return out;
+}
+
+char *name_to_fullwidth(const char *name, size_t len) {
+ if (!name) return NULL;
+ char *new_name = calloc((len * 3) + 1, sizeof(char));
+
+ size_t j = 0;
+ for (size_t i = 0; i < len; i++) {
+ if (isalnum(name[i])) {
+ uint32_t codepoint = name[i] + 0xFEE0;
+ new_name[j++] = 0xE0 | (codepoint >> 12);
+ new_name[j++] = 0x80 | ((codepoint >> 6) & 0x3F);
+ new_name[j++] = 0x80 | (codepoint & 0x3F);
+ } else {
+ new_name[j++] = name[i];
+ }
+ }
+ new_name[j] = '\0';
+
+ return new_name;
+}
+
+enum attibute_types {
+ STAR_ATTR_QUADRANT,
+ STAR_ATTR_ASCENSION,
+ STAR_ATTR_DECLINATION,
+ STAR_ATTR_AREA,
+ STAR_ATTR_STARS,
+ STAR_ATTR_TOTAL
+};
+
+struct constellation {
+ char *name[2];
+ size_t name_len[2];
+ char *display_name[2];
+
+ struct attribute {
+ char *key;
+ char *shortname;
+ char *symbol;
+ char *value;
+ } attributes[STAR_ATTR_TOTAL];
+
+ size_t longest_attr;
+
+ size_t n_stars, max_stars;
+ struct point { size_t x, y; } stars[];
+};
+
+struct constellation *parse_constellation(const char *path) {
+ FILE *fp = NULL;
+ if (!(fp = fopen(path, "r"))) {
+ return NULL;
+ }
+ struct constellation *constellation = calloc(1, sizeof(*constellation) + sizeof(*constellation->stars) * 10);
+ constellation->max_stars = 10;
+
+ char *line = NULL;
+ size_t line_bufsiz;
+ size_t len;
+ while ((len = getline(&line, &line_bufsiz, fp)) != -1) {
+ line[len - 1] = '\0';
+ char *data = strchr(line, ' ');
+ size_t datalen = len - (data - line);
+ if (!data) continue;
+ *data++ = '\0';
+ if (!*data) continue;
+
+ if (strcmp(line, "star") == 0) {
+ size_t x, y;
+ if (sscanf(data, "%ld %ld", &x, &y) != 2)
+ continue;
+ if (x >= 20 || y >= 20)
+ continue;
+ if (constellation->n_stars + 1 < constellation->max_stars) {
+ constellation->max_stars += 5;
+ constellation = realloc(constellation, sizeof(*constellation) + sizeof(*constellation->stars) * constellation->max_stars);
+ }
+ constellation->stars[constellation->n_stars++] = (struct point) { .x = x, .y = y };
+
+ continue;
+ } else if (strcmp(line, "name") == 0) {
+ if (constellation->name[0])
+ continue;
+ constellation->name[0] = strdup(data);
+ constellation->name_len[0] = datalen;
+ char *spc;
+
+ if (constellation->name_len[0] >= STARBOX_MAX_TITLE && (spc = strchr(constellation->name[0], ' '))) {
+ *spc = '\0';
+
+ constellation->name[1] = spc + 1;
+ constellation->name_len[1] = constellation->name_len[0] - (constellation->name[1] - constellation->name[0]);
+ constellation->name_len[0] -= constellation->name_len[1];
+ }
+
+ constellation->display_name[0] = name_to_fullwidth(constellation->name[0],
+ constellation->name_len[0] > STARBOX_MAX_TITLE ? STARBOX_MAX_TITLE : constellation->name_len[0]);
+ constellation->display_name[1] = name_to_fullwidth(constellation->name[1],
+ constellation->name_len[1] > STARBOX_MAX_TITLE ? STARBOX_MAX_TITLE : constellation->name_len[1]);
+
+ } else if (strcmp(line, "quadrant") == 0) {
+ if (constellation->attributes[STAR_ATTR_QUADRANT].value)
+ continue;
+ constellation->attributes[STAR_ATTR_QUADRANT] = (struct attribute) {
+ .shortname = "Quad",
+ .key = "Quadrant",
+ .symbol = "Q",
+ .value = strdup(data),
+ };
+ } else if (strcmp(line, "ascension") == 0) {
+ if (constellation->attributes[STAR_ATTR_ASCENSION].value)
+ continue;
+ constellation->attributes[STAR_ATTR_ASCENSION] = (struct attribute) {
+ .shortname = "Asc",
+ .key = "Ascension",
+ .symbol = "α",
+ .value = strdup(data),
+ };
+ } else if (strcmp(line, "declination") == 0) {
+ if (constellation->attributes[STAR_ATTR_DECLINATION].value)
+ continue;
+ constellation->attributes[STAR_ATTR_DECLINATION] = (struct attribute) {
+ .shortname = "Decl",
+ .key = "Declination",
+ .symbol = "δ",
+ .value = strdup(data),
+ };
+ } else if (strcmp(line, "area") == 0) {
+ if (constellation->attributes[STAR_ATTR_AREA].value)
+ continue;
+ constellation->attributes[STAR_ATTR_AREA] = (struct attribute) {
+ .shortname = "Area",
+ .key = "Area",
+ .symbol = "A",
+ .value = strdup(data),
+ };
+ } else if (strcmp(line, "n_stars") == 0) {
+ if (constellation->attributes[STAR_ATTR_STARS].value)
+ continue;
+ constellation->attributes[STAR_ATTR_STARS] = (struct attribute) {
+ .shortname = "Stars",
+ .key = "Main Stars",
+ .symbol = "✦",
+ .value = strdup(data),
+ };
+ }
+ }
+ free(line);
+
+ return constellation;
+}
+
+void constellation_free(struct constellation* constellation) {
+ if (!constellation)
+ return;
+ free(constellation->name[0]);
+ free(constellation->display_name[0]);
+ free(constellation->display_name[1]);
+ for (size_t i = 0; i < STAR_ATTR_TOTAL; i++) {
+ free(constellation->attributes[i].value);
+ }
+ free(constellation);
+}
+
+void usage(const char* name) {
+ fprintf(stderr,
+"usage: %s [-s|-S] [-f <starfile>] [-c <color>] [-p <padding>]\n\
+\n\
+-f loads a specific starfile\n\
+-c hex color for the stars and highligts\n\
+-s | -S symbol or shortname form for the info box\n\
+-p the padding between the star window and the info text\n\
+\n\
+starfiles are picked from ./stargaze, %s/share/stargaze and ${XDG_DATA_HOME}/stargaze (defaults to ~/.local/share)\n",
+ name, DATADIR);
+}
+
+enum info_format {
+ INFO_FULL,
+ INFO_SHORT,
+ INFO_SYM
+};
+
+int main(int argc, char **argv) {
+ char *starfile = NULL;
+ char opt;
+ enum info_format format = INFO_FULL;
+ struct color { int r, g, b; bool set; } color;
+ size_t padding = 5;
+ while ((opt = getopt(argc, argv, "hf:Ssc:")) != -1) {
+ switch (opt) { case 'h':
+ usage(argv[0]);
+ return EXIT_SUCCESS;
+ case 'S':
+ format = INFO_SHORT;
+ break;
+ case 's':
+ format = INFO_SYM;
+ break;
+ case 'f':
+ starfile = optarg;
+ break;
+ case 'c':
+ if (!(color.set = sscanf(optarg, "%2x%2x%2x", &color.r, &color.g, &color.b) == 3))
+ fprintf(stderr, "%s is not a valid rgb hex color.\n", optarg);
+ break;
+ case 'p':
+ padding = atoi(optarg);
+ break;
+ default:
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+ if (!starfile)
+ starfile = pick_constellation();
+ struct constellation *constellation = parse_constellation(starfile);
+ if (!constellation) {
+ fputs("failed to load constellation file\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ struct notcurses_options opts = {
+ .flags = NCOPTION_CLI_MODE | NCOPTION_SUPPRESS_BANNERS | NCOPTION_DRAIN_INPUT,
+ };
+ struct notcurses *nc = notcurses_core_init(&opts, NULL);
+ if (!nc) {
+ fputs("failed to init notcurses\n", stderr);
+ constellation_free(constellation);
+ return EXIT_FAILURE;
+ }
+
+ struct ncplane *std = notcurses_stdplane(nc);
+
+ unsigned cursor_y = ncplane_cursor_y(std);
+ unsigned term_width = ncplane_dim_x(std);
+
+ if (term_width <= STARBOX_WIDTH) {
+ notcurses_stop(nc);
+ constellation_free(constellation);
+ fputs("terminal window\nis too small\n", stderr);
+ return EXIT_FAILURE;
+ }
+
+ struct ncplane_options stargaze_opts = {
+ .x = 0,
+ .y = cursor_y,
+ .rows = STARBOX_HEIGHT,
+ .cols = term_width,
+ .flags = NCPLANE_OPTION_AUTOGROW | NCPLANE_OPTION_VSCROLL,
+ };
+ struct ncplane *stargaze = ncplane_create(std, &stargaze_opts);
+
+ struct ncplane_options star_opts = {
+ .x = 0,
+ .y = 0,
+ .rows = STARBOX_HEIGHT,
+ .cols = STARBOX_WIDTH,
+ };
+ struct ncplane *stars = ncplane_create(stargaze, &star_opts);
+
+ struct ncplane_options info_box_opts = {
+ .x = STARBOX_WIDTH,
+ .y = NCALIGN_CENTER,
+ .rows = STAR_ATTR_TOTAL + 2, // title and empty line
+ .cols = ncplane_dim_x(stargaze) - STARBOX_WIDTH,
+ .flags = NCPLANE_OPTION_VERALIGNED
+ };
+ struct ncplane *info_box = ncplane_create(stargaze, &info_box_opts);
+
+ ncplane_scrollup_child(std, stargaze);
+
+ struct nccell box[6] = { 0 };
+ nccells_light_box(stars, 0, 0, &box[0], &box[1], &box[2], &box[3], &box[4], &box[5]);
+
+ ncplane_box_sized(stars, &box[0], &box[1], &box[2], &box[3], &box[4], &box[5], STARBOX_HEIGHT, STARBOX_WIDTH,
+ NCBOXGRAD_TOP | NCBOXGRAD_LEFT | NCBOXGRAD_RIGHT | NCBOXGRAD_BOTTOM);
+
+ if (color.set)
+ ncplane_set_fg_rgb8(info_box, color.r, color.g, color.b);
+ ncplane_on_styles(info_box, NCSTYLE_BOLD);
+ if (constellation->name[0]) {
+ ncplane_putstr_aligned(stars, 0, NCALIGN_CENTER, constellation->display_name[0]);
+ ncplane_putstr_yx(info_box, 0, padding, constellation->name[0]);
+ }
+ if (constellation->name[1]) {
+ ncplane_putstr_aligned(stars, STARBOX_HEIGHT - 1, NCALIGN_CENTER, constellation->display_name[1]);
+ ncplane_printf(info_box, " %s", constellation->name[1]);
+ }
+
+ for (size_t i = 0; i < constellation->n_stars; i++)
+ ncplane_putstr_yx(stars, constellation->stars[i].y, constellation->stars[i].x, "✦");
+
+ size_t info_index = 2;
+ for (size_t i = 0; i < STAR_ATTR_TOTAL; i++) {
+ if (!constellation->attributes[i].value)
+ continue;
+ char *key = NULL;
+ switch (format) {
+ case INFO_FULL:
+ key = constellation->attributes[i].key;
+ break;
+ case INFO_SHORT:
+ key = constellation->attributes[i].shortname;
+ break;
+ case INFO_SYM:
+ key = constellation->attributes[i].symbol;
+ break;
+ }
+ if (color.set)
+ ncplane_set_fg_rgb8(info_box, color.r, color.g, color.b);
+ ncplane_on_styles(info_box, NCSTYLE_BOLD);
+ ncplane_printf_yx(info_box, info_index++, padding, "%s: ", key);
+
+ ncplane_set_fg_default(info_box);
+ ncplane_off_styles(info_box, NCSTYLE_BOLD);
+ ncplane_putstr(info_box, constellation->attributes[i].value);
+ }
+
+ notcurses_render(nc);
+
+ constellation_free(constellation);
+ notcurses_stop(nc);
+ puts("\n");
+}
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000..9a1e680
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,6 @@
+project('stargaze', 'c', license: 'GPL-3', version: '0.1')
+
+add_project_arguments('-DDATADIR="@0@/share"'.format(get_option('prefix')), language: 'c')
+notcurses_dep = dependency('notcurses-core')
+executable('stargaze', 'main.c', dependencies: notcurses_dep, install: true)
+install_subdir('stargaze', install_dir: 'share')
diff --git a/stargaze/andromeda b/stargaze/andromeda
new file mode 100644
index 0000000..6d14d43
--- /dev/null
+++ b/stargaze/andromeda
@@ -0,0 +1,12 @@
+name Andromeda
+quadrant NQ1
+ascension 23h 25m 48.6945s to 02h 39m 32.5149s
+declination 53.1870041° to 21.6766376°
+area 722 sq. deg. (19th)
+n_stars 16
+star 19 1
+star 6 3
+star 17 4
+star 9 4
+star 12 6
+star 4 9
diff --git a/stargaze/antlia b/stargaze/antlia
new file mode 100644
index 0000000..0543c7c
--- /dev/null
+++ b/stargaze/antlia
@@ -0,0 +1,10 @@
+name Antlia
+quadrant SQ2
+ascension 09h 27m 05.1837s to 11h 05m 55.0471s
+declination -24.5° to -40.4°
+area 239 sq.deg. (62nd)
+n_stars 3
+star 15 3
+star 8 5
+star 19 6
+star 4 8
diff --git a/stargaze/apus b/stargaze/apus
new file mode 100644
index 0000000..3ef1644
--- /dev/null
+++ b/stargaze/apus
@@ -0,0 +1,10 @@
+name Apus
+quadrant SQ3
+ascension 13h 51m 07.5441s to 18h 27m 27.8395s
+declination −67.4800797° to −83.1200714°
+area 206 sq.deg. (67th)
+n_stars 4
+star 4 4
+star 10 5
+star 7 6
+star 19 7
diff --git a/stargaze/aquarius b/stargaze/aquarius
new file mode 100644
index 0000000..1e0f10a
--- /dev/null
+++ b/stargaze/aquarius
@@ -0,0 +1,19 @@
+name Aquarius
+quadrant SQ4
+ascension 20h38m to 23h56m
+declination +3.325° to -24.904°
+area 980 sq.deg. (10th)
+n_stars 10, 22
+star 10 2
+star 11 2
+star 12 3
+star 15 3
+star 4 4
+star 17 5
+star 6 5
+star 12 6
+star 7 7
+star 12 8
+star 5 8
+star 19 9
+star 4 9
diff --git a/stargaze/aquila b/stargaze/aquila
new file mode 100644
index 0000000..5d531a9
--- /dev/null
+++ b/stargaze/aquila
@@ -0,0 +1,13 @@
+name Aquila
+quadrant NQ4
+ascension 18h 41m 18.2958s to 20h 38m 23.7231s
+declination 18.6882229° to 11.8664360°
+area 652 sq. deg. (22nd)
+n_stars 10
+star 12 1
+star 10 2
+star 20 3
+star 7 3
+star 2 5
+star 11 6
+star 10 9
diff --git a/stargaze/ara b/stargaze/ara
new file mode 100644
index 0000000..618367a
--- /dev/null
+++ b/stargaze/ara
@@ -0,0 +1,12 @@
+name Ara
+quadrant SQ3
+ascension 16h 34m 16.9497s to –18h 10m 41.3407s
+declination −45.4859734° to −67.6905823°
+area 237 sq.deg. (63rd)
+n_stars 8
+star 4 2
+star 16 3
+star 16 6
+star 9 6
+star 19 9
+star 6 10
diff --git a/stargaze/aries b/stargaze/aries
new file mode 100644
index 0000000..4539bdb
--- /dev/null
+++ b/stargaze/aries
@@ -0,0 +1,10 @@
+name Aries
+quadrant NQ1
+ascension 01h 46m 37.3761s to –03h 29m 42.4003s
+declination +31.2213154° to –10.3632069°
+area 441 sq.deg. (39th)
+n_stars 4, 9
+star 5 3
+star 15 5
+star 17 7
+star 16 8
diff --git a/stargaze/auriga b/stargaze/auriga
new file mode 100644
index 0000000..e7e0ccd
--- /dev/null
+++ b/stargaze/auriga
@@ -0,0 +1,12 @@
+name Auriga
+quadrant NQ1
+ascension 4h 37m 54.4293s to 7h 30m 56.1899s
+declination 56.1648331°to 27.8913116°
+area 657 sq. deg. (21st)
+n_stars 5, 8
+star 14 2
+star 5 2
+star 16 4
+star 3 6
+star 15 8
+star 10 10
diff --git a/stargaze/bootes b/stargaze/bootes
new file mode 100644
index 0000000..815730b
--- /dev/null
+++ b/stargaze/bootes
@@ -0,0 +1,16 @@
+name Boötes
+quadrant NQ3
+ascension 13h 36.1m to 15h 49.3m
+declination +7.36° to +55.1°
+area 907 sq.deg. (13th)
+n_stars 7, 15
+star 7 2
+star 12 3
+star 4 4
+star 12 5
+star 8 6
+star 13 8
+star 17 9
+star 8 9
+star 18 10
+star 7 10
diff --git a/stargaze/caelum b/stargaze/caelum
new file mode 100644
index 0000000..e5de728
--- /dev/null
+++ b/stargaze/caelum
@@ -0,0 +1,10 @@
+name Caelum
+quadrant SQ1
+ascension 04h 19.5m to 05h 05.1m
+declination −27.02° to −48.74°
+area 125 sq. deg. (81st)
+n_stars 4
+star 15 2
+star 11 4
+star 4 5
+star 2 8
diff --git a/stargaze/camelopardalis b/stargaze/camelopardalis
new file mode 100644
index 0000000..81a4aec
--- /dev/null
+++ b/stargaze/camelopardalis
@@ -0,0 +1,16 @@
+name Camelopardalis
+quadrant NQ2
+ascension 03h 15m 36.2232s to 14h 27m 07.8855s
+declination 86.0975418° to 52.6655540°
+area 757 sq. deg. (18th)
+n_stars 2, 8
+star 1 1
+star 5 2
+star 9 3
+star 12 5
+star 6 6
+star 17 7
+star 18 8
+star 7 8
+star 20 10
+star 9 10
diff --git a/stargaze/cancer b/stargaze/cancer
new file mode 100644
index 0000000..b8151f2
--- /dev/null
+++ b/stargaze/cancer
@@ -0,0 +1,11 @@
+name Cancer
+quadrant NQ1
+ascension 07h 55m 19.7973s to –09h 22m 35.0364s
+declination +33.1415138° to –6.4700689°
+area 506 sq.deg. (31st)
+n_stars 5
+star 7 2
+star 10 4
+star 11 5
+star 17 7
+star 8 8
diff --git a/stargaze/canes_venatici b/stargaze/canes_venatici
new file mode 100644
index 0000000..46fda67
--- /dev/null
+++ b/stargaze/canes_venatici
@@ -0,0 +1,14 @@
+name Canes Venatici
+quadrant NQ3
+ascension 12h 06.2m to 14h 07.3m
+declination +27.84° to +52.36°
+area 465 sq. deg. (38th)
+n_stars 2
+star 20 2
+star 11 3
+star 17 5
+star 7 6
+star 14 8
+star 5 8
+star 10 9
+star 2 9
diff --git a/stargaze/canis_major b/stargaze/canis_major
new file mode 100644
index 0000000..3b628f3
--- /dev/null
+++ b/stargaze/canis_major
@@ -0,0 +1,15 @@
+name Canis Major
+quadrant SQ1
+ascension 06h 12.5m to 07h 27.5m
+declination −11.03° to −33.25°
+area 380 sq. deg. (43rd)
+n_stars 8
+star 13 1
+star 10 2
+star 11 3
+star 14 4
+star 20 5
+star 8 7
+star 6 9
+star 1 10
+star 10 10
diff --git a/stargaze/canis_minor b/stargaze/canis_minor
new file mode 100644
index 0000000..4afdac1
--- /dev/null
+++ b/stargaze/canis_minor
@@ -0,0 +1,8 @@
+name Canis Minor
+quadrant NQ2
+ascension 07h 06.4m to 08h 11.4m
+declination 13.22° to −0.36°
+area 183 sq. deg. (71st)
+n_stars 2
+star 18 4
+star 3 5
diff --git a/stargaze/capricorn b/stargaze/capricorn
new file mode 100644
index 0000000..7d24bfa
--- /dev/null
+++ b/stargaze/capricorn
@@ -0,0 +1,17 @@
+name Capricorn
+quadrant SQ4
+ascension 20h 06m 46.4871s to 21h 59m 04.8693s
+declination −8.4043999° to −27.6914144°
+area 414 sq.deg. (40th)
+n_stars 9, 13, 23
+star 19 3
+star 3 3
+star 12 4
+star 18 4
+star 5 4
+star 8 4
+star 17 5
+star 5 6
+star 14 7
+star 7 7
+star 12 8
diff --git a/stargaze/carina b/stargaze/carina
new file mode 100644
index 0000000..d25342e
--- /dev/null
+++ b/stargaze/carina
@@ -0,0 +1,15 @@
+name Carina
+quadrant SQ2
+ascension 06h 02m 59.7365s to 11h 20m 37.4211s
+declination −50.7545471° to −75.6840134°
+area 494 sq. deg. (34th)
+n_stars 9
+star 12 1
+star 3 2
+star 8 3
+star 19 5
+star 5 5
+star 12 7
+star 19 8
+star 7 9
+star 11 10
diff --git a/stargaze/cassiopeia b/stargaze/cassiopeia
new file mode 100644
index 0000000..ca02a69
--- /dev/null
+++ b/stargaze/cassiopeia
@@ -0,0 +1,11 @@
+name Cassiopeia
+quadrant NQ1
+ascension 22h 57m 04.5897s to –03h 41m 14.0997s
+declination +77.6923447° to +48.6632690°
+area 598 sq.deg. (25th)
+n_stars 5
+star 4 3
+star 12 5
+star 7 5
+star 20 6
+star 16 8
diff --git a/stargaze/centaurus b/stargaze/centaurus
new file mode 100644
index 0000000..e2e3cac
--- /dev/null
+++ b/stargaze/centaurus
@@ -0,0 +1,17 @@
+name Centaurus
+quadrant SQ3
+ascension 11h 05m 20.9415s to 15h 03m 11.1071s
+declination −29.9948788° to –64.6957885°
+area 1060 sq. deg. (9th)
+n_stars 11
+star 12 1
+star 5 1
+star 1 3
+star 10 3
+star 3 3
+star 8 3
+star 8 5
+star 17 6
+star 10 7
+star 8 9
+star 3 10
diff --git a/stargaze/circinus b/stargaze/circinus
new file mode 100644
index 0000000..c6ba46b
--- /dev/null
+++ b/stargaze/circinus
@@ -0,0 +1,11 @@
+name Circinus
+quadrant SQ3
+ascension 13h 38.4m to 15h 30.2m
+declination -55.43° to -70.62°
+area 93 sq.deg. (85th)
+n_stars 3
+star 12 2
+star 8 2
+star 11 5
+star 11 7
+star 12 9
diff --git a/stargaze/corona_borealis b/stargaze/corona_borealis
new file mode 100644
index 0000000..61d06c3
--- /dev/null
+++ b/stargaze/corona_borealis
@@ -0,0 +1,13 @@
+name Corona Borealis
+quadrant NQ1
+ascension 15h 16m 03.8205s to 16h 25m 07.1526s
+declination +39.7117195° to +25.5380573°
+area 179 sq.deg. (73rd)
+n_stars 8
+star 15 3
+star 20 5
+star 3 5
+star 18 7
+star 5 7
+star 10 8
+star 13 8
diff --git a/stargaze/crux b/stargaze/crux
new file mode 100644
index 0000000..8c5f649
--- /dev/null
+++ b/stargaze/crux
@@ -0,0 +1,10 @@
+name Crux
+quadrant SQ3
+ascension 12.5h
+declination −60°
+area 68 sq.deg. (88th)
+n_stars 4
+star 10 2
+star 16 4
+star 5 5
+star 13 9
diff --git a/stargaze/cygnus b/stargaze/cygnus
new file mode 100644
index 0000000..988814c
--- /dev/null
+++ b/stargaze/cygnus
@@ -0,0 +1,14 @@
+name Cygnus
+quadrant NQ4
+ascension 20.62h
+declination +42.03°
+area 804 sq.deg. (16th)
+n_stars 9
+star 18 2
+star 9 3
+star 15 4
+star 11 5
+star 15 7
+star 7 7
+star 4 8
+star 18 9
diff --git a/stargaze/friggerock b/stargaze/friggerock
new file mode 100644
index 0000000..9c1dee7
--- /dev/null
+++ b/stargaze/friggerock
@@ -0,0 +1,9 @@
+name Friggerock
+quadrant NQ1
+ascension 5h
+declination +5°
+area 594 sq.deg. ()
+n_stars 7
+star 16 4
+star 12 5
+star 8 6
diff --git a/stargaze/gemini b/stargaze/gemini
new file mode 100644
index 0000000..ef535c9
--- /dev/null
+++ b/stargaze/gemini
@@ -0,0 +1,22 @@
+name Gemini
+quadrant NQ2
+ascension 7h
+declination +20°
+area 514 sq.deg. (30th)
+n_stars 8,17
+star 7 1
+star 14 2
+star 7 2
+star 11 3
+star 15 3
+star 19 3
+star 4 3
+star 6 5
+star 15 6
+star 4 6
+star 8 6
+star 14 9
+star 17 9
+star 4 9
+star 8 9
+star 18 10
diff --git a/stargaze/leo b/stargaze/leo
new file mode 100644
index 0000000..2304e22
--- /dev/null
+++ b/stargaze/leo
@@ -0,0 +1,15 @@
+name Leo
+quadrant NQ2
+ascension 11h
+declination +15°
+area 947 sq.deg. (12th)
+n_stars 9, 15
+star 17 2
+star 19 3
+star 14 4
+star 14 5
+star 17 6
+star 7 6
+star 18 8
+star 8 8
+star 3 9
diff --git a/stargaze/libra b/stargaze/libra
new file mode 100644
index 0000000..5179d73
--- /dev/null
+++ b/stargaze/libra
@@ -0,0 +1,13 @@
+name Libra
+quadrant SQ1
+ascension 15h
+declination -15°
+area 538 sq.deg. (29th)
+n_stars 4, 6
+star 12 2
+star 18 3
+star 7 5
+star 17 6
+star 4 6
+star 12 8
+star 13 9
diff --git a/stargaze/lupus b/stargaze/lupus
new file mode 100644
index 0000000..417095c
--- /dev/null
+++ b/stargaze/lupus
@@ -0,0 +1,15 @@
+name Lupus
+quadrant SQ3
+ascension 15.3h
+declination -45°
+area 333.7 sq.deg. (46th)
+n_stars 9
+star 6 1
+star 11 2
+star 2 3
+star 12 4
+star 8 4
+star 16 5
+star 11 6
+star 17 8
+star 12 10
diff --git a/stargaze/lyra b/stargaze/lyra
new file mode 100644
index 0000000..0b6bc37
--- /dev/null
+++ b/stargaze/lyra
@@ -0,0 +1,12 @@
+name Lyra
+quadrant NQ4
+ascension 18h 14m to 19h 28m
+declination 25.66° to 47.71°
+area 286 sq.deg. (52nd)
+n_stars 5
+star 12 2
+star 16 3
+star 12 4
+star 7 5
+star 11 8
+star 6 9
diff --git a/stargaze/monoceros b/stargaze/monoceros
new file mode 100644
index 0000000..299bd9e
--- /dev/null
+++ b/stargaze/monoceros
@@ -0,0 +1,15 @@
+name Monoceros
+quadrant NQ2
+ascension 7.15h
+declination -5.74°
+area 482 sq.deg. (35th)
+n_stars 4
+star 19 3
+star 20 4
+star 17 5
+star 21 5
+star 12 6
+star 2 6
+star 18 9
+star 21 9
+star 6 9
diff --git a/stargaze/ophiuchus b/stargaze/ophiuchus
new file mode 100644
index 0000000..daf9442
--- /dev/null
+++ b/stargaze/ophiuchus
@@ -0,0 +1,16 @@
+name Ophiuchus
+quadrant SQ3
+ascension 17h
+declination -8°
+area 948 sq.deg. (11th)
+n_stars 10
+star 7 2
+star 12 3
+star 16 4
+star 18 5
+star 6 5
+star 17 6
+star 5 6
+star 15 8
+star 12 9
+star 4 9
diff --git a/stargaze/orion b/stargaze/orion
new file mode 100644
index 0000000..4a17fe7
--- /dev/null
+++ b/stargaze/orion
@@ -0,0 +1,14 @@
+name Orion
+quadrant NQ1
+ascension 5h
+declination +5°
+area 594 sq.deg. (26th)
+n_stars 7
+star 11 2
+star 7 3
+star 14 4
+star 11 6
+star 13 6
+star 9 6
+star 15 8
+star 8 9
diff --git a/stargaze/pisces b/stargaze/pisces
new file mode 100644
index 0000000..b621204
--- /dev/null
+++ b/stargaze/pisces
@@ -0,0 +1,24 @@
+name Pisces
+quadrant NQ1
+ascension 1h
+declination +15°
+area 889 sq.deg. (14th)
+n_stars 18
+star 8 1
+star 9 1
+star 8 2
+star 8 3
+star 6 5
+star 4 7
+star 19 8
+star 12 9
+star 13 9
+star 16 9
+star 18 9
+star 21 9
+star 6 9
+star 7 9
+star 18 10
+star 2 10
+star 20 10
+star 3 10
diff --git a/stargaze/puppis b/stargaze/puppis
new file mode 100644
index 0000000..6b3e396
--- /dev/null
+++ b/stargaze/puppis
@@ -0,0 +1,15 @@
+name Puppis
+quadrant SQ2
+ascension 7.5h
+declination -30°
+area 673 sq.deg. (20th)
+n_stars 9
+star 7 1
+star 10 2
+star 5 2
+star 11 3
+star 14 6
+star 6 7
+star 12 8
+star 18 8
+star 16 10
diff --git a/stargaze/sagittarius b/stargaze/sagittarius
new file mode 100644
index 0000000..1e314fc
--- /dev/null
+++ b/stargaze/sagittarius
@@ -0,0 +1,14 @@
+name Sagittarius
+quadrant SQ4
+ascension 19h
+declination -25°
+area 867 sq.deg. (15th)
+n_stars 12,8
+star 12 3
+star 6 4
+star 8 4
+star 14 5
+star 17 6
+star 4 6
+star 6 7
+star 13 9
diff --git a/stargaze/scorpio b/stargaze/scorpio
new file mode 100644
index 0000000..c22cab8
--- /dev/null
+++ b/stargaze/scorpio
@@ -0,0 +1,22 @@
+name Scorpio
+quadrant SQ3
+ascension 16.8875h
+declination -30.7367°
+area 497 sq.deg. (33rd)
+n_stars 18
+star 17 1
+star 18 2
+star 15 3
+star 14 4
+star 18 4
+star 13 5
+star 18 5
+star 11 7
+star 5 7
+star 6 7
+star 10 8
+star 4 8
+star 3 9
+star 4 10
+star 7 10
+star 9 10
diff --git a/stargaze/taurus b/stargaze/taurus
new file mode 100644
index 0000000..3b67431
--- /dev/null
+++ b/stargaze/taurus
@@ -0,0 +1,17 @@
+name Taurus
+quadrant NQ1
+ascension 4.9h
+declination +19°
+area 797 sq.deg. (17th)
+n_stars 19
+star 11 2
+star 5 3
+star 12 4
+star 8 5
+star 10 6
+star 11 6
+star 14 8
+star 19 9
+star 9 9
+star 10 10
+star 19 10
diff --git a/stargaze/ursa_major b/stargaze/ursa_major
new file mode 100644
index 0000000..a85c392
--- /dev/null
+++ b/stargaze/ursa_major
@@ -0,0 +1,13 @@
+name Ursa Major
+quadrant NQ2
+ascension 10.67h
+declination +55.38°
+area 1280 sq.deg. (3rd)
+n_stars 7, 20
+star 5 2
+star 8 3
+star 9 4
+star 11 6
+star 9 8
+star 17 9
+star 13 10
diff --git a/stargaze/ursa_minor b/stargaze/ursa_minor
new file mode 100644
index 0000000..bb175c8
--- /dev/null
+++ b/stargaze/ursa_minor
@@ -0,0 +1,13 @@
+name Ursa Minor
+quadrant NQ3
+ascension 08h 41.4m to 22h 54.0m
+declination +65.40° to +90°
+area 256 sq.deg. (56th)
+n_stars 7
+star 13 2
+star 11 3
+star 10 5
+star 11 7
+star 8 8
+star 14 9
+star 11 10
diff --git a/stargaze/virgo b/stargaze/virgo
new file mode 100644
index 0000000..f9912e9
--- /dev/null
+++ b/stargaze/virgo
@@ -0,0 +1,15 @@
+name Virgo
+quadrant SQ3
+ascension 13h
+declination -4°
+area 1294 sq.deg. (2nd)
+n_stars 9, 15
+star 10 2
+star 12 4
+star 2 5
+star 21 5
+star 14 6
+star 18 6
+star 6 6
+star 10 7
+star 6 9