Add markdown css (#775)

This commit is contained in:
vvb2060 2021-06-25 11:02:21 +08:00 committed by GitHub
parent 7254ed4d79
commit aed23f65e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1210 additions and 18 deletions

View File

@ -200,7 +200,6 @@ dependencies {
implementation("androidx.navigation:navigation-ui:$navVersion")
implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("androidx.webkit:webkit:1.4.0")
implementation("com.caverock:androidsvg-aar:1.4")
implementation("com.github.bumptech.glide:glide:$glideVersion")
implementation("com.github.bumptech.glide:okhttp3-integration:$glideVersion")

View File

@ -0,0 +1,156 @@
/* Primer Colors */
/* Please also update colors_light.css with light mode appropriate colors when modifying this file. */
:root {
--blue-900: #082a52;
--blue-800: #063366;
--blue-700: #0b498f;
--blue-600: #0c65c9;
--blue-500: #0d6edb;
--blue-400: #2e8fff;
--blue-300: #85beff;
--blue-200: #d1e6ff;
--blue-100: #e5f2ff;
--blue-000: #f5faff;
--gray-1000: #050505;
--gray-950: #0b0b0d;
--gray-900: #17181a;
--gray-850: #242528;
--gray-800: #2e2f37;
--gray-750: #383a42;
--gray-700: #41434e;
--gray-650: #4b4d58;
--gray-600: #525560;
--gray-550: #5e616e;
--gray-500: #6c6f7e;
--gray-450: #787c8c;
--gray-400: #9194a1;
--gray-350: #a9abb6;
--gray-300: #bfc1c9;
--gray-250: #d6d7dc;
--gray-200: #e3e4e8;
--gray-150: #eff0f5;
--gray-100: #f7f7f9;
--gray-050: #fbfbfc;
--gray-000: #ffffff;
--green-900: #184d25;
--green-800: #1b612b;
--green-700: #1e7533;
--green-600: #2b8f43;
--green-500: #32b24f;
--green-400: #40d663;
--green-300: #95f0ab;
--green-200: #cbf7d5;
--green-100: #e5ffeb;
--green-000: #f5fff8;
--yellow-900: #755f13;
--yellow-800: #b89007;
--yellow-700: #e0b112;
--yellow-600: #ffcb1a;
--yellow-500: #ffd74d;
--yellow-400: #ffe166;
--yellow-300: #ffec8a;
--yellow-200: #fff6b8;
--yellow-100: #fffce5;
--yellow-000: #fffef5;
--orange-900: #a84603;
--orange-800: #c75204;
--orange-700: #d65c09;
--orange-600: #eb680e;
--orange-500: #fa6f0f;
--orange-400: #ff8a38;
--orange-300: #ffae75;
--orange-200: #ffd5b2;
--orange-100: #ffeee0;
--orange-000: #fffaf5;
--red-900: #8f1d22;
--red-800: #a82229;
--red-700: #bd222d;
--red-600: #d62b38;
--red-500: #e04352;
--red-400: #f55363;
--red-300: #ff808d;
--red-200: #ffb2bb;
--red-100: #ffe0e4;
--red-000: #fff0f2;
--pink-900: #702653;
--pink-800: #9e3674;
--pink-700: #c2428e;
--pink-600: #d63c99;
--pink-500: #f051b0;
--pink-400: #f576c2;
--pink-300: #fa9bd4;
--pink-200: #ffbde4;
--pink-100: #fee0f2;
--pink-000: #fff0f9;
--purple-900: #2e1757;
--purple-800: #3f2175;
--purple-700: #522e8f;
--purple-600: #6139a8;
--purple-500: #7548c7;
--purple-400: #916bd6;
--purple-300: #b899f0;
--purple-200: #dac7ff;
--purple-100: #eae0ff;
--purple-000: #f6f2ff;
--textPrimary: var(--gray-050);
--textSecondary: var(--gray-300);
--textTertiary: var(--gray-400);
--textPlaceholder: rgba(145, 148, 161, 0.5);
--link: var(--blue-400);
--appBackground: var(--gray-1000);
--backgroundSecondary: var(--gray-900);
--backgroundTertiary: var(--gray-850);
--border: rgba(191, 193, 201, 0.16);
--borderOpaque: var(--gray-700);
--iconPrimary: var(--gray-300);
--iconSecondary: var(--gray-500);
--inputBackground: rgba(191, 193, 201, 0.12);
--backgroundPrimary: var(--gray-1000);
--backgroundElevatedPrimary: var(--gray-900);
--backgroundElevatedSecondary: rgba(191, 193, 201, 0.04);
--backgroundElevatedTertiary: rgba(191, 193, 201, 0.08);
--backgroundInset: var(--gray-900);
--link-hover: var(--gray-800);
--color-icon-success: var(--green-600);
--color-text-danger: var(--red-600);
--diffLineNumberAdditionBackground: #08260f;
--diffLineNumberAdditionText: #95f0ab;
--diffLineAdditionBackground: #061c0b;
--diffLineNumberDeletionBackground: #3b0507;
--diffLineNumberDeletionText: #ff808d;
--diffLineDeletionBackground: #300406;
--suggestedChangeDeletionText: #ffffff;
--suggestedChangeAdditionText: #ffffff;
--suggestedChangeDeletionBackground: rgba(218,54,51,0.6);
--suggestedChangeAdditionBackground: rgba(46,160,67,0.6);
--videoBackground: #000000;
}
/* Custom Base Styles */
:root {
--link-highlight: rgba(46, 143, 255, 0.08);
--pre-background: var(--backgroundElevatedTertiary);
--code-background: var(--pre-background);
--hr-background: var(--borderOpaque);
--thead-background: var(--pre-background);
--thead-border: var(--hr-background);
--tr-border: var(--gray-300);
--tr-alt-background: var(--pre-background);
--kbd-background: var(--pre-background);
--kbd-color: var(--gray-350);
--kbd-border: var(--gray-750);
--blockquote-color: var(--gray-400);
--blockquote-border: var(--hr-background);
--heading-color: var(--gray-100);
--h6-color: var(--gray-500);
--frame-border: var(--hr-background);
--frame-color: var(--gray-200);
--mention-color: var(--textPrimary);
--email-toggle-color: var(--kbd-color);
--email-toggle-background: var(--blockquote-border);
--email-quoted-color: var(--blockquote-color);
--keyword-color: var(--gray-600);
--code-font: ui-monospace, Menlo, monospace;
}

View File

@ -0,0 +1,156 @@
/* Primer Colors */
/* Please also update colors_dark.css with dark mode appropriate colors when modifying this file. */
:root {
--blue-900: #05264c;
--blue-800: #032f62;
--blue-700: #044289;
--blue-600: #005cc5;
--blue-500: #0366d6;
--blue-400: #2188ff;
--blue-300: #79b8ff;
--blue-200: #c8e1ff;
--blue-100: #dbedff;
--blue-000: #f1f8ff;
--gray-1000: #050505;
--gray-950: #0b0b0d;
--gray-900: #17181a;
--gray-850: #242528;
--gray-800: #2f3037;
--gray-750: #383a42;
--gray-700: #41434e;
--gray-650: #4b4d58;
--gray-600: #525560;
--gray-550: #5e616e;
--gray-500: #6a6d7c;
--gray-450: #787c8c;
--gray-400: #9194a1;
--gray-350: #a9abb6;
--gray-300: #bfc1c9;
--gray-250: #d6d7dc;
--gray-200: #e3e4e8;
--gray-150: #eff0f5;
--gray-100: #f7f7f9;
--gray-050: #fbfbfc;
--gray-000: #ffffff;
--green-900: #144620;
--green-800: #165c26;
--green-700: #176f2c;
--green-600: #22863a;
--green-500: #28a745;
--green-400: #34d058;
--green-300: #85e89d;
--green-200: #bef5cb;
--green-100: #dcffe4;
--green-000: #f0fff4;
--yellow-900: #735c0f;
--yellow-800: #b08800;
--yellow-700: #dbab09;
--yellow-600: #f9c513;
--yellow-500: #ffd33d;
--yellow-400: #ffdf5d;
--yellow-300: #ffea7f;
--yellow-200: #fff5b1;
--yellow-100: #fffbdd;
--yellow-000: #fffdef;
--orange-900: #a04100;
--orange-800: #c24e00;
--orange-700: #d15704;
--orange-600: #e36209;
--orange-500: #f66a0a;
--orange-400: #fb8532;
--orange-300: #ffab70;
--orange-200: #ffd1ac;
--orange-100: #ffebda;
--orange-000: #fff8f2;
--red-900: #86181d;
--red-800: #9e1c23;
--red-700: #b31d28;
--red-600: #cb2431;
--red-500: #d73a49;
--red-400: #ea4a5a;
--red-300: #f97583;
--red-200: #fdaeb7;
--red-100: #ffdce0;
--red-000: #ffeef0;
--pink-900: #6d224f;
--pink-800: #99306f;
--pink-700: #b93a86;
--pink-600: #d03592;
--pink-500: #ea4aaa;
--pink-400: #ec6cb9;
--pink-300: #f692ce;
--pink-200: #f9b3dd;
--pink-100: #fedbf0;
--pink-000: #ffeef8;
--purple-900: #29134e;
--purple-800: #3a1d6e;
--purple-700: #4c2888;
--purple-600: #5a32a3;
--purple-500: #6f42c1;
--purple-400: #8a63d2;
--purple-300: #b392f0;
--purple-200: #d1bcf9;
--purple-100: #e6dcfd;
--purple-000: #f5f0ff;
--textPrimary: var(--gray-1000);
--textSecondary: var(--gray-700);
--textTertiary: var(--gray-500);
--textPlaceholder: rgba(82, 85, 96, 0.5);
--link: var(--blue-500);
--appBackground: var(--gray-000);
--backgroundSecondary: var(--gray-000);
--backgroundTertiary: var(--gray-000);
--border: rgba(65, 67, 78, 0.25);
--borderOpaque: var(--gray-300);
--iconPrimary: var(--gray-600);
--iconSecondary: var(--gray-400);
--inputBackground: rgba(65, 67, 78, 0.12);
--backgroundPrimary: var(--gray-150);
--backgroundElevatedPrimary: var(--gray-150);
--backgroundElevatedSecondary: var(--gray-000);
--backgroundElevatedTertiary: var(--gray-000);
--backgroundInset: var(--gray-200);
--link-hover: var(--gray-200);
--color-icon-success: var(--green-600);
--color-text-danger: var(--red-600);
--diffLineNumberAdditionBackground: #dcffe4;
--diffLineNumberAdditionText: #22863a;
--diffLineAdditionBackground: #f0fff4;
--diffLineNumberDeletionBackground: #ffdce0;
--diffLineNumberDeletionText: #cb2431;
--diffLineDeletionBackground: #ffeef0;
--suggestedChangeDeletionText: #ffffff;
--suggestedChangeAdditionText: #ffffff;
--suggestedChangeDeletionBackground: rgba(218,54,51,0.6);
--suggestedChangeAdditionBackground: rgba(46,160,67,0.6);
--videoBackground: #000000;
}
/* Custom Base Styles */
:root {
--link-highlight: rgba(3, 102, 214, 0.08);
--pre-background: var(--gray-100);
--code-background: var(--pre-background);
--hr-background: var(--gray-200);
--thead-background: var(--pre-background);
--thead-border: var(--hr-background);
--tr-border: var(--gray-300);
--tr-alt-background: var(--pre-background);
--kbd-background: var(--pre-background);
--kbd-color: var(--gray-650);
--kbd-border: var(--gray-250);
--blockquote-color: var(--gray-500);
--blockquote-border: var(--hr-background);
--heading-color: var(--gray-900);
--h6-color: var(--gray-500);
--frame-border: var(--hr-background);
--frame-color: var(--gray-850);
--mention-color: var(--gray-850);
--email-toggle-color: var(--kbd-color);
--email-toggle-background: var(--blockquote-border);
--email-quoted-color: var(--blockquote-color);
--keyword-color: var(--gray-400);
--code-font: ui-monospace, Menlo, monospace;
}

View File

@ -0,0 +1,587 @@
/* Shared styles between light & dark mode so all colors should be variables */
* {
box-sizing: border-box;
}
input:disabled {
touch-action: none;
}
html {
-webkit-text-size-adjust: none;
text-size-adjust: none;
font: -apple-system-body;
}
body {
color: var(--textPrimary);
background-color: var(--background);
}
a {
color: var(--link);
text-decoration: none;
-webkit-tap-highlight-color: var(--link-highlight);
word-break: break-word;
}
a:not([target]):hover {
border-radius: 5px;
background-color: var(--link-hover);
transition-duration: 0.2s;
transform: scale(1.015);
}
/*
Web views hold on to their hover event if the app is backgrounded. We need to disable custom hover effects by setting a
class on body and overriding them in CSS when we apply this workaround. When the mouse enters the web view again, we
can disable our override.
*/
body.hover-override a:not([target]) {
background-color: transparent;
transform: scale(1);
}
details summary {
outline: 0;
}
table {
border-spacing: 0;
border-collapse: collapse;
}
blockquote {
margin: 0;
}
table, table *, pre {
touch-action: pan-x;
}
.markdown-body ul.contains-task-list {
list-style: none;
padding-left: 0;
}
.task-list-item {
padding-left: 40px;
margin-left: -16px;
}
.task-list-item-checkbox {
margin-left: -24px
}
pre, code, kbd {
font-size: 1em;
font-family: var(--code-font);
}
.issue-keyword {
border-bottom: 1px dotted var(--keyword-color);
}
.team-mention, .user-mention {
font-weight: 600;
color: var(--mention-color);
white-space: nowrap;
}
.email-hidden-toggle, .email-hidden-reply {
display: none;
}
/* Fix checkboxes looking cut off when they render larger than the default size */
input[type="checkbox"] {
transform: translate(0px);
}
/* --- */
.markdown-body {
font-size: inherit;
line-height: 1.5;
word-wrap: break-word;
}
.markdown-body kbd {
display: inline-block;
padding: 0.18em 0.31em;
font-size: 0.7em;
line-height: 1.2em;
color: var(--kbd-color);
vertical-align: middle;
background-color: var(--kbd-background);
border: 1px solid var(--kbd-border);
border-radius: 0.25em;
box-shadow: inset 0 -1px 0 var(--kbd-border);
margin-right: 2px;
}
.markdown-body:after, .markdown-body:before {
display: table;
content: ""
}
.markdown-body:after {
clear: both;
}
.markdown-body > :first-child {
margin-top: 0 !important;
}
.markdown-body > :last-child {
margin-bottom: 0 !important;
}
.markdown-body a:not([href]) {
color: inherit;
text-decoration: none;
}
.markdown-body .absent {
color: var(--red-600);
}
.markdown-body .anchor {
float: left;
padding-right: 4px;
margin-left: -20px;
line-height: 1;
}
.markdown-body .anchor:focus {
outline: none;
}
.markdown-body blockquote, .markdown-body details, .markdown-body dl, .markdown-body ol, .markdown-body p, .markdown-body pre, .markdown-body table, .markdown-body ul {
margin-top: 0;
margin-bottom: 16px;
}
.markdown-body hr {
height: .25em;
padding: 0;
margin: 24px 0;
background-color: var(--hr-background);
border: 0;
}
.markdown-body blockquote {
padding-left: 1em;
color: var(--blockquote-color);
position: relative;
}
.markdown-body blockquote::before {
content: '';
width: 2px;
position: absolute;
top: 0;
bottom: 0;
left: 0;
background-color: var(--blockquote-border);
border-radius: 2px;
}
.markdown-body blockquote > :first-child {
margin-top: 0;
}
.markdown-body blockquote > :last-child {
margin-bottom: 0;
}
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 600;
line-height: 1.25;
}
.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link {
color: var(--heading-color);
vertical-align: middle;
visibility: hidden;
}
.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor {
text-decoration: none;
}
.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link {
visibility: visible;
}
.markdown-body h1 code, .markdown-body h1 tt, .markdown-body h2 code, .markdown-body h2 tt, .markdown-body h3 code, .markdown-body h3 tt, .markdown-body h4 code, .markdown-body h4 tt, .markdown-body h5 code, .markdown-body h5 tt, .markdown-body h6 code, .markdown-body h6 tt {
font-size: inherit;
}
.markdown-body h1 {
font-size: 2em;
}
.markdown-body h1, .markdown-body h2 {
padding-bottom: .3em;
border-bottom: 1px solid var(--border);
}
.markdown-body h2 {
font-size: 1.5em;
}
.markdown-body h3 {
font-size: 1.25em;
}
.markdown-body h4 {
font-size: 1em;
}
.markdown-body h5 {
font-size: .875em;
}
.markdown-body h6 {
font-size: .85em;
color: var(--h6-color);
}
.markdown-body ul {
padding-left: 1.5em;
}
.markdown-body ol.no-list, .markdown-body ul.no-list {
padding: 0;
list-style-type: none;
}
.markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body li {
word-wrap: break-all;
}
.markdown-body li > p {
margin-top: 16px;
}
.markdown-body li + li {
margin-top: .25em;
}
.markdown-body dl {
padding: 0;
}
.markdown-body dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-weight: 600;
}
.markdown-body dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.markdown-body table {
display: block;
width: 100%;
overflow: auto;
}
.markdown-body table th {
font-weight: 600;
}
.markdown-body table td, .markdown-body table th {
padding: 6px 13px;
border: 1px solid var(--thead-border);
}
.markdown-body table tr {
background-color: var(--background);
border-top: 1px solid var(--tr-border);
}
.markdown-body table tr:nth-child(2n) {
background-color: var(--tr-alt-background);
}
.markdown-body table img {
background-color: initial;
}
.markdown-body img {
max-width: 100%;
box-sizing: initial;
background-color: var(--background);
}
.markdown-body img[align=right] {
padding-left: 20px;
}
.markdown-body img[align=left] {
padding-right: 20px;
}
.markdown-body video {
max-width: 100%;
box-sizing: initial;
background-color: var(--videoBackground);
}
.markdown-body .emoji {
max-width: none;
vertical-align: text-top;
background-color: initial;
}
.markdown-body span.frame {
display: block;
overflow: hidden;
}
.markdown-body span.frame > span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid var(--frame-border);
}
.markdown-body span.frame span img {
display: block;
float: left;
}
.markdown-body span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: var(--frame-color);
}
.markdown-body span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-center > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.markdown-body span.align-center span img {
margin: 0 auto;
text-align: center;
}
.markdown-body span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-right > span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.markdown-body span.align-right span img {
margin: 0;
text-align: right;
}
.markdown-body span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.markdown-body span.float-left span {
margin: 13px 0 0;
}
.markdown-body span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.markdown-body span.float-right > span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.markdown-body code, .markdown-body tt {
padding: .2em .4em;
margin: 0;
font-size: 85%;
background-color: var(--code-background);
border-radius: 6px;
}
.markdown-body code br, .markdown-body tt br {
display: none;
}
.markdown-body del code {
text-decoration: inherit;
}
.markdown-body pre {
word-wrap: normal;
}
.markdown-body pre > code {
padding: 0;
margin: 0;
font-size: 100%;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.markdown-body .highlight {
margin-bottom: 16px;
}
.markdown-body .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.markdown-body .highlight pre, .markdown-body pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--pre-background);
border-radius: 6px;
}
.markdown-body pre code, .markdown-body pre tt {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: initial;
border: 0;
}
.markdown-body .csv-data td, .markdown-body .csv-data th {
padding: 5px;
overflow: hidden;
font-size: 12px;
line-height: 1;
text-align: left;
white-space: nowrap;
}
.markdown-body .csv-data .blob-num {
padding: 10px 8px 9px;
text-align: right;
background: var(--background);
border: 0;
}
.markdown-body .csv-data tr {
border-top: 0;
}
.markdown-body .csv-data th {
font-weight: 600;
background: var(--thead-background);
border-top: 0;
}
.open.octicon, .draft.octicon, .closed.octicon, .merged.octicon, .color-text-secondary.octicon {
display: inline-block;
margin-top: 0.15em;
vertical-align: text-top;
fill: currentColor;
width: 1em;
height: 1em;
font: -apple-system-body;
}
.open.octicon {
color: var(--color-icon-success);
}
.draft.octicon {
color: var(--textTertiary);
}
.closed.octicon {
color: var(--color-text-danger);
}
.merged.octicon {
color: var(--purple-500);
}
.color-text-secondary.octicon {
color: var(--textSecondary);
}
.reference {
white-space: nowrap;
}
.issue-link {
font-weight: 600;
color: var(--mention-color);
white-space: normal;
}
.issue-shorthand {
font-weight: 400;
color: var(--textTertiary);
}
.mr-1 {
margin-right: 4px;
}
.ml-1 {
margin-left: 4px;
}
.d-inline-block {
display: inline-block;
}
.v-align-middle {
vertical-align: middle;
}
.Box {
border-radius: 6px;
}

