init: pristine aerc 0.20.0 source

This commit is contained in:
Mortdecai
2026-04-07 19:54:54 -04:00
commit 083402a548
502 changed files with 68722 additions and 0 deletions
+293
View File
@@ -0,0 +1,293 @@
#!/usr/bin/awk -f
# ex: ft=awk
#
# awk filter for aerc to parse text/calendar mime-types
#
# Based on the ical2org.awk script by Eric S Fraga and updated by Guide Van
# Hoecke. Adapted to aerc by Koni Marti <koni.marti@gmail.com>
#
BEGIN {
UIDS[0];
people_attending[0];
people_partstat[0];
people_rsvp[0];
# use a colon to separate the type of data line from the actual contents
FS = ":";
}
{
# remove carriage return from every line
gsub(/\r/, "")
}
/^[ ]/ {
# this block deals with the continuation lines that start with a whitespace
#
line = $0
# remove trailing whitespaces
gsub(/^[ ]/, "", line)
# assumes continuation lines start with a space
if (indescription) {
entry = entry line
} else if (insummary) {
summary = summary line
} else if (inattendee) {
attendee = attendee line
} else if (inorganizer) {
organizer = organizer line
} else if (inlocation) {
location = location unescape(line, 0)
}
}
/^BEGIN:VALARM/,/^END:VALARM/ {
next
}
/^BEGIN:VEVENT/ {
# start of an event: initialize global values used for each event
start_date = "";
end_date = "";
entry = ""
id = ""
indescription = 0;
insummary = 0
inattendee = 0
inorganizer = 0
inlocation = 0
location = ""
status = ""
summary = ""
attendee = ""
organizer = ""
rrend = ""
rcount = ""
intfreq = ""
idx = 0
delete people_attending;
delete people_partstat;
delete people_rsvp;
}
/^[A-Z]/ {
if (attendee != "" && inattendee==1)
add_attendee(attendee)
if (organizer != "" && inorganizer==1)
organizer = find_full_name(organizer)
indescription = 0;
insummary = 0;
inattendee = 0;
inorganizer = 0;
inlocation = 0;
}
/^DTSTART[:;]/ {
tz = get_value($0, "TZID=[^:;]*", "=")
start_date = datetimestring($2, tz);
}
/^DTEND[:;]/ {
tz = get_value($0, "TZID=[^:;]*", "=")
end_date = datetimestring($2, tz);
}
/^RRULE[:]/ {
freq = get_value($0, "FREQ=[^:;]*", "=")
interval = get_value($0, "INTERVAL=[^:;]*", "=")
rrend = get_value($0, "UNTIL=[^:;]*", "=")
rcount = get_value($0, "COUNT=[^:;]*", "=")
intfreq = tolower(freq)
if (interval != "")
intfreq = " +" interval intfreq
}
/^METHOD/ {
method = $2
}
/^UID/ {
line = prepare($0)
id = line
}
/^STATUS/ {
line = prepare($0)
status = line
}
/^DESCRIPTION/ {
line = prepare($0)
entry = entry line
indescription = 1;
}
/^SUMMARY/ {
line = prepare($0)
summary = line
insummary = 1;
}
/^ORGANIZER/ {
organizer = $0
inorganizer = 1;
}
/^LOCATION/ {
line = prepare($0)
location = unescape(line, 0);
inlocation = 1;
}
/^ATTENDEE/ {
attendee = $0
inattendee = 1;
}
/^END:VEVENT/ {
#output event
if (method != "") {
printf "\n This is a meeting %s\n\n", method
}
fmt = " %-14s%s\n"
is_duplicate = (id in UIDS);
if(is_duplicate == 0) {
printf fmt, "SUMMARY", unescape(summary, 0)
printf fmt, "START", start_date
printf fmt, "END", end_date
if (intfreq != "") {
printf "\n"fmt, "RECURRENCE", intfreq
if (rcount != "")
printf fmt, "COUNTS", rcount
if (rrend != "")
printf fmt, "END DATE", rrend
}
if(location != "")
printf fmt, "LOCATION", location
if(organizer != "")
printf fmt, "ORGANIZER", organizer
if (notEmpty(people_attending)) {
printf " %-14s", "ATTENDEES "
for (idx in people_attending) {
if (idx == 1){
printf "%s,\n", people_attending[idx]
}
else if (idx == length(people_attending)){
printf " %-14s%s\n", "", people_attending[idx]
}
else{
printf " %-14s%s,\n", "", people_attending[idx]
}
}
printf "\n\n %-14s\n", "DETAILED LIST:"
for (idx in people_attending) {
printf fmt, "ATTENDEE [" idx "]", people_attending[idx]
partstat = people_partstat[idx]
if (partstat != "") {
printf fmt, "", "STATUS\t" partstat
}
rsvp = people_rsvp[idx]
if (rsvp != "") {
printf fmt, "", "RSVP\t" rsvp
}
}
}
if(entry != "")
print "\n" unescape(entry, 1);
UIDS[id] = 1;
}
}
function notEmpty(array)
{
# "length(array) > 0" isn't POSIX-comapoptible, length accepts only strings
for (idx in array) return 1;
return 0;
}
function prepare(line)
{
gsub($1, "", line)
gsub(/^[: ]/, "", line)
return line
}
function unescape(input, preserve_newlines)
{
ret = input
gsub(/\\,/, ",", ret)
gsub(/\\;/, ";", ret)
if (preserve_newlines)
gsub(/\\n/, "\n", ret)
else
gsub(/\\n/, " ", ret)
return ret
}
function datetimestring(input, tzInput)
{
timestr = input
pos = index(timestr, "T")
if (pos < 0) {
return timestr
}
date = substr(timestr, 1, pos)
time = substr(timestr, pos+1, length(timestr))
year = substr(date, 1, 4)
month = substr(date, 5, 2)
day = substr(date, 7, 2)
hour = substr(time, 1, 2)
min = substr(time, 3, 2)
sec = substr(time, 5, 2)
return sprintf("%4d/%02d/%02d %02d:%02d:%02d %s", year, month, day, hour, min, sec, tzInput)
}
function add_attendee(attendee)
{
CN = find_full_name(attendee)
if (CN != "") {
idx = idx + 1
people_attending[idx] = CN;
people_partstat[idx] = get_value(attendee, "PARTSTAT=[^;:]+", "=")
people_rsvp[idx] = get_value(attendee, "RSVP=[^;:]+", "=")
}
}
function find_full_name(line)
{
name = get_value(line, "CN=[^;:]+", "=")
gsub(/"[^"]*"/,"",line)
email = get_value(line, "(mailto|MAILTO):[^;]+", ":")
if (name == "") {
return sprintf("<%s>", email)
} else {
return sprintf("%s <%s>", name, email)
}
}
function get_value(line, regexp, sep) {
value = ""
match(line, regexp)
{
z = split(substr(line,RSTART,RLENGTH),data,sep)
if (z > 1) {
value = data[2]
}
}
return value
}
+777
View File
@@ -0,0 +1,777 @@
/* SPDX-License-Identifier: MIT */
/* Copyright (c) 2023 Robin Jarry */
#include <ctype.h>
#include <fnmatch.h>
#include <getopt.h>
#include <regex.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void usage(void)
{
puts("usage: colorize [-h] [-8] [-s FILE] [-f FILE]");
puts("");
puts("Add terminal escape codes to colorize plain text email bodies.");
puts("");
puts("options:");
puts(" -h show this help message");
puts(" -8 emit OSC 8 hyperlink sequences (default $AERC_OSC8_URLS)");
puts(" -s FILE use styleset file (default $AERC_STYLESET)");
puts(" -f FILE read from filename (default stdin)");
}
enum color_type {
NONE = 0,
DEFAULT,
RGB,
PALETTE,
};
struct color {
enum color_type type;
uint32_t rgb;
uint32_t index;
};
struct style {
struct color fg;
struct color bg;
bool bold;
bool blink;
bool underline;
bool reverse;
bool italic;
bool dim;
char *sequence;
};
__attribute__((malloc,returns_nonnull))
static void *xmalloc(size_t s)
{
void *ptr = malloc(s);
if (ptr == NULL) {
perror("fatal: cannot allocate buffer");
abort();
}
return ptr;
}
#define BOLD "\x1b[1m"
#define RESET "\x1b[0m"
#define LONGEST_SEQ "\x1b[1;2;3;4;5;7;38;2;255;255;255;48;2;255;255;255m"
static const char *seq(struct style *s) {
if (!s->sequence) {
char *b, *buf = xmalloc(strlen(LONGEST_SEQ) + 1);
const char *sep = "";
b = buf;
b += sprintf(b, "%s", "\x1b[");
if (s->bold) {
b += sprintf(b, "%s1", sep);
sep = ";";
}
if (s->dim) {
b += sprintf(b, "%s2", sep);
sep = ";";
}
if (s->italic) {
b += sprintf(b, "%s3", sep);
sep = ";";
}
if (s->underline) {
b += sprintf(b, "%s4", sep);
sep = ";";
}
if (s->blink) {
b += sprintf(b, "%s5", sep);
sep = ";";
}
if (s->reverse) {
b += sprintf(b, "%s7", sep);
sep = ";";
}
switch (s->fg.type) {
case NONE:
break;
case DEFAULT:
b += sprintf(b, "%s39", sep);
break;
case RGB:
b += sprintf(b, "%s38;2;%d;%d;%d", sep,
(s->fg.rgb >> 16) & 0xff,
(s->fg.rgb >> 8) & 0xff,
s->fg.rgb & 0xff);
sep = ";";
break;
case PALETTE:
b += sprintf(b, (s->fg.index < 8) ?
"%s3%d" : "%s38;5;%d", sep, s->fg.index);
sep = ";";
break;
}
switch (s->bg.type) {
case NONE:
break;
case DEFAULT:
b += sprintf(b, "%s49", sep);
break;
case RGB:
b += sprintf(b, "%s48;2;%d;%d;%d", sep,
(s->bg.rgb >> 16) & 0xff,
(s->bg.rgb >> 8) & 0xff,
s->bg.rgb & 0xff);
break;
case PALETTE:
b += sprintf(b, (s->bg.index < 8) ?
"%s4%d" : "%s48;5;%d", sep, s->bg.index);
break;
}
if (strcmp(buf, "\x1b[") == 0) {
b += sprintf(b, "0");
}
sprintf(b, "m");
s->sequence = buf;
}
return s->sequence;
}
struct styles {
struct style url;
struct style header;
struct style signature;
struct style diff_meta;
struct style diff_chunk;
struct style diff_chunk_func;
struct style diff_add;
struct style diff_del;
struct style quote_1;
struct style quote_2;
struct style quote_3;
struct style quote_4;
struct style quote_x;
};
static FILE *in_file;
static bool osc8_urls;
static const char *styleset;
static struct styles styles = {
.url = { .underline = true, .fg = { .type = PALETTE, .index = 3 } },
.header = { .bold = true, .fg = { .type = PALETTE, .index = 4 } },
.signature = { .dim = true, .fg = { .type = PALETTE, .index = 4 } },
.diff_meta = { .bold = true },
.diff_chunk = { .fg = { .type = PALETTE, .index = 6 } },
.diff_chunk_func = { .dim = true, .fg = { .type = PALETTE, .index = 6 } },
.diff_add = { .fg = { .type = PALETTE, .index = 2 } },
.diff_del = { .fg = { .type = PALETTE, .index = 1 } },
.quote_1 = { .fg = { .type = PALETTE, .index = 6 } },
.quote_2 = { .fg = { .type = PALETTE, .index = 4 } },
.quote_3 = { .dim = true, .fg = { .type = PALETTE, .index = 6 } },
.quote_4 = { .dim = true, .fg = { .type = PALETTE, .index = 4 } },
.quote_x = { .dim = true, .fg = { .type = PALETTE, .index = 5 } },
};
static inline bool startswith(const char *s, const char *prefix)
{
return strncmp(s, prefix, strlen(prefix)) == 0;
}
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static struct { const char *n; uint32_t c; } color_names[] = {
{"aliceblue", 0xf0f8ff}, {"antiquewhite", 0xfaebd7}, {"aqua", 0x00ffff},
{"aquamarine", 0x7fffd4}, {"azure", 0xf0ffff}, {"beige", 0xf5f5dc},
{"bisque", 0xffe4c4}, {"black", 0x000000}, {"blanchedalmond", 0xffebcd},
{"blue", 0x0000ff}, {"blueviolet", 0x8a2be2}, {"brown", 0xa52a2a},
{"burlywood", 0xdeb887}, {"cadetblue", 0x5f9ea0}, {"chartreuse", 0x7fff00},
{"chocolate", 0xd2691e}, {"coral", 0xff7f50}, {"cornflowerblue", 0x6495ed},
{"cornsilk", 0xfff8dc}, {"crimson", 0xdc143c}, {"darkblue", 0x00008b},
{"darkcyan", 0x008b8b}, {"darkgoldenrod", 0xb8860b}, {"darkgray", 0xa9a9a9},
{"darkgreen", 0x006400}, {"darkkhaki", 0xbdb76b}, {"darkmagenta", 0x8b008b},
{"darkolivegreen", 0x556b2f}, {"darkorange", 0xff8c00}, {"darkorchid", 0x9932cc},
{"darkred", 0x8b0000}, {"darksalmon", 0xe9967a}, {"darkseagreen", 0x8fbc8f},
{"darkslateblue", 0x483d8b}, {"darkslategray", 0x2f4f4f}, {"darkturquoise", 0x00ced1},
{"darkviolet", 0x9400d3}, {"deeppink", 0xff1493}, {"deepskyblue", 0x00bfff},
{"dimgray", 0x696969}, {"dodgerblue", 0x1e90ff}, {"firebrick", 0xb22222},
{"floralwhite", 0xfffaf0}, {"forestgreen", 0x228b22}, {"fuchsia", 0xff00ff},
{"gainsboro", 0xdcdcdc}, {"ghostwhite", 0xf8f8ff}, {"gold", 0xffd700},
{"goldenrod", 0xdaa520}, {"gray", 0x808080}, {"green", 0x008000},
{"greenyellow", 0xadff2f}, {"honeydew", 0xf0fff0}, {"hotpink", 0xff69b4},
{"indianred", 0xcd5c5c}, {"indigo", 0x4b0082}, {"ivory", 0xfffff0},
{"khaki", 0xf0e68c}, {"lavender", 0xe6e6fa}, {"lavenderblush", 0xfff0f5},
{"lawngreen", 0x7cfc00}, {"lemonchiffon", 0xfffacd}, {"lightblue", 0xadd8e6},
{"lightcoral", 0xf08080}, {"lightcyan", 0xe0ffff}, {"lightgoldenrodyellow", 0xfafad2},
{"lightgray", 0xd3d3d3}, {"lightgreen", 0x90ee90}, {"lightpink", 0xffb6c1},
{"lightsalmon", 0xffa07a}, {"lightseagreen", 0x20b2aa}, {"lightskyblue", 0x87cefa},
{"lightslategray", 0x778899}, {"lightsteelblue", 0xb0c4de}, {"lightyellow", 0xffffe0},
{"lime", 0x00ff00}, {"limegreen", 0x32cd32}, {"linen", 0xfaf0e6},
{"maroon", 0x800000}, {"mediumaquamarine", 0x66cdaa}, {"mediumblue", 0x0000cd},
{"mediumorchid", 0xba55d3}, {"mediumpurple", 0x9370db}, {"mediumseagreen", 0x3cb371},
{"mediumslateblue", 0x7b68ee}, {"mediumspringgreen", 0x00fa9a}, {"mediumturquoise", 0x48d1cc},
{"mediumvioletred", 0xc71585}, {"midnightblue", 0x191970}, {"mintcream", 0xf5fffa},
{"mistyrose", 0xffe4e1}, {"moccasin", 0xffe4b5}, {"navajowhite", 0xffdead},
{"navy", 0x000080}, {"oldlace", 0xfdf5e6}, {"olive", 0x808000},
{"olivedrab", 0x6b8e23}, {"orange", 0xffa500}, {"orangered", 0xff4500},
{"orchid", 0xda70d6}, {"palegoldenrod", 0xeee8aa}, {"palegreen", 0x98fb98},
{"paleturquoise", 0xafeeee}, {"palevioletred", 0xdb7093}, {"papayawhip", 0xffefd5},
{"peachpuff", 0xffdab9}, {"peru", 0xcd853f}, {"pink", 0xffc0cb},
{"plum", 0xdda0dd}, {"powderblue", 0xb0e0e6}, {"purple", 0x800080},
{"rebeccapurple", 0x663399}, {"red", 0xff0000}, {"rosybrown", 0xbc8f8f},
{"royalblue", 0x4169e1}, {"saddlebrown", 0x8b4513}, {"salmon", 0xfa8072},
{"sandybrown", 0xf4a460}, {"seagreen", 0x2e8b57}, {"seashell", 0xfff5ee},
{"sienna", 0xa0522d}, {"silver", 0xc0c0c0}, {"skyblue", 0x87ceeb},
{"slateblue", 0x6a5acd}, {"slategray", 0x708090}, {"snow", 0xfffafa},
{"springgreen", 0x00ff7f}, {"steelblue", 0x4682b4}, {"tan", 0xd2b48c},
{"teal", 0x008080}, {"thistle", 0xd8bfd8}, {"tomato", 0xff6347},
{"turquoise", 0x40e0d0}, {"violet", 0xee82ee}, {"wheat", 0xf5deb3},
{"white", 0xffffff}, {"whitesmoke", 0xf5f5f5}, {"yellow", 0xffff00},
{"yellowgreen", 0x9acd32},
};
static int color_name(const char *name, uint32_t *color)
{
for (size_t c = 0; c < ARRAY_SIZE(color_names); c++) {
if (!strcmp(name, color_names[c].n)) {
*color = color_names[c].c;
return 0;
}
}
return 1;
}
static int parse_color(struct color *c, const char *val)
{
uint32_t color = 0;
if (!strcmp(val, "default")) {
c->type = DEFAULT;
} else if (sscanf(val, "#%x", &color) == 1 && color <= 0xffffff) {
c->type = RGB;
c->rgb = color;
} else if (sscanf(val, "%u", &color) == 1 && color <= 256) {
c->type = PALETTE;
c->index = color;
} else if (!color_name(val, &color)) {
c->type = RGB;
c->rgb = color;
} else {
fprintf(stderr, "error: invalid color value '%s'\n", val);
return 1;
}
return 0;
}
static int parse_bool(bool *b, const char *val)
{
if (!strcmp(val, "true")) {
*b = true;
} else if (!strcmp(val, "false")) {
*b = false;
} else if (!strcmp(val, "toggle")) {
*b = !*b;
} else {
fprintf(stderr, "error: invalid bool value '%s'\n", val);
return 1;
}
return 0;
}
static int set_attr(struct style *s, const char *attr, const char *val)
{
if (!strcmp(attr, "fg")) {
if (parse_color(&s->fg, val))
return 1;
} else if (!strcmp(attr, "bg")) {
if (parse_color(&s->fg, val))
return 1;
} else if (!strcmp(attr, "bold")) {
if (parse_bool(&s->bold, val))
return 1;
} else if (!strcmp(attr, "blink")) {
if (parse_bool(&s->blink, val))
return 1;
} else if (!strcmp(attr, "underline")) {
if (parse_bool(&s->underline, val))
return 1;
} else if (!strcmp(attr, "reverse")) {
if (parse_bool(&s->reverse, val))
return 1;
} else if (!strcmp(attr, "italic")) {
if (parse_bool(&s->italic, val))
return 1;
} else if (!strcmp(attr, "dim")) {
if (parse_bool(&s->dim, val))
return 1;
} else if (!strcmp(attr, "normal")) {
s->bold = false;
s->underline = false;
s->reverse = false;
s->italic = false;
s->dim = false;
} else if (!strcmp(attr, "default")) {
s->fg.type = NONE;
s->fg.type = NONE;
} else {
fprintf(stderr, "error: invalid style attribute '%s'\n", attr);
return 1;
}
return 0;
}
static struct {const char *n; struct style *s;} ini_objects[] = {
{"url", &styles.url},
{"header", &styles.header},
{"signature", &styles.signature},
{"diff_meta", &styles.diff_meta},
{"diff_chunk", &styles.diff_chunk},
{"diff_chunk_func", &styles.diff_chunk_func},
{"diff_add", &styles.diff_add},
{"diff_del", &styles.diff_del},
{"quote_1", &styles.quote_1},
{"quote_2", &styles.quote_2},
{"quote_3", &styles.quote_3},
{"quote_4", &styles.quote_4},
{"quote_x", &styles.quote_x},
};
/* object attribute value */
#define STYLE_LINE_FORMAT "%127[0-9A-Za-z_-*?].%127[0-9a-zA-Z_-] = %127[#a-zA-Z0-9]s"
static int parse_styleset(void)
{
bool in_section = false;
char buf[BUFSIZ];
int err = 0;
FILE *f;
if (!styleset)
return 0;
f = fopen(styleset, "r");
if (!f) {
perror("error: failed to open styleset");
return 1;
}
while (fgets(buf, sizeof(buf), f)) {
/* strip LF, CR, CRLF, LFCR */
buf[strcspn(buf, "\r\n")] = '\0';
if (in_section) {
char obj[128], attr[128], val[128];
bool changed = false;
if (sscanf(buf, STYLE_LINE_FORMAT, obj, attr, val) != 3) {
if (buf[0] == '[') {
/* start of another section */
break;
}
continue;
}
for (size_t o = 0; o < ARRAY_SIZE(ini_objects); o++) {
if (fnmatch(obj, ini_objects[o].n, 0))
continue;
if (set_attr(ini_objects[o].s, attr, val)) {
err = 1;
goto end;
}
changed = true;
}
if (!changed) {
fprintf(stderr,
"error: unknown style object %s\n",
obj);
err = 1;
goto end;
}
} else if (!strcmp(buf, "[viewer]")) {
in_section = true;
}
}
end:
fclose(f);
return err;
}
static inline void print(const char *in)
{
fputs(in, stdout);
}
static inline size_t print_notabs(const char *in, size_t max_len)
{
size_t len = 0;
while (*in != '\0' && len < max_len) {
char c = *in++;
if (c == '\t') {
/* Tabs are interpreted as cursor movement and are not
* colored like regular characters. Replace them with
* 8 spaces. */
fputs(" ", stdout);
} else {
fputc(c, stdout);
}
len++;
}
return len;
}
static void print_osc8(const char *url, size_t len, size_t id, bool email) {
print("\x1b]8;");
if (url != NULL) {
printf("id=colorize-%lu;", id);
if (email) {
print("mailto://");
}
print_notabs(url, len);
} else {
/* do not print and url id for the terminator */
print(";");
}
print("\x1b\\");
}
static void diff_chunk(const char *in)
{
size_t len = 0;
print(seq(&styles.diff_chunk));
while (in[len] == '@')
len++;
while (in[len] != '\0' && in[len] != '@')
len++;
while (in[len] == '@')
len++;
in += print_notabs(in, len);
print(RESET);
print(seq(&styles.diff_chunk_func));
print_notabs(in, BUFSIZ);
print(RESET);
}
static inline bool isurichar(char c)
{
if (c == '\0')
return false;
if (isalnum(c))
return true;
if (strchr("-_.,~:;/?#@!$&%*+=\"'|<>()[]", c) != NULL)
return true;
return false;
}
#define URL_RE \
"([a-z]{2,8})://" \
"|(mailto:)?[[:alnum:]_+.~/-]*[[:alnum:]]@[[:alnum:]][[:alnum:].-]*[[:alnum:]]"
static regex_t url_re;
static void urls(const char *in, struct style *ctx)
{
/* ID of the next link to print for OSC 8. The purpose of passing
* explicit ID is to help terminal emulator with grouping of
* multi-line links in nested terminal sessions */
static size_t url_id = 0;
regmatch_t groups[3];
size_t len;
bool trim;
while (!regexec(&url_re, in, 3, groups, 0)) {
in += print_notabs(in, (size_t)groups[0].rm_so);
len = (size_t)groups[0].rm_eo - (size_t)groups[0].rm_so;
if (groups[1].rm_so != -1) {
/* Standard URL (i.e. not mailto: nor email address).
* Regular expressions do not really cut it here and
* we need to detect opening/closing braces to handle
* markdown link syntax. */
int paren = 0, bracket = 0, ltgt = 0;
bool emit_url = false;
size_t l = len;
while (!emit_url && isurichar(in[l])) {
switch (in[l]) {
case '[': bracket++; l++; break;
case '(': paren++; l++; break;
case '<': ltgt++; l++; break;
case ']':
if (--bracket < 0)
emit_url = true;
else
l++;
break;
case ')':
if (--paren < 0)
emit_url = true;
else
l++;
break;
case '>':
if (--ltgt < 0)
emit_url = true;
else
l++;
break;
default:
l++;
break;
}
}
/* Heuristic to remove trailing characters that are
* valid URL characters, but typically not at the end
* of the URL */
trim = true;
while (trim && l > len) {
switch (in[l - 1]) {
case '.': case ',': case ':':
case ';': case '?': case '!':
case '"': case '\'': case '%':
l--;
break;
default:
trim = false;
break;
}
}
if (l == len) {
/* only an URL protocol, do not colorize */
in += print_notabs(in, len);
continue;
}
len = l;
}
print(seq(&styles.url));
bool email = groups[2].rm_so == -1 && groups[1].rm_so == -1;
if (osc8_urls) {
print_osc8(in, len, url_id, email);
}
in += print_notabs(in, len);
if (osc8_urls) {
print_osc8(NULL, 0, url_id, email);
}
url_id++;
print(RESET);
if (ctx) {
print(seq(ctx));
}
}
print_notabs(in, BUFSIZ);
}
static inline void signature(const char *in)
{
print(seq(&styles.signature));
urls(in, &styles.signature);
print(RESET);
}
#define HEADER_RE "^[A-Z][[:alnum:]_-]+:"
static regex_t header_re;
static void header(const char *in)
{
regmatch_t groups[1];
if (!regexec(&header_re, in, 1, groups, 0)) {
print(seq(&styles.header));
in += print_notabs(in, (size_t)groups[0].rm_eo);
print(RESET);
}
urls(in, NULL);
}
#define DIFF_START_RE "^(diff (--git|-up|-u)|---) [[:graph:]]"
static regex_t diff_start_re;
#define DIFF_META_RE \
"^(diff (--git|-up|-u)|(new|deleted) file|similarity" \
" index|(rename|copy) (to|from)|index|---|\\+\\+\\+) "
static regex_t diff_meta_re;
static void quote(const char *in)
{
regmatch_t groups[8];
struct style *s;
size_t q, level;
q = level = 0;
while (in[q] == '>') {
level++;
q++;
if (in[q] == ' ')
q++;
}
switch (level) {
case 1:
s = &styles.quote_1;
break;
case 2:
s = &styles.quote_2;
break;
case 3:
s = &styles.quote_3;
break;
case 4:
s = &styles.quote_4;
break;
default:
s = &styles.quote_x;
break;
}
print(seq(s));
in += print_notabs(in, q);
if (startswith(in, "+")) {
printf("%s%s", RESET, seq(&styles.diff_add));
print_notabs(in, BUFSIZ);
} else if (startswith(in, "-")) {
printf("%s%s", RESET, seq(&styles.diff_del));
print_notabs(in, BUFSIZ);
} else if (!regexec(&diff_meta_re, in, 8, groups, 0)) {
print(BOLD);
print_notabs(in, BUFSIZ);
} else {
urls(in, s);
}
print(RESET);
}
static void print_style(const char *in, struct style *s)
{
print(seq(s));
print_notabs(in, BUFSIZ);
print(RESET);
}
enum state { INIT, DIFF, SIGNATURE, BODY };
static void colorize_line(const char *in)
{
static enum state state = INIT;
regmatch_t groups[8]; /* enough groups to cover all expressions */
switch (state) {
case DIFF:
if (!strcmp(in, "-- ")) {
state = SIGNATURE;
signature(in);
} else if (startswith(in, "@@ ")) {
diff_chunk(in);
} else if (!regexec(&diff_meta_re, in, 8, groups, 0)) {
print_style(in, &styles.diff_meta);
} else if (startswith(in, "+")) {
print_style(in, &styles.diff_add);
} else if (startswith(in, "-")) {
print_style(in, &styles.diff_del);
} else if (!startswith(in, " ") && strcmp(in, "") != 0) {
state = BODY;
if (startswith(in, ">")) {
quote(in);
} else {
urls(in, NULL);
}
} else {
print_notabs(in, BUFSIZ);
}
break;
case SIGNATURE:
signature(in);
break;
default: /* BODY, INIT */
if (!regexec(&diff_start_re, in, 8, groups, 0)) {
state = DIFF;
print_style(in, &styles.diff_meta);
} else if (!strcmp(in, "-- ")) {
state = SIGNATURE;
signature(in);
} else {
state = BODY;
if (startswith(in, ">")) {
quote(in);
} else if (!regexec(&header_re, in, 8, groups, 0)) {
header(in);
} else {
urls(in, NULL);
}
}
break;
}
}
static int parse_args(int argc, char **argv)
{
const char *filename = NULL, *osc8 = NULL;
int c;
styleset = getenv("AERC_STYLESET");
osc8 = getenv("AERC_OSC8_URLS");
while ((c = getopt(argc, argv, "h8s:f:")) != -1) {
switch (c) {
case '8':
osc8 = "1";
break;
case 's':
styleset = optarg;
break;
case 'f':
filename = optarg;
break;
default:
usage();
return 1;
}
}
if (optind < argc) {
fprintf(stderr, "%s: unexpected argument -- '%s'\n",
argv[0], argv[optind]);
usage();
return 1;
}
if (filename == NULL || !strcmp(filename, "-")) {
in_file = stdin;
} else {
in_file = fopen(filename, "r");
if (!in_file) {
perror("error: cannot open file");
return 1;
}
}
osc8_urls = osc8 != NULL;
return 0;
}
int main(int argc, char **argv)
{
char buf[BUFSIZ];
int err;
regcomp(&header_re, HEADER_RE, REG_EXTENDED);
regcomp(&diff_start_re, DIFF_START_RE, REG_EXTENDED);
regcomp(&diff_meta_re, DIFF_META_RE, REG_EXTENDED);
regcomp(&url_re, URL_RE, REG_EXTENDED);
err = parse_args(argc, argv);
if (err) {
goto end;
}
err = parse_styleset();
if (err) {
goto end;
}
while (fgets(buf, sizeof(buf), in_file)) {
/* strip LF, CR, CRLF, LFCR */
buf[strcspn(buf, "\r\n")] = '\0';
colorize_line(buf);
printf("\n");
}
end:
if (in_file) {
fclose(in_file);
}
return err;
}
Executable
+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/awk -f
BEGIN {
bright = "\x1B[1m"
red = "\x1B[31m"
green = "\x1B[32m"
cyan = "\x1B[36m"
reset = "\x1B[0m"
hit_diff = 0
}
{
if (hit_diff == 0) {
# Strip carriage returns from line
gsub(/\r/, "", $0)
if ($0 ~ /^diff /) {
hit_diff = 1;
print bright $0 reset
} else if ($0 ~ /^.*\|.*(\+|-)/) {
left = substr($0, 0, index($0, "|")-1)
right = substr($0, index($0, "|"))
gsub(/-+/, red "&" reset, right)
gsub(/\++/, green "&" reset, right)
print left right
} else {
print $0
}
} else {
# Strip carriage returns from line
gsub(/\r/, "", $0)
if ($0 ~ /^-/) {
print red $0 reset
} else if ($0 ~ /^\+/) {
print green $0 reset
} else if ($0 ~ /^ /) {
print $0
} else if ($0 ~ /^@@ (-[0-9]+,[0-9]+ \+[0-9]+,[0-9]+) @@.*/) {
sub(/^@@ (-[0-9]+,[0-9]+ \+[0-9]+,[0-9]+) @@/, cyan "&" reset)
print $0
} else {
print bright $0 reset
}
}
}
Executable
+53
View File
@@ -0,0 +1,53 @@
#!/bin/sh
# aerc filter to view HTML emails with w3m.
#
# Networking access will be disabled unless the script is named 'html-unsafe'.
#
# If stdout is connected to a TTY, the interactive pager of w3m will be enabled.
set -- w3m \
-I UTF-8 -O UTF-8 -T text/html \
-s -graph \
-o fold_textarea=true \
-o fold_line=true \
-o decode_url=true \
-o display_link=true \
"$@"
if [ -t 1 ]; then
# stdout is connected to a terminal, enable interactive mode
set -- "$@" -o display_borders=true
if w3m --help 2>&1 | head -n1 | grep -q "options.*image"; then
# display inline images if support is enabled
set -- "$@" -o display_image=true -o auto_image=true
fi
else
# stdout is connected to a pager, dump output without interaction
set -- "$@" -cols 100 -dump -o disable_center=true
fi
if ! [ "$(basename $0)" = "html-unsafe" ]; then
# attempt network isolation to prevent any phoning home by rendered emails
set -- "$@" -o no_cache=true -o use_cookie=false
if command -v unshare >/dev/null 2>&1; then
# run the command in a separate network namespace
set -- unshare --map-root-user --net "$@"
elif command -v socksify >/dev/null 2>&1; then
# if socksify (from dante-utils) is available, use it
export SOCKS_SERVER="127.0.0.1:1"
set -- socksify "$@"
else
# best effort, use an invalid address as http proxy
set -- "$@" \
-o use_proxy=true \
-o http_proxy='127.0.0.1:1' \
-o https_proxy='127.0.0.1:1' \
-o gopher_proxy='127.0.0.1:1' \
-o ftp_proxy='127.0.0.1:1'
fi
fi
exec "$@"
+1
View File
@@ -0,0 +1 @@
html
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/awk -f
BEGIN {
dim = "\033[2m"
cyan = "\033[36m"
reset = "\033[0m"
}
{
# Strip carriage returns from line
gsub(/\r/, "", $0)
if ($0 ~ /^On .*, .* wrote:/ || $0 ~ /^>+/) {
print dim cyan $0 reset
} else {
print $0
}
}
+89
View File
@@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""Parse a vcard file given via stdin and output some details.
Currently the following details are displayed if present:
- start date and time
- the summary information of the event
- a list of attendees
- the description of the event
Please note: if multiple events are included in the data then only the
first one will be parsed and displayed!
REQUIREMENTS:
- Python 3
- Python 3 - vobject library
To use as a filter in aerc, add the following line to your aerc.config:
text/calendar=show-ics-details.py
"""
import re
import sys
import vobject
def remove_mailto(message: str) -> str:
"""Remove a possible existing 'mailto:' from the given message.
Keyword arguments:
message -- A message string.
"""
return re.sub(r'^mailto:', '', message, flags=re.IGNORECASE)
def extract_field(cal: vobject.icalendar.VCalendar2_0, name: str) -> str:
"""Extract the desired field from the given calendar object.
Keyword arguments:
cal -- A VCalendar 2.0 object.
name -- The field name.
"""
try:
name = name.strip()
if name == 'attendees':
attendees = []
for attendee in cal.vevent.attendee_list:
attendees.append(remove_mailto(attendee.valueRepr()).strip())
return ', '.join(attendees)
elif name == 'description':
return cal.vevent.description.valueRepr().strip()
elif name == 'dtstart':
return str(cal.vevent.dtstart.valueRepr()).strip()
elif name == 'organizer':
return remove_mailto(cal.vevent.organizer.valueRepr()).strip()
elif name == 'summary':
return cal.vevent.summary.valueRepr().strip()
else:
return ''
except AttributeError:
return ''
attendees = ''
description = ''
dtstart = ''
error = ''
organizer = ''
summary = ''
try:
cal = vobject.readOne(sys.stdin)
attendees = extract_field(cal, 'attendees')
description = extract_field(cal, 'description')
dtstart = extract_field(cal, 'dtstart')
organizer = extract_field(cal, 'organizer')
summary = extract_field(cal, 'summary')
except vobject.base.ParseError:
error = '**Sorry, but we could not parse the calendar!**'
if error:
print(error)
print("")
print(f"Date/Time : {dtstart}")
print(f"Summary : {summary}")
print(f"Organizer : {organizer}")
print(f"Attendees : {attendees}")
print("")
print(description)
+79
View File
@@ -0,0 +1,79 @@
#!/bin/sh
set -e
here=$(dirname $0)
fail=0
style=$(mktemp)
trap "rm -f $style" EXIT
cat >$style <<EOF
# stuff
url.fg = red
[viewer]
*.normal=true
*.default=true
url.underline = true # cxwlkj
header.bold= true # comment
signature.dim=true
diff_meta.bold =true
diff_chunk.dim= true
invalid . xxx = lkjfdslkjfdsqqqqqlkjdsq
diff_add.fg= #00ff00 # comment
# comment
diff_del.fg= 1 # comment2
quote_*.fg =6
quote_*.dim=true
quote_1.dim=false
[user]
foo = bar
EOF
export AERC_STYLESET=$style
export AERC_OSC8_URLS=1
do_test() {
prefix="$1"
tool_bin="$2"
tool="$3"
vec="$4"
expected="$5"
tmp=$(mktemp)
status=0
$prefix $tool_bin < $vec > $tmp || status=$?
if [ $status -eq 0 ] && diff -u "$expected" "$tmp"; then
echo "ok $tool < $vec > $tmp"
else
echo "error $tool < $vec > $tmp [status=$status]"
fail=1
fi
rm -f -- "$tmp"
}
for vec in $here/vectors/*.in; do
expected=${vec%%.in}.expected
tool=$(basename $vec | sed 's/-.*//')
tool_bin=$here/../$tool
prefix="$FILTERS_TEST_PREFIX $FILTERS_TEST_BIN_PREFIX"
# execute source directly (and omit $...BIN_PREFIX) for interpreted filters
if ! [ -f "$tool_bin" ]; then
tool_bin=$here/$tool
prefix="$FILTERS_TEST_PREFIX"
fi
do_test "$prefix" "$tool_bin" "$tool" "$vec" "$expected"
case $tool in # additional test runs
calendar) # Awk
if awk -W posix -- '' >/dev/null 2>&1; then
# test POSIX-compatibility
do_test "$prefix" "awk -W posix -f $tool_bin" \
"$tool (posix)" "$vec" "$expected"
else # "-W posix" is not supported and not ignored, skip test
echo "? $tool < $vec > $tmp [no '-W posix' support]"
fi
;;
esac
done
exit $fail
+11
View File
@@ -0,0 +1,11 @@
This is a meeting PUBLISH
SUMMARY Test Event
START 2000/01/01 12:30:00
END 2999/12/31 32:30:00
LOCATION Some Location
ORGANIZER <invalid@example.org>
A description.
With multiple lines.
+15
View File
@@ -0,0 +1,15 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DESCRIPTION:A description.\nWith multiple lines.
DTEND:29991231T323000Z
DTSTAMP:19990101T000000Z
DTSTART:20000101T123000Z
LOCATION:Some Location
ORGANIZER:MAILTO:invalid@example.org
SUMMARY:Test Event
END:VEVENT
END:VCALENDAR
@@ -0,0 +1,31 @@
Simple diff updating optipng to 0.7.8
Previous versions suffered from a buffer overflow in the GIF
decoder.
diff /usr/ports
commit - 4757bf975713417bec00c44757c02a21c3b6b956
path + /usr/ports
blob - 0d3b98856492b3535664e4900d1b5582f41e6b7b
file + graphics/optipng/Makefile
--- graphics/optipng/Makefile
+++ graphics/optipng/Makefile
@@ -1,7 +1,6 @@
COMMENT = lossless PNG optimizer
-DISTNAME = optipng-0.7.7
+DISTNAME = optipng-0.7.8
CATEGORIES = graphics
-REVISION = 1
HOMEPAGE = https://optipng.sourceforge.net/
blob - 34f525b3d1ea7b210ee34d1b94c98bd76c30d01f
file + graphics/optipng/distinfo
--- graphics/optipng/distinfo
+++ graphics/optipng/distinfo
@@ -1,2 +1,2 @@
-SHA256 (optipng-0.7.7.tar.gz) = TzLyM874cLP5XTrWQov+QiTvNJCPG0Kwut+FghZlRFI=
-SIZE (optipng-0.7.7.tar.gz) = 2329555
+SHA256 (optipng-0.7.8.tar.gz) = JaO9aEgfIVAsyqD0wT+E3PayAzjkxOjFHyzvvYUTOYw=
+SIZE (optipng-0.7.8.tar.gz) = 3294014
+31
View File
@@ -0,0 +1,31 @@
Simple diff updating optipng to 0.7.8
Previous versions suffered from a buffer overflow in the GIF
decoder.
diff /usr/ports
commit - 4757bf975713417bec00c44757c02a21c3b6b956
path + /usr/ports
blob - 0d3b98856492b3535664e4900d1b5582f41e6b7b
file + graphics/optipng/Makefile
--- graphics/optipng/Makefile
+++ graphics/optipng/Makefile
@@ -1,7 +1,6 @@
COMMENT = lossless PNG optimizer
-DISTNAME = optipng-0.7.7
+DISTNAME = optipng-0.7.8
CATEGORIES = graphics
-REVISION = 1
HOMEPAGE = https://optipng.sourceforge.net/
blob - 34f525b3d1ea7b210ee34d1b94c98bd76c30d01f
file + graphics/optipng/distinfo
--- graphics/optipng/distinfo
+++ graphics/optipng/distinfo
@@ -1,2 +1,2 @@
-SHA256 (optipng-0.7.7.tar.gz) = TzLyM874cLP5XTrWQov+QiTvNJCPG0Kwut+FghZlRFI=
-SIZE (optipng-0.7.7.tar.gz) = 2329555
+SHA256 (optipng-0.7.8.tar.gz) = JaO9aEgfIVAsyqD0wT+E3PayAzjkxOjFHyzvvYUTOYw=
+SIZE (optipng-0.7.8.tar.gz) = 3294014
@@ -0,0 +1,74 @@
On Mon, Nov 13 2023, Jeremie Courreges-Anglas <]8;id=colorize-0;mailto://jca@wxcvbn.org\jca@wxcvbn.org]8;;\> wrote:
> We need to disable optimization for python3 ports. Even with a fixed
> path to libclang_rt.profile.etc, I get:
>
> ld.lld: error: relocation R_X86_64_PC32 cannot be used against symbol '__profd_isdigit'; recompile with -fPIC
>
> ok?
The previous diff had an obvious issue spotted by ajacoutot@, thanks!
Index: Makefile.inc
===================================================================
RCS file: /home/cvs/ports/lang/python/Makefile.inc,v
diff -u -p -r1.159 Makefile.inc
--- Makefile.inc 26 Sep 2023 12:02:03 -0000 1.159
+++ Makefile.inc 13 Nov 2023 16:11:40 -0000
@@ -130,7 +130,9 @@ CONFIGURE_ARGS += --with-lto
. if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "powerpc"
# On armv7, clang errors out due to lack of memory.
# On powerpc, the python binary would crash by "Segmentation fault".
-CONFIGURE_ARGS += --enable-optimizations
+# XXX lld from llvm-16 errors out with:
+# ld.lld: error: relocation R_X86_64_PC32 cannot be used against symbol '__profd_isdigit'; recompile with -fPIC
+#CONFIGURE_ARGS += --enable-optimizations
. endif
. endif
TEST_IS_INTERACTIVE = Yes
Index: 3.10/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.10/Makefile,v
diff -u -p -r1.36 Makefile
--- 3.10/Makefile 1 Sep 2023 18:48:06 -0000 1.36
+++ 3.10/Makefile 13 Nov 2023 15:53:49 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.10.13
+REVISION = 0
SHARED_LIBS = python3.10 0.0
VERSION_SPEC = >=3.10,<3.11
PORTROACH = limit:^3\.10
Index: 3.11/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.11/Makefile,v
diff -u -p -r1.12 Makefile
--- 3.11/Makefile 20 Oct 2023 09:18:48 -0000 1.12
+++ 3.11/Makefile 13 Nov 2023 15:54:05 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.11.6
+REVISION = 0
SHARED_LIBS = python3.11 0.0
VERSION_SPEC = >=3.11,<3.12
PORTROACH = limit:^3\.11
Index: 3.9/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.9/Makefile,v
diff -u -p -r1.42 Makefile
--- 3.9/Makefile 1 Sep 2023 18:50:44 -0000 1.42
+++ 3.9/Makefile 13 Nov 2023 15:53:58 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.9.18
+REVISION = 0
SHARED_LIBS = python3.9 0.0
VERSION_SPEC = >=3.9,<3.10
PORTROACH = limit:^3\.9
-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
+74
View File
@@ -0,0 +1,74 @@
On Mon, Nov 13 2023, Jeremie Courreges-Anglas <jca@wxcvbn.org> wrote:
> We need to disable optimization for python3 ports. Even with a fixed
> path to libclang_rt.profile.etc, I get:
>
> ld.lld: error: relocation R_X86_64_PC32 cannot be used against symbol '__profd_isdigit'; recompile with -fPIC
>
> ok?
The previous diff had an obvious issue spotted by ajacoutot@, thanks!
Index: Makefile.inc
===================================================================
RCS file: /home/cvs/ports/lang/python/Makefile.inc,v
diff -u -p -r1.159 Makefile.inc
--- Makefile.inc 26 Sep 2023 12:02:03 -0000 1.159
+++ Makefile.inc 13 Nov 2023 16:11:40 -0000
@@ -130,7 +130,9 @@ CONFIGURE_ARGS += --with-lto
. if ${MACHINE_ARCH} != "arm" && ${MACHINE_ARCH} != "powerpc"
# On armv7, clang errors out due to lack of memory.
# On powerpc, the python binary would crash by "Segmentation fault".
-CONFIGURE_ARGS += --enable-optimizations
+# XXX lld from llvm-16 errors out with:
+# ld.lld: error: relocation R_X86_64_PC32 cannot be used against symbol '__profd_isdigit'; recompile with -fPIC
+#CONFIGURE_ARGS += --enable-optimizations
. endif
. endif
TEST_IS_INTERACTIVE = Yes
Index: 3.10/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.10/Makefile,v
diff -u -p -r1.36 Makefile
--- 3.10/Makefile 1 Sep 2023 18:48:06 -0000 1.36
+++ 3.10/Makefile 13 Nov 2023 15:53:49 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.10.13
+REVISION = 0
SHARED_LIBS = python3.10 0.0
VERSION_SPEC = >=3.10,<3.11
PORTROACH = limit:^3\.10
Index: 3.11/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.11/Makefile,v
diff -u -p -r1.12 Makefile
--- 3.11/Makefile 20 Oct 2023 09:18:48 -0000 1.12
+++ 3.11/Makefile 13 Nov 2023 15:54:05 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.11.6
+REVISION = 0
SHARED_LIBS = python3.11 0.0
VERSION_SPEC = >=3.11,<3.12
PORTROACH = limit:^3\.11
Index: 3.9/Makefile
===================================================================
RCS file: /home/cvs/ports/lang/python/3.9/Makefile,v
diff -u -p -r1.42 Makefile
--- 3.9/Makefile 1 Sep 2023 18:50:44 -0000 1.42
+++ 3.9/Makefile 13 Nov 2023 15:53:58 -0000
@@ -4,6 +4,7 @@
# Python itself.
FULL_VERSION = 3.9.18
+REVISION = 0
SHARED_LIBS = python3.9 0.0
VERSION_SPEC = >=3.9,<3.10
PORTROACH = limit:^3\.9
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
+49
View File
@@ -0,0 +1,49 @@
From: Robin Jarry <]8;id=colorize-0;mailto://robin@jarry.cc\robin@jarry.cc]8;;\>
Date: Mon, 26 Dec 2022 17:02:14 +0100
Subject: [PATCH aerc] doc: fix numbered lists
According to scdoc(5), numbered lists start with a period.
Fixes: af63bd0188d1 ("doc: homogenize scdoc markup")
Signed-off-by: Robin Jarry <]8;id=colorize-1;mailto://robin@jarry.cc\robin@jarry.cc]8;;\>
---
doc/aerc-stylesets.7.scd | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/doc/aerc-stylesets.7.scd b/doc/aerc-stylesets.7.scd
index d82ba7cf8163..34bbf4af0fc5 100644
--- a/doc/aerc-stylesets.7.scd
+++ b/doc/aerc-stylesets.7.scd
@@ -180,20 +180,20 @@ that style applies, unless overridden by a higher layer.
The order that *msglist_\** styles are applied in is, from first to last:
-1. *msglist_default*
-2. *msglist_unread*
-3. *msglist_read*
-4. *msglist_flagged*
-5. *msglist_deleted*
-6. *msglist_marked*
+. *msglist_default*
+. *msglist_unread*
+. *msglist_read*
+. *msglist_flagged*
+. *msglist_deleted*
+. *msglist_marked*
So, the marked style will override all other msglist styles.
The order for *dirlist_\** styles is:
-1. *dirlist_default*
-2. *dirlist_unread*
-3. *dirlist_recent*
+. *dirlist_default*
+. *dirlist_unread*
+. *dirlist_recent*
## COLORS
-- 
2.39.0

+49
View File
@@ -0,0 +1,49 @@
From: Robin Jarry <robin@jarry.cc>
Date: Mon, 26 Dec 2022 17:02:14 +0100
Subject: [PATCH aerc] doc: fix numbered lists
According to scdoc(5), numbered lists start with a period.
Fixes: af63bd0188d1 ("doc: homogenize scdoc markup")
Signed-off-by: Robin Jarry <robin@jarry.cc>
---
doc/aerc-stylesets.7.scd | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/doc/aerc-stylesets.7.scd b/doc/aerc-stylesets.7.scd
index d82ba7cf8163..34bbf4af0fc5 100644
--- a/doc/aerc-stylesets.7.scd
+++ b/doc/aerc-stylesets.7.scd
@@ -180,20 +180,20 @@ that style applies, unless overridden by a higher layer.
The order that *msglist_\** styles are applied in is, from first to last:
-1. *msglist_default*
-2. *msglist_unread*
-3. *msglist_read*
-4. *msglist_flagged*
-5. *msglist_deleted*
-6. *msglist_marked*
+. *msglist_default*
+. *msglist_unread*
+. *msglist_read*
+. *msglist_flagged*
+. *msglist_deleted*
+. *msglist_marked*
So, the marked style will override all other msglist styles.
The order for *dirlist_\** styles is:
-1. *dirlist_default*
-2. *dirlist_unread*
-3. *dirlist_recent*
+. *dirlist_default*
+. *dirlist_unread*
+. *dirlist_recent*
## COLORS
--
2.39.0
+65
View File
@@ -0,0 +1,65 @@
Foo Bar, xxxxx:
> Lorem ipsum dolor sit amet, insolens adolescens ne usu? In pri denique
> argumentum, te autem decore convenire mea! Duo nisl esse an, aliquid
> conceptam sea cu. Ignota copiosae gubergren ad est, ut illum doming vocibus
> sed. Et vis nulla expetendis mediocritatem, errem option gloriatur at nam?
> Brute vidisse corpora ut his, sonet omnesque adipiscing ea quo, cum ea errem
> aliquip reformidans?
Magna delicatissimi ei vel? Quem petentium scribentur eum ne? Et inani debet
cetero mea, sint conceptam efficiendi mel te. Qui ut senserit interesset, per
nibh petentium at! Sit docendi laboramus ei, animal insolens ad mea.
>> Nostrud alienum nec in, illum errem audiam no per! Saepe alterum vis ea! Ei
>> quis minim ius, ut eos mandamus salutandi. Lorem facilisis in nam, ridens
>> principes sadipscing et eum, pri graecis singulis ut. Mea dolor primis
>> impetus in, his epicurei tacimates id, vis labitur suscipit ad.
> Erat alienum interpretaris has et, te vim aliquam molestie. Nam vivendum
> facilisis qualisque at, ex his mucius qualisque! Fabulas lucilius adversarium
> eu his. Cu soluta inermis accusata usu, his nulla dolore ne, vis id semper
> detracto sententia <]8;id=colorize-0;https://foobar.com\https://foobar.com]8;;\> && "]8;id=colorize-1;https://foobaz.org/\https://foobaz.org/]8;;\".
>
> Error libris deleniti ea mei, vis at elit probo munere, his sint unum
> albucius ex. []8;id=colorize-2;https://pouet.com/oksuper\https://pouet.com/oksuper]8;;\](]8;id=colorize-3;https://pouet.com/oksuper\https://pouet.com/oksuper]8;;\).
Graece definiebas scripserit ne est? Nec nonumes explicari contentiones ne,
vocent iuvaret placerat no vix. Nec et partem salutandi deseruisse, his no
possim malorum pericula. Te quando reprehendunt nam, at consul sadipscing vel?
Velit possim aliquando ei per, ne simul quodsi antiopam sea, ullum choro
facilisi et pri http:// or https://!
> Dico soleat partem ea pro, ad vix impetus splendide. Primis melius principes
> pri ad, tacimates pertinacia ei pro? Appareat atomorum oportere at nam, eu
> per quod minim reprimique, ornatus graecis ad vel. Malis vulputate ea qui,
> eum tacimates recteque et, usu ea dolore vidisse. Brute mediocrem molestiae
> sed te. No stet prompta pri, rebum populo nominati eos te.
>
> diff --git a/foo b/foo
> index 4b0fe8dded3a..518b67134639 100644
> --- a/foo
> +++ b/foo
> @@ -131,6 +131,83 @@ func pouet() int {
> err := doThis()
> 
> - err2 := doThat()
> + err2 := notDoThat()
> 
> if err != nil || err2 != nil {
Id vix referrentur philosophia, veri labores an nec. Noster denique no duo, sit
ei diam inermis vocibus! Mutat principes ex pro, at ]8;id=colorize-4;mailto://~rjarry/aerc-devel@lists.sr.ht\~rjarry/aerc-devel@lists.sr.ht]8;;\.
Has putent verterem constituto ex, tale electram duo at! Ei nulla lucilius
intellegat nam, pro quod epicuri dissentiet ut, omnis voluptatibus definitiones
vim at []8;id=colorize-5;irc://foo.bar\irc://foo.bar]8;;\] <]8;id=colorize-6;mailto://jeanpierre@foobaz.org\jeanpierre@foobaz.org]8;;\>.
]8;id=colorize-7;https://git-man-page-generator.lokaltog.net/#Y2xhcCQkY29tbWFuZA==\https://git-man-page-generator.lokaltog.net/#Y2xhcCQkY29tbWFuZA==]8;;\
Eam mundi libris debitis ad, eam regione numquam at. Eum omnes bonorum eu,
oporteat assueverit disputationi nam ne, nonumes iracundia mea ad! Duo libris
recusabo id, ceteros salutatus inciderint vim ea. Et graeco reformidans vel? Ei
has labore quidam ]8;id=colorize-8;https://foobaz.com/ooo<uuuu>okf\https://foobaz.com/ooo<uuuu>okf]8;;\?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sympa, non?
-- 
Batman
+65
View File
@@ -0,0 +1,65 @@
Foo Bar, xxxxx:
> Lorem ipsum dolor sit amet, insolens adolescens ne usu? In pri denique
> argumentum, te autem decore convenire mea! Duo nisl esse an, aliquid
> conceptam sea cu. Ignota copiosae gubergren ad est, ut illum doming vocibus
> sed. Et vis nulla expetendis mediocritatem, errem option gloriatur at nam?
> Brute vidisse corpora ut his, sonet omnesque adipiscing ea quo, cum ea errem
> aliquip reformidans?
Magna delicatissimi ei vel? Quem petentium scribentur eum ne? Et inani debet
cetero mea, sint conceptam efficiendi mel te. Qui ut senserit interesset, per
nibh petentium at! Sit docendi laboramus ei, animal insolens ad mea.
>> Nostrud alienum nec in, illum errem audiam no per! Saepe alterum vis ea! Ei
>> quis minim ius, ut eos mandamus salutandi. Lorem facilisis in nam, ridens
>> principes sadipscing et eum, pri graecis singulis ut. Mea dolor primis
>> impetus in, his epicurei tacimates id, vis labitur suscipit ad.
> Erat alienum interpretaris has et, te vim aliquam molestie. Nam vivendum
> facilisis qualisque at, ex his mucius qualisque! Fabulas lucilius adversarium
> eu his. Cu soluta inermis accusata usu, his nulla dolore ne, vis id semper
> detracto sententia <https://foobar.com> && "https://foobaz.org/".
>
> Error libris deleniti ea mei, vis at elit probo munere, his sint unum
> albucius ex. [https://pouet.com/oksuper](https://pouet.com/oksuper).
Graece definiebas scripserit ne est? Nec nonumes explicari contentiones ne,
vocent iuvaret placerat no vix. Nec et partem salutandi deseruisse, his no
possim malorum pericula. Te quando reprehendunt nam, at consul sadipscing vel?
Velit possim aliquando ei per, ne simul quodsi antiopam sea, ullum choro
facilisi et pri http:// or https://!
> Dico soleat partem ea pro, ad vix impetus splendide. Primis melius principes
> pri ad, tacimates pertinacia ei pro? Appareat atomorum oportere at nam, eu
> per quod minim reprimique, ornatus graecis ad vel. Malis vulputate ea qui,
> eum tacimates recteque et, usu ea dolore vidisse. Brute mediocrem molestiae
> sed te. No stet prompta pri, rebum populo nominati eos te.
>
> diff --git a/foo b/foo
> index 4b0fe8dded3a..518b67134639 100644
> --- a/foo
> +++ b/foo
> @@ -131,6 +131,83 @@ func pouet() int {
> err := doThis()
>
> - err2 := doThat()
> + err2 := notDoThat()
>
> if err != nil || err2 != nil {
Id vix referrentur philosophia, veri labores an nec. Noster denique no duo, sit
ei diam inermis vocibus! Mutat principes ex pro, at ~rjarry/aerc-devel@lists.sr.ht.
Has putent verterem constituto ex, tale electram duo at! Ei nulla lucilius
intellegat nam, pro quod epicuri dissentiet ut, omnis voluptatibus definitiones
vim at [irc://foo.bar] <jeanpierre@foobaz.org>.
https://git-man-page-generator.lokaltog.net/#Y2xhcCQkY29tbWFuZA==
Eam mundi libris debitis ad, eam regione numquam at. Eum omnes bonorum eu,
oporteat assueverit disputationi nam ne, nonumes iracundia mea ad! Duo libris
recusabo id, ceteros salutatus inciderint vim ea. Et graeco reformidans vel? Ei
has labore quidam https://foobaz.com/ooo<uuuu>okf?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sympa, non?
--
Batman
+1
View File
@@ -0,0 +1 @@
wrap-asciiart.in
+31
View File
@@ -0,0 +1,31 @@
# A guide to understanding flow charts (presented in flow chart form)
+-----+
|START|
+-----+
|
________v________
/ \ +-----+
/ DO YOU UNDERSTAND \--------------------------------------------->|GOOD!|----------+
\ FLOW CHARTS? /yes +-----+ v
\_________________/ ^ +--------------+ 6 drinks +-------------------+
|no | |LET'S GO DRINK|------------->|HEY, I SHOULD TRY |
_________v_________ ______________________ | +--------------+ |INSTALLING FREEBSD!|
/ \ / \ | ^ +-------------------+
/ OKAY, YOU SEE THE \------------------>/ ... AND YOU CAN SEE \---+ |
\ LINE LABELED "YES"? /yes \ THE ONES LABELED "NO"? /yes +--------+
\___________________/ \______________________/ |SCREW IT|
|no |no +--------+
| | ^
________v_________ _________v__________ |
/ \ +-----------+ / \ +------------+
/ BUT YOU SEE THE \-->|WAIT, WHAT?| / BUT YOU JUST \------------|(THAT WASN'T|
\ ONES LABELED "NO"? /yes+-----------+ \ FOLLOWED THEM TWICE! /yes |A QUESTION) |
\__________________/ \____________________/ +------------+
|no |no ^
v | |
+-------+ +----------+ | |
|LISTEN.|--------->|I HATE YOU| +------------------------------+
+-------+ +----------+
Source: https://xkcd.com/518/
+75
View File
@@ -0,0 +1,75 @@
# Chinese
涾一祄琌幄睟亍瑳褭冘,蚳乜枲挻媗楪乇酳冘仡。毰侘癿澺搥諨厊一釽埸貣侗夯昺丌,筥
跐亍阽疪暔芫氿乇邳嵺苵殳刳。紬一炰郴啿蓱亍銍瑿毌,脧乜俉舲棬罧屮碞冇汃。殳珨攽
祪陎齵僆裞扠尥畇妧矻杶芏瑗屮抰廑嫊。罣一洒剫鈂搣丌餈蹅圠,絇乜苭梇睌痯乇獃气
仚。琇一峓趹絟痯丌慱懌夬,聇乇羍耛堙祽亍瑱冇圣。釽炖灱鴞飶橝邗一絘珴彧呥仩峛
乇,嗂揤兀泲垛嗒侇汃亍沭鉽毘仈姈。舺一柼婐喑媐乜漮蕣丱,蚹兀玵窔棤跬丌蒔丮庂。
夬珓芶婤迠靃萰輈匢朳姷妡泆坨忻鈱乇沴瞁翜。丏茯炓笵苹靃瑒窣囡囡胘甹厒竻汦壾兀拊
箤雸。夬栴刲烸垌鑫粲綍仵汔胍尪怓枟佁搹丌帔摓椴。惔一帡梜淼蒍乜嵼懁尐,崞乇虼軗
鈚頍屮髧殳卌。厹迼岪孲茌瓥旓惷艸厊郕巠怓昃伻艀亍欥跿楪。挻一峊娹晪誄兀銆濏仂,
軜屮昦捵棝幋屮搿尐尕。郴一羑牾睄趓屮蒝徻亓,剭丌怷祩硤酯丌鉺卬帄。
夃垸弢莗枹蠷僉椴扥阣胇玔抪岟杍稗兀泂蓒媐。雂怮吇謔詵鋾扡一蛬焐浰妽尻狪亍,赨鈀
丌欥赲蜎屇阞丌芛獑罘冇芧。庴一茇紬鈏溦乇漭錉冘,梪兀秖軜湱僉乜鄣殳氻。掾沝仵螛
塣螇艼一觝衒脁屇宁庛乇,朠棔兀屇挍搷咂仚亍怭馺俍卬岠。冘舯枎翋怹鸂雎祹朾朻耎肒
泀狖帊萿亍呯榡搧。絓芩朿褢楩瘼妅一揘崚桏厒屴俬乜,摁嵫乜怬娀廆姁氶乇抶蓗柲丮
芼。袼一虴梮喵搨乜蜑廦丱,紨丌枲翊傔葑亍漊气圣。剫一耏烸蛪鈳亍膇鋻旡,酕丌柣啒
晲裬乜緄仉屴。渃泆妅嶵酨叡玎一罥桷捊劼汃癹乇,煐厤亍泝籺萻咍仚兀矼墔柧尐抾。
偢一苲猞敪窣乜漊憴尐,眥兀屌笰湒楢兀槊巿氶。旡秝盰絅笁鼞楜雺虍阢垌犿昈姎抌壼乜
矼褙蛖。厹茦皯唲釓鸂瘃暊阠扡咠忨妺沷佖閟丌肏睾睒。跁一茌掑褁摀亍輎閾巿,紻丌柜
崌蛝雎乜慺厹夯。氪一罘粣湒僁兀嫛踼爿,脕亍羑翊羡犐兀戩勼扐。蛅一庢粣缾艅乜嶀篣
仈,秶乜紃荾埵寖乇戩丮圣。仉罜怢庴氠齵巰輆刐庄宬岒盰矷灴葝丌昍綩銢。冇倎侚捥柼
瓛貄媱厊艼柎卣弣芠玗楈乜抭蜺嗊。
# Japanese
応ルモユム格分ぎっ中側な例披ロオソリ盛申みこへ教更反トホ写3録47男ソ朝開ク中
属ノ速法む米指ふさりこ考震フ明訟ばだ著敢渓窮胡よ。予ムヒト選技32浴ぜが子円もみ
歳旅せてうけ実石ミサアト未9首放レミ募権大ん同市体づイえず業歯そつ情道タネモ回
着ぞあイい本要イ肉見線館そむふ。
死まこリば治9高詳かすぼク精報今ヒユエ水87学ニミナ急望とげがか芸会どげ原
員カリミ信絶ホネワシ奪己あうは般裁午ハ招候森嘉ほ。決リぞ初定物るべ橋投レげ料
代ひまわト員野トイるゅ表高んをご付検モ健棋ッよ情作ヘサラ本代ヘシタソ毎
権びつずぱ続碁約ヤオマカ破見ヱ暮私フ住18逃見ゅは。変む記78実落ご破府ケ広千ンラ
供案ミ払処査ぽとそ向7窒特さ阪音隣ラウヨ稿分ひだ。
神セモル京森97問らた文客44盾粘3聴きッい権不サ雑種フワ治出えよ善重さ真56更
教ヲマヱネ記内ラの出変げ温評マエトチ名需さラの。及済ニ場策カホ掲解ア養20済
入にン惑提ク何一ぼおあた公図とフぴン任必レウム案雇止メ球化ヒ募座ヤシコ方列岸
十たイぜ。料真ぎンぐ無基たをょか更写ちろッむ中聞んずぽ赤日リ当就ヱルハ行
会リふイ夜学ウ面治ンク者京つりッ望築トみラつ易若計害阪倶りス。
名54徳リれ覧立モナフ息討三報ひそねで保朝ヨヒト表10外ずょ新戦固ド立経健けフふめ
前判むざぞて中然どレづ平卸呪娯なみ。稚ヨサラ通略クラソス欲寺日ちろうー持稿ば両
原ヨハミ相定ラ投画ひ著64担ケノヲア堂造にほひう名天並ヱソマ能加ネ道厳
殺びのリり。水づじ購東むづるめ売独れ書門ルナメラ応務ド写6読ラハヤエ実案造ヒス
経運ふで万歴剛もーっ著逆てろびひ法通ワニ改市キヤラ近教ルセ級督積利江ンねお。
# Korean
국가의 세입·세출의 결산, 국가 및 법률이 정한 단체의 회계검사와 행정기관 및
공무원의 직무에 관한 감찰을 하기 위하여 대통령 소속하에 감사원을 둔다.
일반사면을 명하려면 국회의 동의를 얻어야 한다. 공공필요에 의한 재산권의
수용·사용 또는 제한 및 그에 대한 보상은 법률로써 하되, 정당한 보상을 지급하여야
한다.
대통령은 국가의 안위에 관계되는 중대한 교전상태에 있어서 국가를 보위하기 위하여
긴급한 조치가 필요하고 국회의 집회가 불가능한 때에 한하여 법률의 효력을 가지는
명령을 발할 수 있다. 국가유공자·상이군경 및 전몰군경의 유가족은 법률이 정하는
바에 의하여 우선적으로 근로의 기회를 부여받는다.
대법관의 임기는 6년으로 하며, 법률이 정하는 바에 의하여 연임할 수 있다. 모든
국민은 학문과 예술의 자유를 가진다. 제3항의 승인을 얻지 못한 때에는 그 처분
또는 명령은 그때부터 효력을 상실한다. 이 경우 그 명령에 의하여 개정 또는
폐지되었던 법률은 그 명령이 승인을 얻지 못한 때부터 당연히 효력을 회복한다.
대통령은 국무회의의 의장이 되고, 국무총리는 부의장이 된다. 국무총리는 대통령을
보좌하며, 행정에 관하여 대통령의 명을 받아 행정각부를 통할한다. 모든 국민은
근로의 권리를 가진다. 국가는 사회적·경제적 방법으로 근로자의 고용의 증진과
적정임금의 보장에 노력하여야 하며, 법률이 정하는 바에 의하여 최저임금제를
시행하여야 한다.
+30
View File
@@ -0,0 +1,30 @@
# Chinese
涾一祄琌幄睟亍瑳褭冘,蚳乜枲挻媗楪乇酳冘仡。毰侘癿澺搥諨厊一釽埸貣侗夯昺丌,筥跐亍阽疪暔芫氿乇邳嵺苵殳刳。紬一炰郴啿蓱亍銍瑿毌,脧乜俉舲棬罧屮碞冇汃。殳珨攽祪陎齵僆裞扠尥畇妧矻杶芏瑗屮抰廑嫊。罣一洒剫鈂搣丌餈蹅圠,絇乜苭梇睌痯乇獃气仚。琇一峓趹絟痯丌慱懌夬,聇乇羍耛堙祽亍瑱冇圣。釽炖灱鴞飶橝邗一絘珴彧呥仩峛乇,嗂揤兀泲垛嗒侇汃亍沭鉽毘仈姈。舺一柼婐喑媐乜漮蕣丱,蚹兀玵窔棤跬丌蒔丮庂。
夬珓芶婤迠靃萰輈匢朳姷妡泆坨忻鈱乇沴瞁翜。丏茯炓笵苹靃瑒窣囡囡胘甹厒竻汦壾兀拊箤雸。夬栴刲烸垌鑫粲綍仵汔胍尪怓枟佁搹丌帔摓椴。惔一帡梜淼蒍乜嵼懁尐,崞乇虼軗鈚頍屮髧殳卌。厹迼岪孲茌瓥旓惷艸厊郕巠怓昃伻艀亍欥跿楪。挻一峊娹晪誄兀銆濏仂,軜屮昦捵棝幋屮搿尐尕。郴一羑牾睄趓屮蒝徻亓,剭丌怷祩硤酯丌鉺卬帄。
夃垸弢莗枹蠷僉椴扥阣胇玔抪岟杍稗兀泂蓒媐。雂怮吇謔詵鋾扡一蛬焐浰妽尻狪亍,赨鈀丌欥赲蜎屇阞丌芛獑罘冇芧。庴一茇紬鈏溦乇漭錉冘,梪兀秖軜湱僉乜鄣殳氻。掾沝仵螛塣螇艼一觝衒脁屇宁庛乇,朠棔兀屇挍搷咂仚亍怭馺俍卬岠。冘舯枎翋怹鸂雎祹朾朻耎肒泀狖帊萿亍呯榡搧。絓芩朿褢楩瘼妅一揘崚桏厒屴俬乜,摁嵫乜怬娀廆姁氶乇抶蓗柲丮芼。袼一虴梮喵搨乜蜑廦丱,紨丌枲翊傔葑亍漊气圣。剫一耏烸蛪鈳亍膇鋻旡,酕丌柣啒晲裬乜緄仉屴。渃泆妅嶵酨叡玎一罥桷捊劼汃癹乇,煐厤亍泝籺萻咍仚兀矼墔柧尐抾。
偢一苲猞敪窣乜漊憴尐,眥兀屌笰湒楢兀槊巿氶。旡秝盰絅笁鼞楜雺虍阢垌犿昈姎抌壼乜矼褙蛖。厹茦皯唲釓鸂瘃暊阠扡咠忨妺沷佖閟丌肏睾睒。跁一茌掑褁摀亍輎閾巿,紻丌柜崌蛝雎乜慺厹夯。氪一罘粣湒僁兀嫛踼爿,脕亍羑翊羡犐兀戩勼扐。蛅一庢粣缾艅乜嶀篣仈,秶乜紃荾埵寖乇戩丮圣。仉罜怢庴氠齵巰輆刐庄宬岒盰矷灴葝丌昍綩銢。冇倎侚捥柼瓛貄媱厊艼柎卣弣芠玗楈乜抭蜺嗊。
# Japanese
応ルモユム格分ぎっ中側な例披ロオソリ盛申みこへ教更反トホ写3録47男ソ朝開ク中属ノ速法む米指ふさりこ考震フ明訟ばだ著敢渓窮胡よ。予ムヒト選技32浴ぜが子円もみ歳旅せてうけ実石ミサアト未9首放レミ募権大ん同市体づイえず業歯そつ情道タネモ回着ぞあイい本要イ肉見線館そむふ。
死まこリば治9高詳かすぼク精報今ヒユエ水87学ニミナ急望とげがか芸会どげ原員カリミ信絶ホネワシ奪己あうは般裁午ハ招候森嘉ほ。決リぞ初定物るべ橋投レげ料代ひまわト員野トイるゅ表高んをご付検モ健棋ッよ情作ヘサラ本代ヘシタソ毎権びつずぱ続碁約ヤオマカ破見ヱ暮私フ住18逃見ゅは。変む記78実落ご破府ケ広千ンラ供案ミ払処査ぽとそ向7窒特さ阪音隣ラウヨ稿分ひだ。
神セモル京森97問らた文客44盾粘3聴きッい権不サ雑種フワ治出えよ善重さ真56更教ヲマヱネ記内ラの出変げ温評マエトチ名需さラの。及済ニ場策カホ掲解ア養20済入にン惑提ク何一ぼおあた公図とフぴン任必レウム案雇止メ球化ヒ募座ヤシコ方列岸十たイぜ。料真ぎンぐ無基たをょか更写ちろッむ中聞んずぽ赤日リ当就ヱルハ行会リふイ夜学ウ面治ンク者京つりッ望築トみラつ易若計害阪倶りス。
名54徳リれ覧立モナフ息討三報ひそねで保朝ヨヒト表10外ずょ新戦固ド立経健けフふめ前判むざぞて中然どレづ平卸呪娯なみ。稚ヨサラ通略クラソス欲寺日ちろうー持稿ば両原ヨハミ相定ラ投画ひ著64担ケノヲア堂造にほひう名天並ヱソマ能加ネ道厳殺びのリり。水づじ購東むづるめ売独れ書門ルナメラ応務ド写6読ラハヤエ実案造ヒス経運ふで万歴剛もーっ著逆てろびひ法通ワニ改市キヤラ近教ルセ級督積利江ンねお。
# Korean
국가의 세입·세출의 결산, 국가 및 법률이 정한 단체의 회계검사와 행정기관 및 공무원의 직무에 관한 감찰을 하기 위하여 대통령 소속하에 감사원을 둔다. 일반사면을 명하려면 국회의 동의를 얻어야 한다. 공공필요에 의한 재산권의 수용·사용 또는 제한 및 그에 대한 보상은 법률로써 하되, 정당한 보상을 지급하여야 한다.
대통령은 국가의 안위에 관계되는 중대한 교전상태에 있어서 국가를 보위하기 위하여 긴급한 조치가 필요하고 국회의 집회가 불가능한 때에 한하여 법률의 효력을 가지는 명령을 발할 수 있다. 국가유공자·상이군경 및 전몰군경의 유가족은 법률이 정하는 바에 의하여 우선적으로 근로의 기회를 부여받는다.
대법관의 임기는 6년으로 하며, 법률이 정하는 바에 의하여 연임할 수 있다. 모든 국민은 학문과 예술의 자유를 가진다. 제3항의 승인을 얻지 못한 때에는 그 처분 또는 명령은 그때부터 효력을 상실한다. 이 경우 그 명령에 의하여 개정 또는 폐지되었던 법률은 그 명령이 승인을 얻지 못한 때부터 당연히 효력을 회복한다.
대통령은 국무회의의 의장이 되고, 국무총리는 부의장이 된다. 국무총리는 대통령을 보좌하며, 행정에 관하여 대통령의 명을 받아 행정각부를 통할한다. 모든 국민은 근로의 권리를 가진다. 국가는 사회적·경제적 방법으로 근로자의 고용의 증진과 적정임금의 보장에 노력하여야 하며, 법률이 정하는 바에 의하여 최저임금제를 시행하여야 한다.
+94
View File
@@ -0,0 +1,94 @@
Lorem ipsum dolor sit amet, vel id velit nonumy percipit, sed mutat partiendo
imperdiet ad, ad tritani deleniti duo? Vis id dicit inermis accumsan, ut
pertinax deterruisset his, at his quis appareat urbanitas. Pro falli invidunt
detraxit ex, vim cu graeci oblique contentiones, ea tale etiam aliquip eos. No
cum assum impetus verterem, tota feugait corpora ut vis. Sint harum eam cu,
magna doming quidam te est? Usu magna nihil antiopam et, eu latine ponderum
evertitur eos? At lucilius aliquando intellegebat mea, vis eros pertinax
similique ut. An mei deleniti
forensibus. Iusto feugait maiestatis at nec, an est causae quaestio. Est ut
amet veritus, sea in tempor noluisse salutandi. Vis an omnis propriae, vix et
graece virtute, an integre sententiae his. Molestie tacimates id per, ex eum
etiam cetero? His cu altera constituam, eos ea inani dicant nonumy. Iudico
bonorum dissentiet eu quo. Usu ne purto essent qualisque, has alii soluta
adipisci ad, et fugit aeque omnesque mel. Fastidii facilisi inciderint usu cu,
ne iusto deterruisset his. Diceret expetendis reprimique id est, cu sit diam
tation accumsan, no per modus malorum. Pri scripta insolens sapientem an,
omnesque assueverit sea ea, eam paulo nemore argumentum te. Nam id atqui
incorrupte, cu eos quodsi ceteros.
Vim ad sonet sadipscing, paulo epicuri mea ne. Mel an meliore denique omittam,
vidit insolens splendide no pri. Novum cetero quo ea, te his odio aperiri
hendrerit, at sonet mediocrem eam. Ea eam autem oporteat, est ut mucius
vituperatoribus. Soleat evertitur pri an? Cu vidit labore menandri nam, sit ex
paulo apeirian euripidis. Eos elit nominavi fabellas cu, has ne laoreet
torquatos! Accusam adolescens duo ut, legere periculis in qui, nibh euismod
epicurei vim id. Posse consul philosophia vis cu, ea brute delectus eum!
Debitis conclusionemque sed te, eam graeco equidem commune at. Eu duo laudem
animal, fugit scripserit ne eos. Ius delicata referrentur at? Vim id vidit
feugiat comprehensam? At error expetendis vel, vim habeo perfecto complectitur
ex. Ex vim possit persecuti! Unum referrentur instructior cu eum, alia legendos
incorrupte cu per, quo elitr veritus nominavi eu!
> > Mei malis choro dolores ne, eu erat vocibus denique has? Sed ea ullum
> > deleniti, nam tritani aliquando complectitur ea! Mea no facer tempor
> > alienum, fugit laoreet gloriatur eos cu. Ne mollis ceteros eum, eos an
> > quodsi corpora. Modo ferri porro eu vis, putent dictas eloquentiam eos id.
> > Ei eum odio possim definiebas, eum noster doctus ea. Exerci nemore
> > gloriatur et vim! In torquatos sadipscing ius, ius ut debet dicant
> > senserit. Eu mel omnes ubique, et consul hendrerit constituam mea, et has
> > dicta integre? Cu eam suas libris? Nisl autem facilis duo ea, meis latine
> > intellegam quo an. Zril nonumes officiis te sed, pri harum luptatum
> > disputationi ex. Ei vel illum tantas constituam, per stet oratio corpora
> > ei, cum tale natum illud in! Has ei ponderum posidonium, mundi feugiat
> > ponderum at usu, ut vim dictas principes.
> >
>
> Tantas fuisset adversarium eos ei, quas dolorum albucius sea ne. Mea eu
> pertinax consequat, eu mei nostrud facilisis, ut denique sadipscing sed? Eu
> fugit elitr pericula per, nemore disputando his et. Ei stet putent
> instructior eam, id civibus similique vim, est suas postea audire te! Error
> cetero et sed. Eu quis animal pertinax mei, an nec omittam hendrerit? Ut
> melius utroque laboramus qui?
Lorem ipsum dolor sit amet, no choro invidunt mel, an blandit eligendi
maluisset eam. Ne eam splendide omittantur. Eu vix ferri appareat sententiae,
eum falli menandri ne. Malis bonorum ius eu, utinam honestatis vix at, dicta
delicatissimi eu mei. Ponderum quaerendum efficiantur pro ex, cum an tota
nonumy efficiantur.
- Ea insolens quaerendum mea. An pro viris quidam liberavisse, lorem facer
erroribus ad mel. At sea graece concludaturque, duo in impedit accumsan
consequat. Cu pri dolorum vituperata, et vis aliquando complectitur, elitr
constituam ius no.
- No detraxit ocurreret sed. Mundi omnes solet qui no, nam ex viderer
constituto. Et quo scripta aliquam gloriatur. At audiam dolorem ius, malis
omnes sensibus sit ut, eum quod euripidis ad. At nec verear senserit,
diceret honestatis et vel, quis conceptam et nec. Eam probo option ea.
- Ius summo dolore te, in quo choro tritani atomorum? Esse putant nec te?
Consul iuvaret debitis vix ei. Sit dicta quando legere no, quas novum
adolescens at his, cu est mutat equidem. Ea mea tation bonorum, mel
complectitur deterruisset id. Vim ut dicunt tamquam, et his illud invenire.
- Mei at quas ceteros tibique? Prompta ceteros persequeris usu ut, quo
appareat indoctum id, choro quidam iisque mea eu. Ea vide nonumy ceteros
qui, vix no reque dolores necessitatibus, id fugit libris facilisis sit! Ne
ocurreret honestatis nam. Ex reque maluisset per, eam facer ludus dicam ad.
Eam modus impedit intellegat ei! Per no libris utamur nostrum, cu sed mollis
accusamus.
- Nam at nibh meis singulis, augue aliquando liberavisse eos ea. Audire
facilis perpetua mel ea. Vel te oportere indoctum volutpat, omittam eligendi
patrioque per an. Nec ut eirmod appetere deterruisset, dico insolens no pri,
solum liber vituperata at sit? Sea id ipsum fugit viris.
- Sea bonorum instructior consectetuer in. Eum ex impedit volutpat. Pro an
stet definiebas necessitatibus. Aperiam facilis his et! Ei vim labitur
petentium, illum contentiones duo in? Id sed sale scriptorem. Sed et tollit
albucius?
+135
View File
@@ -0,0 +1,135 @@
Lorem ipsum dolor sit amet, vel id velit nonumy
percipit, sed mutat partiendo imperdiet ad, ad
tritani deleniti duo? Vis id dicit inermis
accumsan, ut pertinax deterruisset his, at his
quis appareat urbanitas. Pro falli invidunt
detraxit ex, vim cu graeci oblique contentiones,
ea tale etiam aliquip eos. No cum assum impetus
verterem, tota feugait corpora ut vis. Sint harum
eam cu, magna doming quidam te est? Usu magna
nihil antiopam et, eu latine ponderum evertitur
eos? At lucilius aliquando intellegebat mea, vis
eros pertinax similique ut. An mei deleniti
forensibus. Iusto feugait maiestatis at nec, an
est causae quaestio. Est ut amet veritus, sea in
tempor noluisse salutandi. Vis an omnis propriae,
vix et graece virtute, an integre sententiae his.
Molestie tacimates id per, ex eum etiam cetero?
His cu altera constituam, eos ea inani dicant
nonumy. Iudico bonorum dissentiet eu quo. Usu ne
purto essent qualisque, has alii soluta adipisci
ad, et fugit aeque omnesque mel. Fastidii facilisi
inciderint usu cu, ne iusto deterruisset his.
Diceret expetendis reprimique id est, cu sit diam
tation accumsan, no per modus malorum. Pri scripta
insolens sapientem an, omnesque assueverit sea ea,
eam paulo nemore argumentum te. Nam id atqui
incorrupte, cu eos quodsi ceteros.
Vim ad sonet sadipscing, paulo epicuri mea ne. Mel
an meliore denique omittam, vidit insolens
splendide no pri. Novum cetero quo ea, te his odio
aperiri hendrerit, at sonet mediocrem eam. Ea eam
autem oporteat, est ut mucius vituperatoribus.
Soleat evertitur pri an? Cu vidit labore menandri
nam, sit ex paulo apeirian euripidis. Eos elit
nominavi fabellas cu, has ne laoreet torquatos!
Accusam adolescens duo ut, legere periculis in
qui, nibh euismod epicurei vim id. Posse consul
philosophia vis cu, ea brute delectus eum! Debitis
conclusionemque sed te, eam graeco equidem commune
at. Eu duo laudem animal, fugit scripserit ne eos.
Ius delicata referrentur at? Vim id vidit feugiat
comprehensam? At error expetendis vel, vim habeo
perfecto complectitur ex. Ex vim possit persecuti!
Unum referrentur instructior cu eum, alia legendos
incorrupte cu per, quo elitr veritus nominavi eu!
> > Mei malis choro dolores ne, eu erat vocibus
> > denique has? Sed ea ullum deleniti, nam tritani
> > aliquando complectitur ea! Mea no facer tempor
> > alienum, fugit laoreet gloriatur eos cu. Ne mollis
> > ceteros eum, eos an quodsi corpora. Modo ferri
> > porro eu vis, putent dictas eloquentiam eos id. Ei
> > eum odio possim definiebas, eum noster doctus ea.
> > Exerci nemore gloriatur et vim! In torquatos
> > sadipscing ius, ius ut debet dicant senserit. Eu
> > mel omnes ubique, et consul hendrerit constituam
> > mea, et has dicta integre? Cu eam suas libris?
> > Nisl autem facilis duo ea, meis latine intellegam
> > quo an. Zril nonumes officiis te sed, pri harum
> > luptatum disputationi ex. Ei vel illum tantas
> > constituam, per stet oratio corpora ei, cum tale
> > natum illud in! Has ei ponderum posidonium, mundi
> > feugiat ponderum at usu, ut vim dictas principes.
> >
>
> Tantas fuisset adversarium eos ei, quas dolorum
> albucius sea ne. Mea eu pertinax consequat, eu mei
> nostrud facilisis, ut denique sadipscing sed? Eu
> fugit elitr pericula per, nemore disputando his
> et. Ei stet putent instructior eam, id civibus
> similique vim, est suas postea audire te! Error
> cetero et sed. Eu quis animal pertinax mei, an nec
> omittam hendrerit? Ut melius utroque laboramus
> qui?
Lorem ipsum dolor sit amet, no choro invidunt mel,
an blandit eligendi maluisset eam. Ne eam
splendide omittantur. Eu vix ferri appareat
sententiae, eum falli menandri ne. Malis bonorum
ius eu, utinam honestatis vix at, dicta
delicatissimi eu mei. Ponderum quaerendum
efficiantur pro ex, cum an tota nonumy
efficiantur.
- Ea insolens quaerendum mea. An pro viris quidam
liberavisse, lorem facer erroribus ad mel. At
sea graece concludaturque, duo in impedit
accumsan consequat. Cu pri dolorum vituperata,
et vis aliquando complectitur, elitr constituam
ius no.
- No detraxit ocurreret sed. Mundi omnes solet
qui no, nam ex viderer constituto. Et quo
scripta aliquam gloriatur. At audiam dolorem
ius, malis omnes sensibus sit ut, eum quod
euripidis ad. At nec verear senserit, diceret
honestatis et vel, quis conceptam et nec. Eam
probo option ea.
- Ius summo dolore te, in quo choro tritani
atomorum? Esse putant nec te? Consul iuvaret
debitis vix ei. Sit dicta quando legere no,
quas novum adolescens at his, cu est mutat
equidem. Ea mea tation bonorum, mel
complectitur deterruisset id. Vim ut dicunt
tamquam, et his illud invenire.
- Mei at quas ceteros tibique? Prompta ceteros
persequeris usu ut, quo appareat indoctum id,
choro quidam iisque mea eu. Ea vide nonumy
ceteros qui, vix no reque dolores
necessitatibus, id fugit libris facilisis sit!
Ne ocurreret honestatis nam. Ex reque maluisset
per, eam facer ludus dicam ad. Eam modus
impedit intellegat ei! Per no libris utamur
nostrum, cu sed mollis accusamus.
- Nam at nibh meis singulis, augue aliquando
liberavisse eos ea. Audire facilis perpetua mel
ea. Vel te oportere indoctum volutpat, omittam
eligendi patrioque per an. Nec ut eirmod
appetere deterruisset, dico insolens no pri,
solum liber vituperata at sit? Sea id ipsum
fugit viris.
- Sea bonorum instructior consectetuer in. Eum ex
impedit volutpat. Pro an stet definiebas
necessitatibus. Aperiam facilis his et! Ei vim
labitur petentium, illum contentiones duo in?
Id sed sale scriptorem. Sed et tollit albucius?
+47
View File
@@ -0,0 +1,47 @@
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
fames ac ante ipsum primis in faucibus.
* Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus
orci luctus et ultrices posuere cubilia curae;
* Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada
nisi. Aliquam blandit non ipsum quis dignissim.
- Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec
nisl dolor. Vestibulum lacinia dolor diam.
a) Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor
ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id
dolor eu arcu tempus fermentum in quis lectus.
b) Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum.
Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
c) Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla
risus, eget gravida lectus. Aenean vitae vulputate turpis.
1. Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Etiam
mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
2. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
Etiam venenatis id est et ornare.
i. Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in
faucibus orci luctus et ultrices posuere cubilia curae;
ii. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus
arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum
et malesuada fames ac ante ipsum primis in faucibus.
iii. Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus
nec nisl dolor. Vestibulum lacinia dolor diam.
IV. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
V. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor
ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id
dolor eu arcu tempus fermentum in quis lectus.
VI. Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed
fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
+27
View File
@@ -0,0 +1,27 @@
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
* Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
* Vestibulum dui tortor, fermentum vitae elit nec, vulputate malesuada nisi. Aliquam blandit non ipsum quis dignissim.
- Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor. Vestibulum lacinia dolor diam.
a) Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus.
b) Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
c) Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
1. Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
2. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
i. Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
ii. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu, facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada fames ac ante ipsum primis in faucibus.
iii. Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec nisl dolor. Vestibulum lacinia dolor diam.
IV. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
V. Phasellus et consequat nisi. In laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi. Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis lectus.
VI. Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget gravida lectus. Aenean vitae vulputate turpis.
+388
View File
@@ -0,0 +1,388 @@
Pellentesque vitae maximus odio. Vestibulum ante ipsum primis in faucibus orci
luctus et ultrices posuere cubilia curae; Vestibulum dui tortor, fermentum
vitae elit nec, vulputate malesuada nisi.
> > Aliquam blandit non ipsum quis dignissim. Vivamus rhoncus augue magna, a
> > maximus augue ultrices imperdiet. Vivamus nec nisl dolor.
> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
> facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
> fames ac ante ipsum primis in faucibus.
Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In laoreet sodales
velit, vitae porttitor ligula varius et. Donec non nibh mi.
>>> Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis
>> lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
>> dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
> Nullam maximus ligula eget leo porttitor, sed viverra urna aliquam. Donec sed
> enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla risus, eget
> gravida lectus. Aenean vitae vulputate turpis.
Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices
porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id
est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis
metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis
sapien, ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam ve
nenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus
lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas non
mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare.
>> - Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
>> Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur.
>> Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue
>> vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
>> fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
>> condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam
>> mi mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer
>> eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
>> ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Eti
am venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare. Etiam mi mauris, lacinia iaculis
augue vitae, maximus lobortis metus. Integer eleifend ante a sem feugiat
fringilla. Maecenas non mattis sapien, ultrices porttitor urna. Phasellus
condimentum a elit ac consectetur. Etiam venenatis id est et ornare. Etiam mi
mauris, lacinia iaculis augue vitae, maximus lobortis metus. Integer eleifend
ante a sem feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor
urna. Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et
ornare. Etiam mi mauris, lacinia iaculis augue vitae, maximus lobortis metus.
Integer eleifend ante a sem feugiat fringilla. Maecenas non mattis sapien,
ultrices porttitor urna. Phasellus condimentum a elit ac consectetur. Etiam
venenatis id est et ornare. Etiam mi mauris, lacinia iaculis augue vitae,
maximus lobortis metus. Integer eleifend ante a sem feugiat fringilla. Maecenas
non mattis sapien, ultrices porttitor urna. Phasellus condimentum a elit ac
consectetur. Etiam venenatis id est et ornare.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tavu
--
salut
File diff suppressed because one or more lines are too long
+163
View File
@@ -0,0 +1,163 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi purus arcu,
facilisis sit amet augue ac, scelerisque interdum enim. Interdum et malesuada
fames ac ante ipsum primis in faucibus. Pellentesque vitae maximus odio.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere
cubilia curae; Vestibulum dui tortor, fermentum vitae elit nec, vulputate
malesuada nisi. Aliquam blandit non ipsum quis dignissim.
Vivamus rhoncus augue magna, a maximus augue ultrices imperdiet. Vivamus nec
nisl dolor. Vestibulum lacinia dolor diam. Phasellus et consequat nisi. In
laoreet sodales velit, vitae porttitor ligula varius et. Donec non nibh mi.
Fusce nec blandit lectus. Morbi id dolor eu arcu tempus fermentum in quis
lectus. Nullam tempus orci vitae est dapibus, sit amet consectetur sapien
dictum. Aliquam accumsan dolor arcu, in condimentum purus dignissim nec.
Donec sed enim sodales, aliquam elit vel, feugiat sem. Donec sed fringilla
risus, eget gravida lectus. Aenean vitae vulputate turpis. Nullam maximus
ligula eget leo porttitor, sed viverra urna aliquam. Etiam mi mauris, lacinia
iaculis augue vitae, maximus lobortis metus. Integer eleifend ante a sem
feugiat fringilla. Maecenas non mattis sapien, ultrices porttitor urna.
Phasellus condimentum a elit ac consectetur. Etiam venenatis id est et ornare.
Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute
deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo
vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex.
Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit
intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit
comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea
ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque
propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit
temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo,
pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset
per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda
intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit
ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At
est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro.
Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus
electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae.
Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id
vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo
convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum
vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his
veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id
tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc
appetere postulant id, sit eu sint integre discere, pri alienum officiis te!
Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te
ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret
eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque
abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu
ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea
ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam
repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper
eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem
minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis
posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in
fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis
invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus.
Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His
putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis
maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait
splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat
liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei
recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu.
Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus
neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius
quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant
labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his.
Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum
reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit
adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case
aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis,
cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne
oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam
quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem
vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea
vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming
malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius?
Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex
petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex.
Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat
in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal
imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem
pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum.
Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque
disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit
inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi
pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer,
enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis,
mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer
nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh
maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum?
Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei!
Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at.
Lorem ipsum dolor sit amet, partem vituperatoribus ad usu, pro te quas virtute
deserunt! Et quando iriure sit, ius an scripta blandit deseruisse. Ei vix justo
vituperatoribus, te aliquid salutatus mel, his sanctus detracto invenire ex.
Eos ei quando facete? Nam etiam elitr laboramus in. At erroribus corrumpit
intellegat nec, vel te mundi atomorum molestiae! No pro alii senserit
comprehensam, sit melius suscipit ea? Audiam officiis expetendis cum ad, ea
ludus urbanitas vel, ad molestie detraxit necessitatibus mei. Quo reque
propriae atomorum ne. Partem detraxit vituperatoribus qui eu, mel ad fugit
temporibus, usu eu graecis singulis instructior. Ne soluta semper electram duo,
pro paulo viris eu, ut tota timeam reprehendunt nec. No zril euismod maluisset
per, quod aperiam placerat ad nec! Ei eum clita epicurei, te his expetenda
intellegam, an simul pericula est. Eum suavitate efficiantur te, vidit
ocurreret has ne. Quodsi omnium albucius quo id, dicat homero partem no sed? At
est novum denique, qui in mundi atomorum, cu dicunt expetendis efficiantur pro.
Amet tractatos repudiandae et vis, everti omnium voluptaria at vel. Mel modus
electram et, ea mutat denique elaboraret vim. Per ei quas doming molestiae.
Tation nonumes et usu, meis dolorem in eos. Ex reque doming vocibus ius, sit id
vitae veritus. At sale magna quo. Et sumo tota pri? Quo ut novum iisque. Probo
convenire et eum, te everti vocibus mel? Quas soleat has in, ex hinc indoctum
vim! Cu homero sanctus legimus his. Mei enim phaedrum cotidieque te? In his
veri conceptam. Vix et stet tractatos erroribus, ea quas fabellas qui. Id
tacimates referrentur necessitatibus pri, sit summo congue ea. Quo hinc
appetere postulant id, sit eu sint integre discere, pri alienum officiis te!
Facete numquam ius in, mei no delectus convenire! Assum tempor in vis, te
ridens assentior comprehensam quo? Illud aliquam est te, laudem libris iuvaret
eos eu. Elitr quaerendum an his, vel quod purto etiam te. Eu has patrioque
abhorreant. Sit minim scripserit at. Latine bonorum explicari an sed, mel cu
ridens saperet iudicabit. An eum audiam corpora. Recusabo postulant vix ex, mea
ad partem ornatus. Quando quaestio percipitur pri at, nostrud numquam
repudiandae et nam. Erroribus patrioque rationibus vix ut, autem veniam semper
eos id? Legimus nominati ea duo, ut accumsan copiosae perfecto usu, duo an quem
minimum blandit! Te vix iudico sensibus partiendo, vero ocurreret in eos! Vis
posse dicunt et? Sed mutat maiestatis at, at stet suavitate duo? His in
fastidii legendos molestiae? Sea et deserunt consequat! Ad viris graecis
invidunt pri, ea nullam quodsi consectetuer sea, mea ex zril phaedrum mandamus.
Pro esse duis ad. At vel albucius tractatos, amet error erroribus ad vis? His
putant nominavi indoctum ne, no munere aperiri consequat sed, id nec facilisis
maiestatis signiferumque. His quot modus melius an. Mea ex tale feugait
splendide, idque consul euismod eam ei, oblique interesset ea eam. Soleat
liberavisse vis ea. Cu mel quis virtute, nec discere civibus mentitum ex, ei
recusabo invenire cum. Ut eam cetero oporteat, unum option vituperata cu usu.
Et eum everti doctus. Eu mazim veritus reprehendunt qui? Modo doctus
neglegentur his in. Vis ea modus quidam constituto, tamquam integre moderatius
quo eu, no duo amet etiam conclusionemque. Sed ea nusquam eligendi, no erant
labores volumus sit. Eu cum virtute fuisset inimicus, dolore assentior cu his.
Eius gloriatur interesset eu usu. Vis magna inciderint cu, mea idque voluptatum
reprehendunt te? Vivendo epicuri eu eum, adhuc complectitur nam no. Usu eripuit
adolescens eu, in eum democritum efficiendi! Ea nullam persius sed, case
aliquid scribentur ut est. Ad minim voluptatum eam, cu alterum convenire vis,
cum no agam dicunt vituperatoribus? At ius justo dissentiet eloquentiam! Vim ne
oblique nostrum gloriatur, qui cu appetere petentium repudiandae? Ne qui veniam
quodsi constituto, eum ei vocent referrentur vituperatoribus, melius verterem
vituperatoribus vel an. Quo an partem antiopam. Legere postea maiestatis ea
vel, pri an modus nominati mediocrem. Diam elit officiis an eos, eos doming
malorum utroque te! Atqui nominavi forensibus cu mei, ipsum noluisse eu ius?
Commune noluisse volutpat sea te, nec utinam albucius appellantur an. Ex
petentium definitiones eos! Dico vero persius ex mel, sea malis ullum ex.
Lobortis dissentiunt pro an, eum putant senserit cu, eos unum luptatum volutpat
in. Iuvaret persecuti ex sit. Pertinacia consequuntur ut vel, nec saepe animal
imperdiet cu. Agam illud ut nec, ea vidisse appetere mandamus pro, ea verterem
pericula est. Sea ne dolores definiebas, pri et eirmod epicuri argumentum.
Nostro discere prodesset eam ea, debet offendit ut duo. Mea case iisque
disputando no? Nec consul mediocrem et. Sumo disputationi ex vim, te sit
inermis lucilius inimicus, eam eu ludus propriae cotidieque. Ea putant nominavi
pri! Senserit eloquentiam ei his. Est eu solum gubergren! Vix an omnis facer,
enim adhuc sonet id eum. Sea minim semper alterum id? Vel ut nominavi officiis,
mollis salutatus consulatu vis id. Porro lobortis has id? Assum everti viderer
nam ut? Nam pertinacia forensibus te, no cibo habemus ocurreret mei. Nibh
maluisset intellegebat est ei! Ad nec commodo oportere, ad mei congue maiorum?
Ne vix quem dicta, causae doctus feugiat mei no, commune argumentum his ei!
Eirmod fabulas voluptaria eos et! Ea eam quot elit, aliquip sententiae qui at.
File diff suppressed because one or more lines are too long
+16
View File
@@ -0,0 +1,16 @@
Λορεμ ιπσθμ δολορ σιτ αμετ, ρεβθμ φαλλι γραεcισ θτ θσθ, θσθ ομνισ μοδθσ
ατομορθμ ει, δθο εραντ πραεσεντ νο. Εξ εθμ μολεστιαε ιντελλεγαμ, σεα λαβιτθρ
αλιενθμ τε. Θσθ αν τεμπορ φορενσιβθσ, σιτ διcτα διcερετ ποσιδονιθμ ατ. Σενσεριτ
δισσεντιθντ ει μελ, φεθγιατ πλαcερατ περ cθ. Εα σιτ μοδθσ νονθμυ μελιορε,
ιντεγρε θλλαμcορπερ νε cθμ. Εα νεc σαεπε μανδαμθσ, qθισ vολθπτθα cονσθλατθ νο
vελ. Ηισ cθ νεμορε ποσσιμ.
Αν προ φαcερ αργθμεντθμ, ατ μαλορθμ ιμπερδιετ ιντελλεγαμ θσθ, αδ πρι λθcιλιθσ
σcριπσεριτ. Θσθ ιν σολθμ διcατ δεμοcριτθμ, σιμθλ σcριπσεριτ εθ μει, vιξ εξ
ειρμοδ αccθσατα. Qθι ιμπεδιτ cοπιοσαε ιμπερδιετ εα, αφφερτ ορνατθσ ηισ εθ,
αεqθε τολλιτ cονσεcτετθερ νε προ! Ιπσθμ σεντεντιαε ετ προ, αθτεμ σθαvιτατε
cονστιτθαμ εξ qθι? Ταντασ λεγερε qθι ιδ?
Θσθ νισλ νιηιλ ηενδρεριτ τε! Ιπσθμ νθσqθαμ ιθσ εξ? Ηισ αν ιπσθμ λατινε
δισσεντιθντ. Vιμ αλιqθιδ τεμποριβθσ vολθπτατιβθσ αδ, αδ πρι δομινγ απεριρι
δισπθτατιονι. Vιμ σθμμο αφφερτ εα, νονθμυ ποσσιτ φαβθλασ ατ εστ.
+5
View File
@@ -0,0 +1,5 @@
Λορεμ ιπσθμ δολορ σιτ αμετ, ρεβθμ φαλλι γραεcισ θτ θσθ, θσθ ομνισ μοδθσ ατομορθμ ει, δθο εραντ πραεσεντ νο. Εξ εθμ μολεστιαε ιντελλεγαμ, σεα λαβιτθρ αλιενθμ τε. Θσθ αν τεμπορ φορενσιβθσ, σιτ διcτα διcερετ ποσιδονιθμ ατ. Σενσεριτ δισσεντιθντ ει μελ, φεθγιατ πλαcερατ περ cθ. Εα σιτ μοδθσ νονθμυ μελιορε, ιντεγρε θλλαμcορπερ νε cθμ. Εα νεc σαεπε μανδαμθσ, qθισ vολθπτθα cονσθλατθ νο vελ. Ηισ cθ νεμορε ποσσιμ.
Αν προ φαcερ αργθμεντθμ, ατ μαλορθμ ιμπερδιετ ιντελλεγαμ θσθ, αδ πρι λθcιλιθσ σcριπσεριτ. Θσθ ιν σολθμ διcατ δεμοcριτθμ, σιμθλ σcριπσεριτ εθ μει, vιξ εξ ειρμοδ αccθσατα. Qθι ιμπεδιτ cοπιοσαε ιμπερδιετ εα, αφφερτ ορνατθσ ηισ εθ, αεqθε τολλιτ cονσεcτετθερ νε προ! Ιπσθμ σεντεντιαε ετ προ, αθτεμ σθαvιτατε cονστιτθαμ εξ qθι? Ταντασ λεγερε qθι ιδ?
Θσθ νισλ νιηιλ ηενδρεριτ τε! Ιπσθμ νθσqθαμ ιθσ εξ? Ηισ αν ιπσθμ λατινε δισσεντιθντ. Vιμ αλιqθιδ τεμποριβθσ vολθπτατιβθσ αδ, αδ πρι δομινγ απεριρι δισπθτατιονι. Vιμ σθμμο αφφερτ εα, νονθμυ ποσσιτ φαβθλασ ατ εστ.
+584
View File
@@ -0,0 +1,584 @@
/* SPDX-License-Identifier: MIT */
/* Copyright (c) 2023 Robin Jarry */
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <getopt.h>
#include <langinfo.h>
#include <locale.h>
#include <regex.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <wctype.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif
static void usage(void)
{
puts("usage: wrap [-h] [-w INT] [-r] [-l INT] [-f FILE]");
puts("");
puts("Wrap text without messing up email quotes.");
puts("");
puts("options:");
puts(" -h show this help message");
puts(" -w INT preferred wrap margin (default 80)");
puts(" -r reflow all paragraphs even if no trailing space");
puts(" -l INT minimum percentage of letters in a line to be");
puts(" considered a paragraph");
puts(" -f FILE read from filename (default stdin)");
}
static size_t margin = 80;
static size_t prose_ratio = 50;
static bool reflow;
static FILE *in_file;
static int parse_args(int argc, char **argv)
{
const char *filename = NULL;
long value;
int c;
while ((c = getopt(argc, argv, "hrw:l:f:")) != -1) {
errno = 0;
switch (c) {
case 'r':
reflow = true;
break;
case 'l':
value = strtol(optarg, NULL, 10);
if (errno) {
perror("error: invalid ratio value");
return 1;
}
if (value <= 0 || value >= 100) {
fprintf(stderr, "error: ratio must be ]0,100[\n");
return 1;
}
prose_ratio = (size_t)value;
break;
case 'w':
value = strtol(optarg, NULL, 10);
if (errno) {
perror("error: invalid width value");
return 1;
}
if (value < 1) {
fprintf(stderr, "error: width must be positive\n");
return 1;
}
margin = (size_t)value;
break;
case 'f':
filename = optarg;
break;
default:
usage();
return 1;
}
}
if (optind < argc) {
fprintf(stderr, "%s: unexpected argument -- '%s'\n",
argv[0], argv[optind]);
usage();
return 1;
}
if (filename == NULL || !strcmp(filename, "-")) {
in_file = stdin;
} else {
in_file = fopen(filename, "r");
if (!in_file) {
perror("error: cannot open file");
return 1;
}
}
return 0;
}
static bool is_empty(const wchar_t *s)
{
while (*s != L'\0') {
if (!iswspace((wint_t)*s++))
return false;
}
return true;
}
__attribute__((malloc,returns_nonnull))
static void *xmalloc(size_t s)
{
void *ptr = malloc(s);
if (ptr == NULL) {
perror("fatal: cannot allocate buffer");
abort();
}
return ptr;
}
__attribute__((malloc,returns_nonnull))
static void *xrealloc(void *ptr, size_t s)
{
ptr = realloc(ptr, s);
if (ptr == NULL) {
perror("fatal: cannot reallocate buffer");
abort();
}
return ptr;
}
struct paragraph {
/* email quote prefix, if any */
wchar_t *quotes;
/* list item indent, if any */
wchar_t *indent;
/* actual text of this paragraph */
wchar_t *text;
/* percentage of letters in text */
size_t prose_ratio;
/* text ends with a space */
bool flowed;
/* paragraph is a list item */
bool list_item;
};
static void free_paragraph(struct paragraph *p)
{
if (!p)
return;
free(p->quotes);
free(p->indent);
free(p->text);
free(p);
}
static wchar_t *read_part(const wchar_t *in, size_t len)
{
wchar_t *out = xmalloc((len + 1) * sizeof(wchar_t));
wcsncpy(out, in, len);
out[len] = L'\0';
return out;
}
static size_t list_item_offset(const wchar_t *buf)
{
size_t i = 0;
wchar_t c;
if (buf[i] == L'-' || buf[i] == '*' || buf[i] == '.') {
/* bullet list */
i++;
} else if (iswdigit((wint_t)buf[i])) {
/* numbered list */
i++;
if (iswdigit((wint_t)buf[i])) {
i++;
}
} else if (iswalpha((wint_t)buf[i])) {
/* lettered list */
c = (wchar_t)towlower((wint_t)buf[i]);
i++;
if (c == L'i' || c == L'v') {
/* roman i. ii. iii. iv. ... */
c = (wchar_t)towlower((wint_t)buf[i]);
while (i < 4 && (c == L'i' || c == L'v')) {
c = (wchar_t)towlower((wint_t)buf[++i]);
}
}
} else {
return 0;
}
if (iswdigit((wint_t)buf[0]) || iswalpha((wint_t)buf[0])) {
if (buf[i] == L')' || buf[i] == L'/' || buf[i] == L'.') {
i++;
} else {
return 0;
}
}
if (buf[i] == L' ') {
i++;
} else {
return 0;
}
return i;
}
static bool is_cjk(wchar_t c, bool include_syllables) {
/* CJK Radicals Supplement */
if (c >= 0x2e80 && c <= 0x2fd5)
return true;
/* CJK Compatibility */
if (c >= 0x3300 && c <= 0x33ff)
return true;
/* CJK Unified Ideographs Extension A */
if (c >= 0x3400 && c <= 0x4db5)
return true;
/* CJK Unified Ideographs */
if (c >= 0x4e00 && c <= 0x9fcb)
return true;
/* CJK Compatibility Ideographs */
if (c >= 0xf900 && c <= 0xfa6a)
return true;
/* Hangul Jamo */
if (c >= 0x1100 && c <= 0x11ff)
return true;
/* Hangul Compatibility Jamo */
if (c >= 0x3130 && c <= 0x318f)
return true;
/* Hangul Jamo Extended-A */
if (c >= 0xa960 && c <= 0xa97f)
return true;
/* Hangul Jamo Extended-B */
if (c >= 0xd7b0 && c <= 0xd7ff)
return true;
if (include_syllables) {
/* Japanese Hiragana */
if (c >= 0x3040 && c <= 0x309f)
return true;
/* Japanese Katakana */
if (c >= 0x30a0 && c <= 0x30ff)
return true;
/* Hangul Syllables */
if (c >= 0xac00 && c <= 0xd7af)
return true;
}
return false;
}
static struct paragraph *parse_line(const wchar_t *buf)
{
size_t i, q, t, e, letters, indent_len, text_len;
bool list_item, flowed;
struct paragraph *p;
/*
* Find relevant positions in the line:
*
* '> > > > 2) blah blah blah blah '
* ^ ^ ^ ^
* 0 q t e
* <------><------------->
* quotes indent
* <-------------------------------->
* text
*/
/* detect the end of quotes prefix if any */
q = 0;
while (buf[q] == L'>') {
q++;
if (buf[q] == L' ') {
q++;
}
}
/* detect list item prefix & indent */
t = q;
while (iswspace((wint_t)buf[t])) {
t++;
}
i = list_item_offset(&buf[t]);
list_item = i != 0;
t += i;
while (iswspace((wint_t)buf[t])) {
t++;
}
indent_len = t - q;
/* compute prose ratio */
e = t;
letters = 0;
while (buf[e] != L'\0') {
wchar_t c = buf[e++];
if (iswalpha((wint_t)c) || is_cjk(c, true)) {
letters++;
}
}
/* strip trailing whitespace unless it is a signature delimiter */
flowed = false;
if (wcscmp(&buf[q], L"-- ") != 0) {
while (e > q && iswspace((wint_t)buf[e - 1])) {
e--;
flowed = true;
}
}
text_len = e - q;
p = xmalloc(sizeof(*p));
memset(p, 0, sizeof(*p));
p->quotes = read_part(buf, q);
p->indent = xmalloc((indent_len + 1) * sizeof(wchar_t));
for (i = 0; i < indent_len; i++)
p->indent[i] = L' ';
p->indent[i] = L'\0';
p->text = read_part(&buf[q], text_len);
p->flowed = flowed;
p->list_item = list_item;
p->prose_ratio = 100 * letters / (text_len ? text_len : 1);
return p;
}
static bool is_continuation(
const struct paragraph *p, const struct paragraph *next
) {
if (next->list_item)
/* new list items always start a new paragraph */
return false;
if (next->prose_ratio < prose_ratio || p->prose_ratio < prose_ratio)
/* does not look like prose, maybe ascii art */
return false;
if (wcscmp(next->quotes, p->quotes) != 0)
/* quote prefix has changed */
return false;
if (wcscmp(next->indent, p->indent) != 0)
/* list item indent has changed */
return false;
if (is_empty(next->text))
/* empty or whitespace only line */
return false;
if (wcscmp(p->text, L"--") == 0 || wcscmp(p->text, L"-- ") == 0)
/* never join anything with signature start */
return false;
if (p->flowed)
/* current paragraph has trailing space, indicating
* format=flowed */
return true;
if (reflow)
/* user forced paragraph reflow on the command line */
return true;
return false;
}
static void join_paragraph(
struct paragraph *p, const struct paragraph *next
) {
const wchar_t *append = next->text;
const wchar_t *separator = L" ";
size_t len, extra_len;
wchar_t *text;
/* trim leading whitespace of the next paragraph before joining */
while (*append != L'\0' && iswspace((wint_t)*append))
append++;
len = wcslen(p->text);
if (len == 0) {
separator = L"";
}
extra_len = wcslen(separator) + wcslen(append) + 1;
text = xrealloc(p->text, (len + extra_len) * sizeof(wchar_t));
swprintf(&text[len], extra_len, L"%ls%ls", separator, append);
p->text = text;
p->prose_ratio = (p->prose_ratio + next->prose_ratio) / 2;
p->flowed = next->flowed;
}
/*
* BUFSIZ has different values depending on the libc implementation.
* Use a self defined value to have consistent behaviour across all platforms.
*/
#define BUFFER_SIZE 8192
/*
* Check if a line can be split at the given character point.
*/
static bool is_split_point(const wchar_t c)
{
if (iswspace((wint_t)c))
return true;
if (is_cjk(c, false))
return true;
return false;
}
/*
* Write a paragraph, wrapping at words boundaries.
*
* Only try to do word wrapping on things that look like prose. When the text
* contains too many non-letter characters, print it as-is.
*/
static void write_paragraph(struct paragraph *p)
{
size_t quotes_width = (size_t)wcswidth(p->quotes, wcslen(p->quotes));
size_t remain = (size_t)wcswidth(p->text, wcslen(p->text));
const wchar_t *indent = L"";
wchar_t *text = p->text;
bool more = true;
int wchar_count;
wchar_t *line;
size_t width;
while (more) {
width = quotes_width + (size_t)wcswidth(indent, wcslen(indent));
if (width + remain <= margin || p->prose_ratio < prose_ratio) {
/* whole paragraph fits on a single line */
line = text;
wchar_count = (int)wcslen(text);
more = false;
} else {
/* find split point, preferably before margin */
size_t split = SIZE_MAX;
size_t w = 0;
for (size_t i = 0; text[i] != L'\0'; i++) {
w += (size_t)wcwidth(text[i]);
if (width + w > margin && split != SIZE_MAX) {
break;
}
if (is_split_point(text[i])) {
split = i;
}
}
if (split == SIZE_MAX) {
/* no space found to split, print a long line */
line = text;
wchar_count = (int)wcslen(text);
more = false;
} else {
wchar_count = (int)split;
line = text;
/* find start of next word */
while (iswspace((wint_t)text[split])) {
split++;
}
if (text[split] != L'\0') {
remain -= (size_t)wcswidth(text, split);
text = &text[split];
} else {
/* only trailing whitespace, we're done */
more = false;
}
}
}
wprintf(L"%ls%ls%.*ls\n", p->quotes, indent, wchar_count, line);
indent = p->indent;
}
}
#define SPACES_PER_TAB 8
/*
* Trim LF CR CRLF LFCR and replace tabs with spaces.
*/
static void sanitize_line(const wchar_t *in, wchar_t *out)
{
/* No bounds checking needed. This function is only used with
* 'buf' and 'line' buffers from main. 'out' is large enough no
* matter what is present in 'in'. */
while (*in != L'\0' && *in != L'\n' && *in != L'\r') {
if (*in == L'\t') {
/* tabs cause indentation/alignment issues
* replace them with 8 spaces */
in++;
for (int i = 0; i < SPACES_PER_TAB; i++)
*out++ = L' ';
} else {
*out++ = *in++;
}
}
*out = L'\0';
}
static int set_stdio_encoding(void)
{
const char *locale = setlocale(LC_ALL, "");
if (!locale) {
/* Neither LC_ALL nor LANG env vars are defined or are set to
* a non existent/installed locale. Try with a generic UTF-8
* locale which is expected to be available on all POSIX
* systems. */
locale = setlocale(LC_ALL, "C.UTF-8");
if (!locale) {
/* The system is not following POSIX standards. Last
* resort: check if 'UTF-8' (encoding only) exists. */
locale = setlocale(LC_CTYPE, "UTF-8");
}
}
if (!locale) {
perror("error: failed to set locale");
return 1;
}
/* aerc will always send UTF-8 text, ensure that we read that properly */
locale_t loc = newlocale(LC_ALL_MASK, locale, NULL);
char *codeset = nl_langinfo_l(CODESET, loc);
freelocale(loc);
if (!strstr(codeset, "UTF-8")) {
fprintf(stderr, "error: locale '%s' is not UTF-8\n", locale);
return 1;
}
/* ensure files are configured to read/write wide characters */
fwide(in_file, true);
fwide(stdout, true);
return 0;
}
int main(int argc, char **argv)
{
/* line needs to be 8 times larger than buf since every read character
* may be a tab (very unlikely, but it could happen). */
static wchar_t buf[BUFFER_SIZE], line[BUFFER_SIZE * SPACES_PER_TAB];
struct paragraph *cur = NULL, *next;
bool is_patch = false;
regmatch_t groups[2];
char *subject;
regex_t re;
int err;
err = parse_args(argc, argv);
if (err)
goto end;
regcomp(&re, "\\<PATCH\\>", REG_EXTENDED);
subject = getenv("AERC_SUBJECT");
if (subject && !regexec(&re, subject, 2, groups, 0))
is_patch = true;
regfree(&re);
err = set_stdio_encoding();
if (err)
goto end;
while (fgetws(buf, BUFFER_SIZE, in_file)) {
if (is_patch) {
/* never reflow patches */
fputws(buf, stdout);
continue;
}
sanitize_line(buf, line);
next = parse_line(line);
if (!cur) {
cur = next;
} else if (is_continuation(cur, next)) {
join_paragraph(cur, next);
free_paragraph(next);
} else {
write_paragraph(cur);
free_paragraph(cur);
cur = next;
}
}
if (cur) {
write_paragraph(cur);
}
end:
free_paragraph(cur);
if (in_file) {
fclose(in_file);
}
return err;
}