View File

@ -0,0 +1,124 @@
/* From https://github.com/primer/github-syntax-light/blob/master/lib/github-light.css */
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
color: #6a737d;
}
.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */,
.pl-s .pl-v /* string variable */ {
color: #005cc5;
}
.pl-e /* entity */,
.pl-en /* entity.name */ {
color: #6f42c1;
}
.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.pl-s .pl-s1 /* string source */ {
color: #24292e;
}
.pl-ent /* entity.name.tag, markup.quote */ {
color: #22863a;
}
.pl-k /* keyword, storage, storage.type */ {
color: #d73a49;
}
.pl-s /* string */,
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
color: #032f62;
}
.pl-v /* variable */,
.pl-smw /* sublimelinter.mark.warning */ {
color: #e36209;
}
.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
color: #b31d28;
}
.pl-ii /* invalid.illegal */ {
color: #fafbfc;
background-color: #b31d28;
}
.pl-c2 /* carriage-return */ {
color: #fafbfc;
background-color: #d73a49;
}
.pl-c2::before /* carriage-return */ {
content: "^M";
}
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
font-weight: bold;
color: #22863a;
}
.pl-ml /* markup.list */ {
color: #735c0f;
}
.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
font-weight: bold;
color: #005cc5;
}
.pl-mi /* markup.italic */ {
font-style: italic;
color: #24292e;
}
.pl-mb /* markup.bold */ {
font-weight: bold;
color: #24292e;
}
.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
color: #b31d28;
background-color: #ffeef0;
}
.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
color: #22863a;
background-color: #f0fff4;
}
.pl-mc /* markup.changed, punctuation.definition.changed */ {
color: #e36209;
background-color: #ffebda;
}
.pl-mi2 /* markup.ignored, markup.untracked */ {
color: #f6f8fa;
background-color: #005cc5;
}
.pl-mdr /* meta.diff.range */ {
font-weight: bold;
color: #6f42c1;
}
.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
color: #586069;
}
.pl-sg /* sublimelinter.gutter-mark */ {
color: #959da5;
}
.pl-corl /* constant.other.reference.link, string.other.link */ {
text-decoration: underline;
color: #032f62;
}

View File

@ -0,0 +1,124 @@
/* From https://github.com/primer/github-syntax-dark/blob/master/lib/github-dark.css */
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
color: #959da5;
}
.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.quote, markup.raw, meta.diff.header */,
.pl-s .pl-v /* string variable */ {
color: #c8e1ff;
}
.pl-e /* entity */,
.pl-en /* entity.name */ {
color: #b392f0;
}
.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.pl-s .pl-s1 /* string source */ {
color: #f6f8fa;
}
.pl-ent /* entity.name.tag */ {
color: #7bcc72;
}
.pl-k /* keyword, storage, storage.type */ {
color: #ea4a5a;
}
.pl-s /* string */,
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
color: #79b8ff;
}
.pl-v /* variable */,
.pl-ml /* markup.list, sublimelinter.mark.warning */ {
color: #fb8532;
}
.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
color: #d73a49;
}
.pl-ii /* invalid.illegal */ {
color: #fafbfc;
background-color: #d73a49;
}
.pl-c2 /* carriage-return */ {
color: #fafbfc;
background-color: #d73a49;
}
.pl-c2::before /* carriage-return */ {
content: "^M";
}
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
font-weight: bold;
color: #7bcc72;
}
.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
font-weight: bold;
color: #0366d6;
}
.pl-mi /* markup.italic */ {
font-style: italic;
color: #f6f8fa;
}
.pl-mb /* markup.bold */ {
font-weight: bold;
color: #f6f8fa;
}
.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
color: #ffdcd7;
background-color: #67060c;
}
.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
color: #aff5b4;
background-color: #033a16;
}
.pl-mc /* markup.changed, punctuation.definition.changed */ {
color: #b08800;
background-color: #fffdef;
}
.pl-mi2 /* markup.ignored, markup.untracked */ {
color: #2f363d;
background-color: #959da5;
}
.pl-mdr /* meta.diff.range */ {
font-weight: bold;
color: #b392f0;
}
.pl-mo /* meta.output */ {
color: #0366d6;
}
.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
color: #ffeef0;
}
.pl-sg /* sublimelinter.gutter-mark */ {
color: #6a737d;
}
.pl-corl /* constant.other.reference.link, string.other.link */ {
text-decoration: underline;
color: #79b8ff;
}

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="HandheldFriendly" content="true">
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/colors_light.css"/>
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/markdown.css"/>
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/syntax.css"/>
</head>
<body>
<main id="content" class="markdown-body">@body@</main>
</body>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="HandheldFriendly" content="true">
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/colors_dark.css"/>
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/markdown.css"/>
<link rel="stylesheet" type="text/css" href="file:///android_asset/webview/syntax_dark.css"/>
</head>
<body>
<main id="content" class="markdown-body">@body@</main>
</body>
</html>

View File

@ -27,6 +27,7 @@ import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -43,15 +44,12 @@ import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.progressindicator.CircularProgressIndicator;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.tabs.TabLayoutMediator;
import org.json.JSONObject;
import org.lsposed.manager.App;
import org.lsposed.manager.R;
import org.lsposed.manager.databinding.FragmentPagerBinding;
@ -70,6 +68,9 @@ import org.lsposed.manager.util.LinearLayoutManagerFix;
import org.lsposed.manager.util.NavUtil;
import org.lsposed.manager.util.chrome.CustomTabsURLSpan;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
@ -80,10 +81,27 @@ import rikka.widget.borderview.BorderRecyclerView;
import rikka.widget.borderview.BorderView;
public class RepoItemFragment extends BaseFragment implements RepoLoader.Listener {
private static final String HTML_TEMPLATE = readWebviewHTML("template.html");
private static final String HTML_TEMPLATE_DARK = readWebviewHTML("template_dark.html");
FragmentPagerBinding binding;
private OnlineModule module;
private ReleaseAdapter releaseAdapter;
private static String readWebviewHTML(String name) {
try {
var input = App.getInstance().getAssets().open("webview/" + name);
var result = new ByteArrayOutputStream(1024);
var buffer = new byte[1024];
for (int length; (length = input.read(buffer)) != -1; ) {
result.write(buffer, 0, length);
}
return result.toString(StandardCharsets.UTF_8.name());
} catch (IOException e) {
Log.e(App.TAG, "read webview HTML", e);
return "<html><body>@body@</body></html>";
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -126,26 +144,26 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene
private void renderGithubMarkdown(WebView view, String text) {
try {
var json = new JSONObject();
json.put("text", text);
view.setBackgroundColor(Color.TRANSPARENT);
var setting = view.getSettings();
setting.setOffscreenPreRaster(true);
setting.setDomStorageEnabled(true);
setting.setAppCacheEnabled(true);
setting.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
setting.setAllowContentAccess(false);
setting.setAllowFileAccessFromFileURLs(true);
setting.setAllowFileAccess(false);
setting.setGeolocationEnabled(false);
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
WebSettingsCompat.setForceDark(setting, WebSettingsCompat.FORCE_DARK_ON);
}
}
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK_STRATEGY)) {
WebSettingsCompat.setForceDarkStrategy(setting, WebSettingsCompat.DARK_STRATEGY_PREFER_WEB_THEME_OVER_USER_AGENT_DARKENING);
}
setting.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
String body;
int nightModeFlags = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
body = HTML_TEMPLATE_DARK.replace("@body@", text);
} else {
body = HTML_TEMPLATE.replace("@body@", text);
}
body = body.replace("src=\"/", "src=\"/Xposed-Modules-Repo/" + module.getName() + "/raw/main/")
.replace("href=\"/", "href=\"/Xposed-Modules-Repo/" + module.getName() + "/blob/main/");
view.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
@ -154,10 +172,10 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene
return true;
}
});
view.loadDataWithBaseURL(null, "<html><head><style>body{overflow-wrap: anywhere;font-size: 3vw;}code{word-break: break-all;}</style></head><body>" + text + "</body></html>",
"text/html; charset=utf-8", "utf-8", null);
view.loadDataWithBaseURL("https://github.com", body, "text/html",
StandardCharsets.UTF_8.name(), null);
} catch (Throwable e) {
android.util.Log.e(App.TAG, "render readme", e);
Log.e(App.TAG, "render readme", e);
}
}