Compare commits

..

18 Commits

Author SHA1 Message Date
Tom Moor bfaed5d9cb test 2022-09-05 15:38:00 +02:00
Tom Moor 5923281edb Allow arbitrary revisions to be compared 2022-09-05 13:55:07 +02:00
Tom Moor 01bfe2bde7 Add revisions.diff endpoint, first version 2022-09-05 13:35:27 +02:00
Tom Moor 9c6780adab Allow DocumentHelper to be used with Revisions 2022-09-05 12:58:40 +02:00
Tom Moor 93f1d4cfc7 div>article for easier programatic content extraction 2022-09-05 11:52:12 +02:00
Tom Moor 21a43dfc5e Refactor to allow for styling of HTML export 2022-09-04 22:57:54 +02:00
Tom Moor 47fafb5d69 fix nodes that required document to render 2022-09-04 17:29:02 +02:00
Tom Moor 32d76eeb9e docs 2022-09-04 17:07:26 +02:00
Tom Moor 99bef2c02b Add HTML download option to UI 2022-09-04 16:30:35 +02:00
Tom Moor 1125412972 fix: Add compatability for documents without collab state 2022-09-04 16:10:03 +02:00
Tom Moor 2e0d160fcc Add title to HTML export 2022-09-04 15:58:59 +02:00
Tom Moor 21e31be517 tidy 2022-09-04 15:31:42 +02:00
Translate-O-Tron 18821fdee2 New Crowdin updates (#4004) 2022-09-04 03:56:48 -07:00
Tom Moor c8b12a59e2 fix: Post-signin redirect path is no longer saved (#4054)
closes #4045
2022-09-04 03:56:12 -07:00
Tom Moor c964163cc5 fix: Handle GitLab can be configured for tokens to not expire. (#4051)
closes #4040
2022-09-04 03:56:00 -07:00
Tom Moor c9156ae399 fix: Login screen not vertically centered on mobile (#4052) 2022-09-04 00:14:32 -07:00
Tom Moor e0e87ea6a2 fix: Allow backlinks to work with fully qualified urls and anchors (#4050)
closes #4048
2022-09-04 00:14:21 -07:00
Tom Moor e1b0e94fd5 Wrap code blocks when printing, closes #4001 2022-09-03 23:39:22 +02:00
62 changed files with 2280 additions and 1950 deletions
+32 -5
View File
@@ -179,12 +179,12 @@ export const unsubscribeDocument = createAction({
},
});
export const downloadDocument = createAction({
name: ({ t, isContextMenu }) =>
isContextMenu ? t("Download") : t("Download document"),
export const downloadDocumentAsHTML = createAction({
name: ({ t }) => t("HTML"),
section: DocumentSection,
keywords: "html export",
icon: <DownloadIcon />,
keywords: "export",
iconInContextMenu: false,
visible: ({ activeDocumentId, stores }) =>
!!activeDocumentId && stores.policies.abilities(activeDocumentId).download,
perform: ({ activeDocumentId, stores }) => {
@@ -193,10 +193,37 @@ export const downloadDocument = createAction({
}
const document = stores.documents.get(activeDocumentId);
document?.download();
document?.download("text/html");
},
});
export const downloadDocumentAsMarkdown = createAction({
name: ({ t }) => t("Markdown"),
section: DocumentSection,
keywords: "md markdown export",
icon: <DownloadIcon />,
iconInContextMenu: false,
visible: ({ activeDocumentId, stores }) =>
!!activeDocumentId && stores.policies.abilities(activeDocumentId).download,
perform: ({ activeDocumentId, stores }) => {
if (!activeDocumentId) {
return;
}
const document = stores.documents.get(activeDocumentId);
document?.download("text/markdown");
},
});
export const downloadDocument = createAction({
name: ({ t, isContextMenu }) =>
isContextMenu ? t("Download") : t("Download document"),
section: DocumentSection,
icon: <DownloadIcon />,
keywords: "export",
children: [downloadDocumentAsHTML, downloadDocumentAsMarkdown],
});
export const duplicateDocument = createAction({
name: ({ t, isContextMenu }) =>
isContextMenu ? t("Duplicate") : t("Duplicate document"),
+1 -1
View File
@@ -2,10 +2,10 @@ import { observer } from "mobx-react";
import * as React from "react";
import { ThemeProvider } from "styled-components";
import { breakpoints } from "@shared/styles";
import GlobalStyles from "@shared/styles/globals";
import { dark, light, lightMobile, darkMobile } from "@shared/styles/theme";
import useMediaQuery from "~/hooks/useMediaQuery";
import useStores from "~/hooks/useStores";
import GlobalStyles from "~/styles/globals";
const Theme: React.FC = ({ children }) => {
const { ui } = useStores();
@@ -1,7 +1,12 @@
import Tippy from "@tippy.js/react";
import Tippy, { TippyProps } from "@tippy.js/react";
import { TFunctionResult } from "i18next";
import * as React from "react";
import styled from "styled-components";
import { Props } from ".";
export type Props = Omit<TippyProps, "content" | "theme"> & {
tooltip: React.ReactChild | React.ReactChild[] | TFunctionResult;
shortcut?: React.ReactNode;
};
function Tooltip({ shortcut, tooltip, delay = 50, ...rest }: Props) {
let content = <>{tooltip}</>;
-22
View File
@@ -1,22 +0,0 @@
import type { TippyProps } from "@tippy.js/react";
import { TFunctionResult } from "i18next";
import React from "react";
export type Props = Omit<TippyProps, "content" | "theme"> & {
tooltip: React.ReactChild | React.ReactChild[] | TFunctionResult;
shortcut?: React.ReactNode;
};
const LazyTooltip = React.lazy(() => {
return import(/* webpackChunkName: "tooltip" */ "./Tooltip");
});
const Tooltip = (props: Props) => {
return (
<React.Suspense fallback={null}>
<LazyTooltip {...props} />
</React.Suspense>
);
};
export default Tooltip;
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -16,6 +16,7 @@ import { EditorState, Selection, Plugin, Transaction } from "prosemirror-state";
import { Decoration, EditorView } from "prosemirror-view";
import * as React from "react";
import { DefaultTheme, ThemeProps } from "styled-components";
import EditorContainer from "@shared/editor/components/Styles";
import { EmbedDescriptor } from "@shared/editor/embeds";
import Extension, { CommandFactory } from "@shared/editor/lib/Extension";
import ExtensionManager from "@shared/editor/lib/ExtensionManager";
@@ -40,7 +41,6 @@ import EmojiMenu from "./components/EmojiMenu";
import { SearchResult } from "./components/LinkEditor";
import LinkToolbar from "./components/LinkToolbar";
import SelectionToolbar from "./components/SelectionToolbar";
import EditorContainer from "./components/Styles";
import WithTheme from "./components/WithTheme";
export { default as Extension } from "@shared/editor/lib/Extension";
+1 -1
View File
@@ -296,6 +296,7 @@ function DocumentMenu({
{
type: "separator",
},
actionToMenuItem(downloadDocument, context),
{
type: "route",
title: t("History"),
@@ -305,7 +306,6 @@ function DocumentMenu({
visible: canViewHistory,
icon: <HistoryIcon />,
},
actionToMenuItem(downloadDocument, context),
{
type: "button",
title: t("Print"),
+14 -17
View File
@@ -2,10 +2,10 @@ import { addDays, differenceInDays } from "date-fns";
import { floor } from "lodash";
import { action, autorun, computed, observable, set } from "mobx";
import parseTitle from "@shared/utils/parseTitle";
import unescape from "@shared/utils/unescape";
import DocumentsStore from "~/stores/DocumentsStore";
import User from "~/models/User";
import type { NavigationNode } from "~/types";
import { client } from "~/utils/ApiClient";
import Storage from "~/utils/Storage";
import ParanoidModel from "./ParanoidModel";
import View from "./View";
@@ -419,21 +419,18 @@ export default class Document extends ParanoidModel {
};
}
download = async () => {
// Ensure the document is upto date with latest server contents
await this.fetch();
const body = unescape(this.text);
const blob = new Blob([`# ${this.title}\n\n${body}`], {
type: "text/markdown",
});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
// Firefox support requires the anchor tag be in the DOM to trigger the dl
if (document.body) {
document.body.appendChild(a);
}
a.href = url;
a.download = `${this.titleWithDefault}.md`;
a.click();
download = async (contentType: "text/html" | "text/markdown") => {
await client.post(
`/documents.export`,
{
id: this.id,
},
{
download: true,
headers: {
accept: contentType,
},
}
);
};
}
+1 -1
View File
@@ -243,7 +243,7 @@ const CheckEmailIcon = styled(EmailIcon)`
const Background = styled(Fade)`
width: 100vw;
height: 100vh;
height: 100%;
background: ${(props) => props.theme.background};
display: flex;
`;
+9 -6
View File
@@ -260,12 +260,6 @@ export default class AuthStore {
@action
logout = async (savePath = false) => {
if (!this.token) {
return;
}
client.post(`/auth.delete`);
// if this logout was forced from an authenticated route then
// save the current path so we can go back there once signed in
if (savePath) {
@@ -276,10 +270,19 @@ export default class AuthStore {
}
}
// If there is no auth token stored there is nothing else to do
if (!this.token) {
return;
}
// invalidate authentication token on server
client.post(`/auth.delete`);
// remove authentication token itself
removeCookie("accessToken", {
path: "/",
});
// remove session record on apex cookie
const team = this.team;
+2
View File
@@ -25,6 +25,7 @@ type Options = {
type FetchOptions = {
download?: boolean;
headers?: Record<string, string>;
};
const fetchWithRetry = retry(fetch);
@@ -81,6 +82,7 @@ class ApiClient {
"cache-control": "no-cache",
"x-editor-version": EDITOR_VERSION,
pragma: "no-cache",
...options?.headers,
};
// for multipart forms or other non JSON requests fetch
-1
View File
@@ -67,7 +67,6 @@ export default function download(
if ("download" in a) {
a.href = url;
a.setAttribute("download", fn);
a.innerHTML = "downloading…";
D.body && D.body.appendChild(a);
setTimeout(function () {
a.click();
+3 -1
View File
@@ -12,7 +12,7 @@
"build": "yarn clean && yarn build:webpack && yarn build:i18n && yarn build:server",
"start": "node ./build/server/index.js",
"dev": "NODE_ENV=development yarn concurrently -n api,collaboration -c \"blue,magenta\" \"node --inspect=0.0.0.0 build/server/index.js --services=collaboration,websockets,admin,web,worker\"",
"dev:watch": "nodemon --exec \"yarn build:server && yarn dev\" -e js,ts --ignore build/ --ignore app/ --ignore shared/editor",
"dev:watch": "nodemon --exec \"yarn build:server && yarn dev\" -e js,ts,tsx --ignore build/ --ignore app/ --ignore shared/editor",
"lint": "eslint app server shared",
"deploy": "git push heroku master",
"prepare": "husky install",
@@ -108,6 +108,7 @@
"invariant": "^2.2.4",
"ioredis": "^4.28.5",
"is-printable-key-event": "^1.0.0",
"jsdom": "^20.0.0",
"json-loader": "0.5.4",
"jsonwebtoken": "^8.5.0",
"jszip": "^3.10.0",
@@ -136,6 +137,7 @@
"mobx-react": "^6.3.1",
"natural-sort": "^1.0.0",
"node-fetch": "2.6.7",
"node-htmldiff": "^0.9.4",
"nodemailer": "^6.6.1",
"outline-icons": "^1.44.0",
"oy-vey": "^0.11.2",
+3
View File
@@ -13,6 +13,7 @@ type Props = {
id?: string;
shareId?: string;
user?: User;
includeState?: boolean;
};
type Result = {
@@ -25,6 +26,7 @@ export default async function loadDocument({
id,
shareId,
user,
includeState,
}: Props): Promise<Result> {
let document;
let collection;
@@ -156,6 +158,7 @@ export default async function loadDocument({
document = await Document.findByPk(id as string, {
userId: user ? user.id : undefined,
paranoid: false,
includeState,
});
if (!document) {
+2 -1
View File
@@ -1,5 +1,6 @@
import { Transaction } from "sequelize";
import { Event, Document, User } from "@server/models";
import DocumentHelper from "@server/models/helpers/DocumentHelper";
type Props = {
/** The user updating the document */
@@ -62,7 +63,7 @@ export default async function documentUpdater({
}
if (text !== undefined) {
if (user.team?.collaborativeEditing) {
document.updateFromMarkdown(text, append);
document = DocumentHelper.applyMarkdownToDocument(document, text, append);
} else if (append) {
document.text += text;
} else {
@@ -1,129 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders blockquote 1`] = `
"<blockquote>
<p>blockquote</p>
</blockquote>"
`;
exports[`renders bold marks 1`] = `"<p>this is <strong>bold</strong> text</p>"`;
exports[`renders bullet list 1`] = `
"<ul>
<li>item one</li>
<li>item two
<ul>
<li>nested item</li>
</ul>
</li>
</ul>"
`;
exports[`renders checkbox list 1`] = `
"<ul>
<li class=\\"checkbox-list-item\\"><span class=\\"checkbox \\">[ ]</span>unchecked</li>
<li class=\\"checkbox-list-item\\"><span class=\\"checkbox checked\\">[x]</span>checked</li>
</ul>"
`;
exports[`renders code block 1`] = `
"<pre><code>this is indented code
</code></pre>"
`;
exports[`renders code fence 1`] = `
"<pre><code class=\\"language-javascript\\">this is code
</code></pre>"
`;
exports[`renders code marks 1`] = `"<p>this is <code>inline code</code> text</p>"`;
exports[`renders headings 1`] = `
"<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>"
`;
exports[`renders highlight marks 1`] = `"<p>this is <span class=\\"highlight\\">highlighted</span> text</p>"`;
exports[`renders horizontal rule 1`] = `"<hr>"`;
exports[`renders image 1`] = `"<p><img src=\\"https://lorempixel.com/200/200\\" alt=\\"caption\\"></p>"`;
exports[`renders image with alignment 1`] = `"<p><img src=\\"https://lorempixel.com/200/200\\" alt=\\"caption\\" title=\\"left-40\\"></p>"`;
exports[`renders info notice 1`] = `
"<div class=\\"notice notice-info\\">
<p>content of notice</p>
</div>"
`;
exports[`renders italic marks 1`] = `"<p>this is <em>italic</em> text</p>"`;
exports[`renders italic marks 2`] = `"<p>this is <em>also italic</em> text</p>"`;
exports[`renders link marks 1`] = `"<p>this is <a href=\\"https://www.example.com\\">linked</a> text</p>"`;
exports[`renders ordered list 1`] = `
"<ol>
<li>item one</li>
<li>item two</li>
</ol>"
`;
exports[`renders ordered list 2`] = `
"<ol>
<li>item one</li>
<li>item two</li>
</ol>"
`;
exports[`renders plain text as paragraph 1`] = `"<p>plain text</p>"`;
exports[`renders table 1`] = `
"<table>
<tr>
<th>
<p>heading</p></th>
<th style=\\"text-align:center\\">
<p>centered</p></th>
<th style=\\"text-align:right\\">
<p>right aligned</p></th>
</tr>
<tr>
<td>
<p></p></td>
<td style=\\"text-align:center\\">
<p>center</p></td>
<td style=\\"text-align:right\\">
<p></p></td>
</tr>
<tr>
<td>
<p></p></td>
<td style=\\"text-align:center\\">
<p></p></td>
<td style=\\"text-align:right\\">
<p>bottom r</p></td>
</tr>
</table>"
`;
exports[`renders template placeholder marks 1`] = `"<p>this is <span class=\\"placeholder\\">a placeholder</span></p>"`;
exports[`renders tip notice 1`] = `
"<div class=\\"notice notice-tip\\">
<p>content of notice</p>
</div>"
`;
exports[`renders underline marks 1`] = `"<p>this is <underline>underlined</underline> text</p>"`;
exports[`renders underline marks 2`] = `"<p>this is <s>strikethrough</s> text</p>"`;
exports[`renders warning notice 1`] = `
"<div class=\\"notice notice-warning\\">
<p>content of notice</p>
</div>"
`;
-4
View File
@@ -1,7 +1,6 @@
import { Schema } from "prosemirror-model";
import ExtensionManager from "@shared/editor/lib/ExtensionManager";
import fullPackage from "@shared/editor/packages/full";
import render from "./renderToHtml";
const extensions = new ExtensionManager(fullPackage);
@@ -16,6 +15,3 @@ export const parser = extensions.parser({
});
export const serializer = extensions.serializer();
export const renderToHtml = (markdown: string): string =>
render(markdown, extensions.rulePlugins);
-154
View File
@@ -1,154 +0,0 @@
import renderToHtml from "./renderToHtml";
test("renders an empty string", () => {
expect(renderToHtml("")).toBe("");
});
test("renders plain text as paragraph", () => {
expect(renderToHtml("plain text")).toMatchSnapshot();
});
test("renders blockquote", () => {
expect(renderToHtml("> blockquote")).toMatchSnapshot();
});
test("renders code block", () => {
expect(
renderToHtml(`
this is indented code
`)
).toMatchSnapshot();
});
test("renders code fence", () => {
expect(
renderToHtml(`\`\`\`javascript
this is code
\`\`\``)
).toMatchSnapshot();
});
test("renders checkbox list", () => {
expect(
renderToHtml(`- [ ] unchecked
- [x] checked`)
).toMatchSnapshot();
});
test("renders bullet list", () => {
expect(
renderToHtml(`- item one
- item two
- nested item`)
).toMatchSnapshot();
});
test("renders info notice", () => {
expect(
renderToHtml(`:::info
content of notice
:::`)
).toMatchSnapshot();
});
test("renders warning notice", () => {
expect(
renderToHtml(`:::warning
content of notice
:::`)
).toMatchSnapshot();
});
test("renders tip notice", () => {
expect(
renderToHtml(`:::tip
content of notice
:::`)
).toMatchSnapshot();
});
test("renders headings", () => {
expect(
renderToHtml(`# Heading 1
## Heading 2
### Heading 3
#### Heading 4`)
).toMatchSnapshot();
});
test("renders horizontal rule", () => {
expect(renderToHtml(`---`)).toMatchSnapshot();
});
test("renders image", () => {
expect(
renderToHtml(`![caption](https://lorempixel.com/200/200)`)
).toMatchSnapshot();
});
test("renders image with alignment", () => {
expect(
renderToHtml(`![caption](https://lorempixel.com/200/200 "left-40")`)
).toMatchSnapshot();
});
test("renders table", () => {
expect(
renderToHtml(`
| heading | centered | right aligned |
|---------|:--------:|--------------:|
| | center | |
| | | bottom r |
`)
).toMatchSnapshot();
});
test("renders bold marks", () => {
expect(renderToHtml(`this is **bold** text`)).toMatchSnapshot();
});
test("renders code marks", () => {
expect(renderToHtml(`this is \`inline code\` text`)).toMatchSnapshot();
});
test("renders highlight marks", () => {
expect(renderToHtml(`this is ==highlighted== text`)).toMatchSnapshot();
});
test("renders italic marks", () => {
expect(renderToHtml(`this is *italic* text`)).toMatchSnapshot();
expect(renderToHtml(`this is _also italic_ text`)).toMatchSnapshot();
});
test("renders template placeholder marks", () => {
expect(renderToHtml(`this is !!a placeholder!!`)).toMatchSnapshot();
});
test("renders underline marks", () => {
expect(renderToHtml(`this is __underlined__ text`)).toMatchSnapshot();
});
test("renders link marks", () => {
expect(
renderToHtml(`this is [linked](https://www.example.com) text`)
).toMatchSnapshot();
});
test("renders underline marks", () => {
expect(renderToHtml(`this is ~~strikethrough~~ text`)).toMatchSnapshot();
});
test("renders ordered list", () => {
expect(
renderToHtml(`1. item one
1. item two`)
).toMatchSnapshot();
expect(
renderToHtml(`1. item one
2. item two`)
).toMatchSnapshot();
});
-31
View File
@@ -1,31 +0,0 @@
import { PluginSimple } from "markdown-it";
import createMarkdown from "@shared/editor/lib/markdown/rules";
import attachmentsRule from "@shared/editor/rules/attachments";
import breakRule from "@shared/editor/rules/breaks";
import checkboxRule from "@shared/editor/rules/checkboxes";
import embedsRule from "@shared/editor/rules/embeds";
import emojiRule from "@shared/editor/rules/emoji";
import markRule from "@shared/editor/rules/mark";
import noticesRule from "@shared/editor/rules/notices";
import tablesRule from "@shared/editor/rules/tables";
import underlinesRule from "@shared/editor/rules/underlines";
const defaultRules = [
embedsRule([]),
breakRule,
checkboxRule,
markRule({ delim: "==", mark: "highlight" }),
markRule({ delim: "!!", mark: "placeholder" }),
underlinesRule,
tablesRule,
noticesRule,
attachmentsRule,
emojiRule,
];
export default function renderToHtml(
markdown: string,
rulePlugins: PluginSimple[] = defaultRules
): string {
return createMarkdown({ plugins: rulePlugins }).render(markdown).trim();
}
+3 -38
View File
@@ -1,4 +1,3 @@
import { updateYFragment } from "@getoutline/y-prosemirror";
import removeMarkdown from "@tommoor/remove-markdown";
import invariant from "invariant";
import { compact, find, map, uniq } from "lodash";
@@ -34,14 +33,12 @@ import {
} from "sequelize-typescript";
import MarkdownSerializer from "slate-md-serializer";
import isUUID from "validator/lib/isUUID";
import * as Y from "yjs";
import { DateFilter } from "@shared/types";
import getTasks from "@shared/utils/getTasks";
import parseTitle from "@shared/utils/parseTitle";
import unescape from "@shared/utils/unescape";
import { SLUG_URL_REGEX } from "@shared/utils/urlHelpers";
import { DocumentValidation } from "@shared/validations";
import { parser } from "@server/editor";
import slugify from "@server/utils/slugify";
import Backlink from "./Backlink";
import Collection from "./Collection";
@@ -482,7 +479,7 @@ class Document extends ParanoidModel {
query: string,
options: SearchOptions = {}
): Promise<SearchResponse> {
const wildcardQuery = `${escape(query)}:*`;
const wildcardQuery = `${escapeQuery(query)}:*`;
const {
snippetMinWords = 20,
snippetMaxWords = 30,
@@ -610,7 +607,7 @@ class Document extends ParanoidModel {
limit = 15,
offset = 0,
} = options;
const wildcardQuery = `${escape(query)}:*`;
const wildcardQuery = `${escapeQuery(query)}:*`;
// Ensure we're filtering by the users accessible collections. If
// collectionId is passed as an option it is assumed that the authorization
@@ -731,38 +728,6 @@ class Document extends ParanoidModel {
// instance methods
updateFromMarkdown = (text: string, append = false) => {
this.text = append ? this.text + text : text;
if (this.state) {
const ydoc = new Y.Doc();
Y.applyUpdate(ydoc, this.state);
const type = ydoc.get("default", Y.XmlFragment) as Y.XmlFragment;
const doc = parser.parse(this.text);
if (!type.doc) {
throw new Error("type.doc not found");
}
// apply new document to existing ydoc
updateYFragment(type.doc, type, doc, new Map());
const state = Y.encodeStateAsUpdate(ydoc);
this.state = Buffer.from(state);
this.changed("state", true);
}
};
toMarkdown = () => {
const text = unescape(this.text);
if (this.version) {
return `# ${this.title}\n\n${text}`;
}
return text;
};
migrateVersion = () => {
let migrated = false;
@@ -1054,7 +1019,7 @@ class Document extends ParanoidModel {
};
}
function escape(query: string): string {
function escapeQuery(query: string): string {
// replace "\" with escaped "\\" because sequelize.escape doesn't do it
// https://github.com/sequelize/sequelize/issues/2950
return Document.sequelize!.escape(query).replace(/\\/g, "\\\\");
+15 -1
View File
@@ -1,4 +1,4 @@
import { FindOptions } from "sequelize";
import { FindOptions, Op } from "sequelize";
import {
DataType,
BelongsTo,
@@ -97,6 +97,20 @@ class Revision extends IdModel {
);
}
// instance methods
previous(): Promise<Revision | null> {
return (this.constructor as typeof Revision).findOne({
where: {
documentId: this.documentId,
createdAt: {
[Op.lt]: this.createdAt,
},
},
order: [["createdAt", "DESC"]],
});
}
migrateVersion = function () {
let migrated = false;
+8 -2
View File
@@ -142,7 +142,13 @@ class UserAuthentication extends IdModel {
authenticationProvider: AuthenticationProvider,
options: SaveOptions
): Promise<boolean> {
if (this.expiresAt > addMinutes(Date.now(), 5) || !this.refreshToken) {
if (
this.expiresAt > addMinutes(Date.now(), 5) ||
!this.refreshToken ||
// Some providers send no expiry depending on setup, in this case we can't
// refresh and assume the session is valid until logged out.
!this.expiresAt
) {
return false;
}
@@ -162,7 +168,7 @@ class UserAuthentication extends IdModel {
}
this.accessToken = response.accessToken;
this.expiresAt = response.expiresAt;
this.save(options);
await this.save(options);
}
Logger.info("utils", "Successfully refreshed expired access token", {
+188
View File
@@ -0,0 +1,188 @@
import {
updateYFragment,
yDocToProsemirrorJSON,
} from "@getoutline/y-prosemirror";
import { JSDOM } from "jsdom";
import diff from "node-htmldiff";
import { Node, DOMSerializer } from "prosemirror-model";
import * as React from "react";
import { renderToString } from "react-dom/server";
import styled, { ServerStyleSheet, ThemeProvider } from "styled-components";
import * as Y from "yjs";
import EditorContainer from "@shared/editor/components/Styles";
import GlobalStyles from "@shared/styles/globals";
import light from "@shared/styles/theme";
import unescape from "@shared/utils/unescape";
import { parser, schema } from "@server/editor";
import Logger from "@server/logging/Logger";
import type Document from "@server/models/Document";
import type Revision from "@server/models/Revision";
export default class DocumentHelper {
/**
* Returns the document as a Prosemirror Node. This method uses the
* collaborative state if available, otherwise it falls back to Markdown->HTML.
*
* @param document The document or revision to convert
* @returns The document content as a Prosemirror Node
*/
static toProsemirror(document: Document | Revision) {
if ("state" in document && document.state) {
const ydoc = new Y.Doc();
Y.applyUpdate(ydoc, document.state);
return Node.fromJSON(schema, yDocToProsemirrorJSON(ydoc, "default"));
}
return parser.parse(document.text);
}
/**
* Returns the document as Markdown. This is a lossy conversion and should
* only be used for export.
*
* @param document The document or revision to convert
* @returns The document title and content as a Markdown string
*/
static toMarkdown(document: Document | Revision) {
const text = unescape(document.text);
if (document.version) {
return `# ${document.title}\n\n${text}`;
}
return text;
}
/**
* Returns the document as plain HTML. This is a lossy conversion and should
* only be used for export.
*
* @param document The document or revision to convert
* @returns The document title and content as a HTML string
*/
static toHTML(document: Document | Revision) {
const node = DocumentHelper.toProsemirror(document);
const sheet = new ServerStyleSheet();
let html, styleTags;
const Centered = styled.article`
max-width: 46em;
margin: 0 auto;
padding: 0 1em;
`;
// First render the containing document which has all the editor styles,
// global styles, layout and title.
try {
html = renderToString(
sheet.collectStyles(
<ThemeProvider theme={light}>
<>
<GlobalStyles />
<Centered>
<h1>{document.title}</h1>
<EditorContainer rtl={false}>
<div id="content" className="ProseMirror"></div>
</EditorContainer>
</Centered>
</>
</ThemeProvider>
)
);
styleTags = sheet.getStyleTags();
} catch (error) {
Logger.error("Failed to render styles on document export", error, {
id: document.id,
});
} finally {
sheet.seal();
}
// Render the Prosemirror document using virtual DOM and serialize the
// result to a string
const dom = new JSDOM(`<!DOCTYPE html>${styleTags}${html}`);
const doc = dom.window.document;
const target = doc.getElementById("content");
DOMSerializer.fromSchema(schema).serializeFragment(
node.content,
{
document: doc,
},
// @ts-expect-error incorrect library type, third argument is target node
target
);
return dom.serialize();
}
/**
* Generates a HTML diff between after documents or revisions.
*
* @param before The before document
* @param after The after document
* @returns The diff as a HTML string
*/
static diff(before: Document | Revision | null, after: Revision) {
if (!before) {
return DocumentHelper.toHTML(after);
}
const beforeHTML = DocumentHelper.toHTML(before);
const afterHTML = DocumentHelper.toHTML(after);
const beforeDOM = new JSDOM(beforeHTML);
const afterDOM = new JSDOM(afterHTML);
// Extract the content from the article tag and diff the HTML, we don't
// care about the surrounding layout and stylesheets.
const diffedContentAsHTML = diff(
beforeDOM.window.document.getElementsByTagName("article")[0].innerHTML,
afterDOM.window.document.getElementsByTagName("article")[0].innerHTML
);
// Inject the diffed content into the original document with styling and
// serialize back to a string.
beforeDOM.window.document.getElementsByTagName(
"article"
)[0].innerHTML = diffedContentAsHTML;
return beforeDOM.serialize();
}
/**
* Applies the given Markdown to the document, this essentially creates a
* single change in the collaborative state that makes all the edits to get
* to the provided Markdown.
*
* @param document The document to apply the changes to
* @param text The markdown to apply
* @param append If true appends the markdown instead of replacing existing
* content
* @returns The document
*/
static applyMarkdownToDocument(
document: Document,
text: string,
append = false
) {
document.text = append ? document.text + text : text;
if (document.state) {
const ydoc = new Y.Doc();
Y.applyUpdate(ydoc, document.state);
const type = ydoc.get("default", Y.XmlFragment) as Y.XmlFragment;
const doc = parser.parse(document.text);
if (!type.doc) {
throw new Error("type.doc not found");
}
// apply new document to existing ydoc
updateYFragment(type.doc, type, doc, new Map());
const state = Y.encodeStateAsUpdate(ydoc);
document.state = Buffer.from(state);
document.changed("state", true);
}
return document;
}
}
+23 -7
View File
@@ -8,6 +8,7 @@ import {
SearchQuery,
Event,
} from "@server/models";
import DocumentHelper from "@server/models/helpers/DocumentHelper";
import {
buildShare,
buildCollection,
@@ -462,7 +463,22 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should return document text with accept=text/markdown", async () => {
const { user, document } = await seed();
const res = await server.post("/api/documents.export", {
body: {
token: user.getJwtToken(),
id: document.id,
},
headers: {
accept: "text/markdown",
},
});
const body = await res.text();
expect(body).toEqual(DocumentHelper.toMarkdown(document));
});
it("should return archived document", async () => {
@@ -476,7 +492,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should not return published document in collection not a member of", async () => {
@@ -509,7 +525,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should return document from shareId without token", async () => {
@@ -526,7 +542,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should not return document from revoked shareId", async () => {
@@ -576,7 +592,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should return draft document from shareId with token", async () => {
@@ -596,7 +612,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should return document from shareId in collection not a member of", async () => {
@@ -616,7 +632,7 @@ describe("#documents.export", () => {
});
const body = await res.json();
expect(res.status).toEqual(200);
expect(body.data).toEqual(document.toMarkdown());
expect(body.data).toEqual(DocumentHelper.toMarkdown(document));
});
it("should require authorization without token", async () => {
+35 -1
View File
@@ -1,6 +1,7 @@
import fs from "fs-extra";
import invariant from "invariant";
import Router from "koa-router";
import mime from "mime-types";
import { Op, ScopeOptions, WhereOptions } from "sequelize";
import { subtractDate } from "@shared/utils/date";
import documentCreator from "@server/commands/documentCreator";
@@ -27,6 +28,7 @@ import {
User,
View,
} from "@server/models";
import DocumentHelper from "@server/models/helpers/DocumentHelper";
import { authorize, cannot } from "@server/policies";
import {
presentCollection,
@@ -439,14 +441,46 @@ router.post(
async (ctx) => {
const { id, shareId } = ctx.body;
assertPresent(id || shareId, "id or shareId is required");
const { user } = ctx.state;
const accept = ctx.request.headers["accept"];
const { document } = await documentLoader({
id,
shareId,
user,
// We need the collaborative state to generate HTML.
includeState: accept === "text/html",
});
let contentType;
let content;
if (accept?.includes("text/html")) {
contentType = "text/html";
content = DocumentHelper.toHTML(document);
} else if (accept?.includes("text/markdown")) {
contentType = "text/markdown";
content = DocumentHelper.toMarkdown(document);
} else {
contentType = "application/json";
content = DocumentHelper.toMarkdown(document);
}
if (contentType !== "application/json") {
ctx.set("Content-Type", contentType);
ctx.set(
"Content-Disposition",
`attachment; filename="${document.title}.${mime.extension(
contentType
)}"`
);
ctx.body = content;
return;
}
ctx.body = {
data: document.toMarkdown(),
data: content,
};
}
);
+85
View File
@@ -39,6 +39,91 @@ describe("#revisions.info", () => {
});
});
describe("#revisions.diff", () => {
it("should return the document HTML if no previous revision", async () => {
const { user, document } = await seed();
const revision = await Revision.createFromDocument(document);
const res = await server.post("/api/revisions.diff", {
body: {
token: user.getJwtToken(),
id: revision.id,
},
});
const body = await res.json();
expect(res.status).toEqual(200);
// Can't compare entire HTML output due to generated class names
expect(body.data).toContain("<html");
expect(body.data).toContain("<style");
expect(body.data).toContain("<h1");
expect(body.data).not.toContain("<ins");
expect(body.data).not.toContain("<del");
expect(body.data).toContain(document.title);
});
it("should allow returning HTML directly with accept header", async () => {
const { user, document } = await seed();
const revision = await Revision.createFromDocument(document);
const res = await server.post("/api/revisions.diff", {
body: {
token: user.getJwtToken(),
id: revision.id,
},
headers: {
accept: "text/html",
},
});
const body = await res.text();
expect(res.status).toEqual(200);
// Can't compare entire HTML output due to generated class names
expect(body).toContain("<html");
expect(body).toContain("<style");
expect(body).toContain("<h1");
expect(body).not.toContain("<ins");
expect(body).not.toContain("<del");
expect(body).toContain(document.title);
});
it("should compare to previous revision by default", async () => {
const { user, document } = await seed();
await Revision.createFromDocument(document);
await document.update({ text: "New text" });
const revision1 = await Revision.createFromDocument(document);
const res = await server.post("/api/revisions.diff", {
body: {
token: user.getJwtToken(),
id: revision1.id,
},
});
const body = await res.json();
expect(res.status).toEqual(200);
// Can't compare entire HTML output due to generated class names
expect(body.data).toContain("<html");
expect(body.data).toContain("<style");
expect(body.data).toContain("<h1");
expect(body.data).toContain("<ins");
expect(body.data).toContain("<del");
expect(body.data).toContain(document.title);
});
it("should require authorization", async () => {
const document = await buildDocument();
const revision = await Revision.createFromDocument(document);
const user = await buildUser();
const res = await server.post("/api/revisions.diff", {
body: {
token: user.getJwtToken(),
id: revision.id,
},
});
expect(res.status).toEqual(403);
});
});
describe("#revisions.list", () => {
it("should return a document's revisions", async () => {
const { user, document } = await seed();
+55 -1
View File
@@ -1,6 +1,9 @@
import Router from "koa-router";
import { Op } from "sequelize";
import { ValidationError } from "@server/errors";
import auth from "@server/middlewares/authentication";
import { Document, Revision } from "@server/models";
import DocumentHelper from "@server/models/helpers/DocumentHelper";
import { authorize } from "@server/policies";
import { presentRevision } from "@server/presenters";
import { assertPresent, assertSort, assertUuid } from "@server/validation";
@@ -22,11 +25,62 @@ router.post("revisions.info", auth(), async (ctx) => {
authorize(user, "read", document);
ctx.body = {
pagination: ctx.state.pagination,
data: await presentRevision(revision),
};
});
router.post("revisions.diff", auth(), async (ctx) => {
const { id, compareToId } = ctx.body;
assertUuid(id, "id is required");
const { user } = ctx.state;
const revision = await Revision.findByPk(id, {
rejectOnEmpty: true,
});
const document = await Document.findByPk(revision.documentId, {
userId: user.id,
});
authorize(user, "read", document);
let before;
if (compareToId) {
assertUuid(compareToId, "compareToId must be a UUID");
before = await Revision.findOne({
where: {
id: compareToId,
documentId: revision.documentId,
createdAt: {
[Op.lt]: revision.createdAt,
},
},
});
if (!before) {
throw ValidationError(
"Revision could not be found, compareToId must be a revision of the same document before the provided revision"
);
}
} else {
before = await revision.previous();
}
const accept = ctx.request.headers["accept"];
const content = DocumentHelper.diff(before, revision);
if (accept?.includes("text/html")) {
ctx.set("Content-Type", "text/html");
ctx.set(
"Content-Disposition",
`attachment; filename="${document.title}.html"`
);
ctx.body = content;
return;
}
ctx.body = {
data: content,
};
});
router.post("revisions.list", auth(), pagination(), async (ctx) => {
let { direction } = ctx.body;
const { documentId, sort = "updatedAt" } = ctx.body;
+1 -1
View File
@@ -47,7 +47,7 @@
#root {
flex: 1;
min-height: 100vh;
min-height: 100%;
width: 100%;
}
</style>
+11 -2
View File
@@ -3,14 +3,21 @@ import parseDocumentIds from "./parseDocumentIds";
it("should not return non links", () => {
expect(parseDocumentIds(`# Header`).length).toBe(0);
});
it("should return an array of document ids", () => {
const result = parseDocumentIds(`# Header
[internal](/doc/test-456733)
[internal](http://app.getoutline.com/doc/test-456733)
More text
[internal](/doc/test-123456#heading-anchor)
`);
expect(result.length).toBe(1);
expect(result.length).toBe(2);
expect(result[0]).toBe("test-456733");
expect(result[1]).toBe("test-123456");
});
it("should not return duplicate document ids", () => {
expect(parseDocumentIds(`# Header`).length).toBe(0);
const result = parseDocumentIds(`# Header
@@ -22,9 +29,11 @@ it("should not return duplicate document ids", () => {
expect(result.length).toBe(1);
expect(result[0]).toBe("test-456733");
});
it("should not return non document links", () => {
expect(parseDocumentIds(`[google](http://www.google.com)`).length).toBe(0);
});
it("should not return non document relative links", () => {
expect(parseDocumentIds(`[relative](/developers)`).length).toBe(0);
});
+15 -13
View File
@@ -1,28 +1,30 @@
import { Node } from "prosemirror-model";
import parseDocumentSlug from "@shared/utils/parseDocumentSlug";
import { parser } from "@server/editor";
/**
* Parse a list of unique document identifiers contained in links in markdown
* text.
*
* @param text The text to parse in Markdown format
* @returns An array of document identifiers
*/
export default function parseDocumentIds(text: string): string[] {
const value = parser.parse(text);
const links: string[] = [];
const identifiers: string[] = [];
function findLinks(node: Node) {
// get text nodes
if (node.type.name === "text") {
// get marks for text nodes
node.marks.forEach((mark) => {
// any of the marks links?
// any of the marks identifiers?
if (mark.type.name === "link") {
const { href } = mark.attrs;
const slug = parseDocumentSlug(mark.attrs.href);
// any of the links to other docs?
if (href.startsWith("/doc")) {
const tokens = href.replace(/\/$/, "").split("/");
const lastToken = tokens[tokens.length - 1];
// don't return the same link more than once
if (!links.includes(lastToken)) {
links.push(lastToken);
}
// don't return the same link more than once
if (slug && !identifiers.includes(slug)) {
identifiers.push(slug);
}
}
});
@@ -36,5 +38,5 @@ export default function parseDocumentIds(text: string): string[] {
}
findLinks(value);
return links;
return identifiers;
}
+2 -1
View File
@@ -8,6 +8,7 @@ import Logger from "@server/logging/Logger";
import Attachment from "@server/models/Attachment";
import Collection from "@server/models/Collection";
import Document from "@server/models/Document";
import DocumentHelper from "@server/models/helpers/DocumentHelper";
import { NavigationNode } from "~/types";
import { deserializeFilename, serializeFilename } from "./fs";
import parseAttachmentIds from "./parseAttachmentIds";
@@ -36,7 +37,7 @@ async function addDocumentTreeToArchive(
continue;
}
let text = document.toMarkdown();
let text = DocumentHelper.toMarkdown(document);
const attachments = await Attachment.findAll({
where: {
teamId: document.teamId,
+1 -1
View File
@@ -25,7 +25,7 @@ export function assertArray(
export const assertIn = (
value: string,
options: (string | undefined | null)[],
options: Primitive[],
message?: string
) => {
if (!options.includes(value)) {
+8
View File
@@ -0,0 +1,8 @@
import styled from "styled-components";
import style, { Props } from "../../styles/editor";
const EditorContainer = styled.div<Props>`
${style};
`;
export default EditorContainer;
+13 -7
View File
@@ -33,12 +33,16 @@ export default class CheckboxItem extends Node {
},
],
toDOM: (node) => {
const input = document.createElement("span");
input.tabIndex = -1;
input.className = "checkbox";
input.setAttribute("aria-checked", node.attrs.checked.toString());
input.setAttribute("role", "checkbox");
input.addEventListener("click", this.handleClick);
const checked = node.attrs.checked.toString();
let input;
if (typeof document !== "undefined") {
input = document.createElement("span");
input.tabIndex = -1;
input.className = "checkbox";
input.setAttribute("aria-checked", checked);
input.setAttribute("role", "checkbox");
input.addEventListener("click", this.handleClick);
}
return [
"li",
@@ -51,7 +55,9 @@ export default class CheckboxItem extends Node {
{
contentEditable: "false",
},
input,
...(input
? [input]
: [["span", { class: "checkbox", "aria-checked": checked }]]),
],
["div", 0],
];
+43 -34
View File
@@ -122,44 +122,53 @@ export default class CodeFence extends Node {
},
],
toDOM: (node) => {
const button = document.createElement("button");
button.innerText = this.options.dictionary.copy;
button.type = "button";
button.addEventListener("click", this.handleCopyToClipboard);
let actions;
if (typeof document !== "undefined") {
const button = document.createElement("button");
button.innerText = this.options.dictionary.copy;
button.type = "button";
button.addEventListener("click", this.handleCopyToClipboard);
const select = document.createElement("select");
select.addEventListener("change", this.handleLanguageChange);
const select = document.createElement("select");
select.addEventListener("change", this.handleLanguageChange);
const actions = document.createElement("div");
actions.className = "code-actions";
actions.appendChild(select);
actions.appendChild(button);
actions = document.createElement("div");
actions.className = "code-actions";
actions.appendChild(select);
actions.appendChild(button);
this.languageOptions.forEach(([key, label]) => {
const option = document.createElement("option");
const value = key === "none" ? "" : key;
option.value = value;
option.innerText = label;
option.selected = node.attrs.language === value;
select.appendChild(option);
});
this.languageOptions.forEach(([key, label]) => {
const option = document.createElement("option");
const value = key === "none" ? "" : key;
option.value = value;
option.innerText = label;
option.selected = node.attrs.language === value;
select.appendChild(option);
});
// For the Mermaid language we add an extra button to toggle between
// source code and a rendered diagram view.
if (node.attrs.language === "mermaidjs") {
const showSourceButton = document.createElement("button");
showSourceButton.innerText = this.options.dictionary.showSource;
showSourceButton.type = "button";
showSourceButton.classList.add("show-source-button");
showSourceButton.addEventListener("click", this.handleToggleDiagram);
actions.prepend(showSourceButton);
// For the Mermaid language we add an extra button to toggle between
// source code and a rendered diagram view.
if (node.attrs.language === "mermaidjs") {
const showSourceButton = document.createElement("button");
showSourceButton.innerText = this.options.dictionary.showSource;
showSourceButton.type = "button";
showSourceButton.classList.add("show-source-button");
showSourceButton.addEventListener(
"click",
this.handleToggleDiagram
);
actions.prepend(showSourceButton);
const showDiagramButton = document.createElement("button");
showDiagramButton.innerText = this.options.dictionary.showDiagram;
showDiagramButton.type = "button";
showDiagramButton.classList.add("show-digram-button");
showDiagramButton.addEventListener("click", this.handleToggleDiagram);
actions.prepend(showDiagramButton);
const showDiagramButton = document.createElement("button");
showDiagramButton.innerText = this.options.dictionary.showDiagram;
showDiagramButton.type = "button";
showDiagramButton.classList.add("show-digram-button");
showDiagramButton.addEventListener(
"click",
this.handleToggleDiagram
);
actions.prepend(showDiagramButton);
}
}
return [
@@ -168,7 +177,7 @@ export default class CodeFence extends Node {
class: "code-block",
"data-language": node.attrs.language,
},
["div", { contentEditable: "false" }, actions],
...(actions ? [["div", { contentEditable: "false" }, actions]] : []),
["pre", ["code", { spellCheck: "false" }, 0]],
];
},
+22 -18
View File
@@ -50,23 +50,28 @@ export default class Heading extends Node {
contentElement: ".heading-content",
})),
toDOM: (node) => {
const anchor = document.createElement("button");
anchor.innerText = "#";
anchor.type = "button";
anchor.className = "heading-anchor";
anchor.addEventListener("click", (event) => this.handleCopyLink(event));
let anchor, fold;
if (typeof document !== "undefined") {
anchor = document.createElement("button");
anchor.innerText = "#";
anchor.type = "button";
anchor.className = "heading-anchor";
anchor.addEventListener("click", (event) =>
this.handleCopyLink(event)
);
const fold = document.createElement("button");
fold.innerText = "";
fold.innerHTML =
'<svg fill="currentColor" width="12" height="24" viewBox="6 0 12 24" xmlns="http://www.w3.org/2000/svg"><path d="M8.23823905,10.6097108 L11.207376,14.4695888 L11.207376,14.4695888 C11.54411,14.907343 12.1719566,14.989236 12.6097108,14.652502 C12.6783439,14.5997073 12.7398293,14.538222 12.792624,14.4695888 L15.761761,10.6097108 L15.761761,10.6097108 C16.0984949,10.1719566 16.0166019,9.54410997 15.5788477,9.20737601 C15.4040391,9.07290785 15.1896811,9 14.969137,9 L9.03086304,9 L9.03086304,9 C8.47857829,9 8.03086304,9.44771525 8.03086304,10 C8.03086304,10.2205442 8.10377089,10.4349022 8.23823905,10.6097108 Z" /></svg>';
fold.type = "button";
fold.className = `heading-fold ${
node.attrs.collapsed ? "collapsed" : ""
}`;
fold.addEventListener("mousedown", (event) =>
this.handleFoldContent(event)
);
fold = document.createElement("button");
fold.innerText = "";
fold.innerHTML =
'<svg fill="currentColor" width="12" height="24" viewBox="6 0 12 24" xmlns="http://www.w3.org/2000/svg"><path d="M8.23823905,10.6097108 L11.207376,14.4695888 L11.207376,14.4695888 C11.54411,14.907343 12.1719566,14.989236 12.6097108,14.652502 C12.6783439,14.5997073 12.7398293,14.538222 12.792624,14.4695888 L15.761761,10.6097108 L15.761761,10.6097108 C16.0984949,10.1719566 16.0166019,9.54410997 15.5788477,9.20737601 C15.4040391,9.07290785 15.1896811,9 14.969137,9 L9.03086304,9 L9.03086304,9 C8.47857829,9 8.03086304,9.44771525 8.03086304,10 C8.03086304,10.2205442 8.10377089,10.4349022 8.23823905,10.6097108 Z" /></svg>';
fold.type = "button";
fold.className = `heading-fold ${
node.attrs.collapsed ? "collapsed" : ""
}`;
fold.addEventListener("mousedown", (event) =>
this.handleFoldContent(event)
);
}
return [
`h${node.attrs.level + (this.options.offset || 0)}`,
@@ -78,8 +83,7 @@ export default class Heading extends Node {
node.attrs.collapsed ? "collapsed" : ""
}`,
},
anchor,
fold,
...(anchor ? [anchor, fold] : []),
],
[
"span",
+28 -25
View File
@@ -52,40 +52,43 @@ export default class Notice extends Node {
},
],
toDOM: (node) => {
const select = document.createElement("select");
select.addEventListener("change", this.handleStyleChange);
let icon, actions;
if (typeof document !== "undefined") {
const select = document.createElement("select");
select.addEventListener("change", this.handleStyleChange);
this.styleOptions.forEach(([key, label]) => {
const option = document.createElement("option");
option.value = key;
option.innerText = label;
option.selected = node.attrs.style === key;
select.appendChild(option);
});
this.styleOptions.forEach(([key, label]) => {
const option = document.createElement("option");
option.value = key;
option.innerText = label;
option.selected = node.attrs.style === key;
select.appendChild(option);
});
const actions = document.createElement("div");
actions.className = "notice-actions";
actions.appendChild(select);
actions = document.createElement("div");
actions.className = "notice-actions";
actions.appendChild(select);
let component;
let component;
if (node.attrs.style === "tip") {
component = <StarredIcon color="currentColor" />;
} else if (node.attrs.style === "warning") {
component = <WarningIcon color="currentColor" />;
} else {
component = <InfoIcon color="currentColor" />;
if (node.attrs.style === "tip") {
component = <StarredIcon color="currentColor" />;
} else if (node.attrs.style === "warning") {
component = <WarningIcon color="currentColor" />;
} else {
component = <InfoIcon color="currentColor" />;
}
icon = document.createElement("div");
icon.className = "icon";
ReactDOM.render(component, icon);
}
const icon = document.createElement("div");
icon.className = "icon";
ReactDOM.render(component, icon);
return [
"div",
{ class: `notice-block ${node.attrs.style}` },
icon,
["div", { contentEditable: "false" }, actions],
...(icon ? [icon] : []),
["div", { contentEditable: "false" }, ...(actions ? [actions] : [])],
["div", { class: "content" }, 0],
];
},
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Åben dokument",
"New document": "Nyt dokument",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Hent",
"Download document": "Hent dokument",
"Duplicate": "Dupliker",
@@ -198,6 +202,7 @@
"Export": "Export",
"Webhooks": "Webhooks",
"Integrations": "Integrations",
"Draw.io": "Draw.io",
"Insert column after": "Insert column after",
"Insert column before": "Insert column before",
"Insert row after": "Insert row after",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export in progress…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Entwickler",
"Open document": "Dokument öffnen",
"New document": "Neues Dokument",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Herunterladen",
"Download document": "Dokument herunterladen",
"Duplicate": "Duplizieren",
@@ -198,6 +202,7 @@
"Export": "Exportieren",
"Webhooks": "Webhooks",
"Integrations": "Integrationen",
"Draw.io": "Draw.io",
"Insert column after": "Spalte danach einfügen",
"Insert column before": "Spalte davor einfügen",
"Insert row after": "Zeile darunter einfügen",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Berechtigungen zum Teilen öffentlicher Dokumente wurden aktualisiert",
"Could not update public document sharing": "Öffentliches Dokumententeilen konnte nicht aktualisiert werden",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "Die Sammlung <em>{{ collectionName }}</em> ist privat. Teammitglieder haben standardmäßig keinen Zugriff darauf.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Teammitglieder können die Dokumente in der Sammlung <em>{{ collectionName }}</em> standardmäßig ansehen.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Teammitglieder können die Dokumente in der Sammlung <em>{{ collectionName }}</em> standardmäßig ansehen und bearbeiten.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Teammitglieder können die Dokumente in der Sammlung <em>{{ collectionName }}</em> standardmäßig ansehen.",
"When enabled, documents can be shared publicly on the internet.": "Wenn aktiviert, können Dokumente im Internet öffentlich geteilt werden.",
"Public sharing is currently disabled in the team security settings.": "Öffentliches Teilen ist derzeit in den Sicherheitseinstellungen des Teams deaktiviert.",
"Additional access": "Weiterer Zugriff",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Wählen Sie eine Subdomain, um eine Loginseite nur für Ihr Team zu aktivieren.",
"Start view": "Startseite",
"This is the screen that team members will first see when they sign in.": "Dies ist die Ansicht, die Teammitglieder zuerst sehen, wenn sie sich anmelden.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Exportvorgang läuft…",
"Export deleted": "Export gelöscht",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
@@ -14,6 +14,8 @@
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"HTML": "HTML",
"Markdown": "Markdown",
"Download": "Download",
"Download document": "Download document",
"Duplicate": "Duplicate",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Desarrollador",
"Open document": "Documento abierto",
"New document": "Nuevo documento",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Descargar",
"Download document": "Descargar documento",
"Duplicate": "Duplicar",
@@ -198,6 +202,7 @@
"Export": "Exportar",
"Webhooks": "Webhooks",
"Integrations": "Integraciones",
"Draw.io": "Draw.io",
"Insert column after": "Insertar columna después",
"Insert column before": "Insertar columna antes",
"Insert row after": "Insertar fila después",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Se actualizaron los permisos para los documentos compartidos públicamente",
"Could not update public document sharing": "No se ha podido actualizar el documento compartido públicamente",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "La colección <em>{{ collectionName }}</em> es privada. Los miembros del equipo no tienen acceso a ella por defecto.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Los miembros del equipo pueden ver documentos en la colección <em>{{ collectionName }}</em> por defecto.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Los miembros del equipo pueden ver y editar documentos en la colección <em>{{ collectionName }}</em> por defecto.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Los miembros del equipo pueden ver documentos en la colección <em>{{ collectionName }}</em> por defecto.",
"When enabled, documents can be shared publicly on the internet.": "Cuando está habilitado, los documentos se pueden compartir públicamente en Internet.",
"Public sharing is currently disabled in the team security settings.": "Compartir públicamente está desactivado en las configuraciones de seguridad del equipo.",
"Additional access": "Acceso adicional",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Exportación en progreso…",
"Export deleted": "Exportación eliminada",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "توسعه‌دهنده",
"Open document": "باز کردن سند",
"New document": "سند جدید",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "بارگیری",
"Download document": "دریافت سند",
"Duplicate": "کپی کردن",
@@ -198,6 +202,7 @@
"Export": "صدور",
"Webhooks": "Webhooks",
"Integrations": "یکپارچه‌سازی‌ها",
"Draw.io": "Draw.io",
"Insert column after": "درج ستون پس از",
"Insert column before": "درج ستون پیش از",
"Insert row after": "درج سطر پس از",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "مجوزهای اشتراک عمومی سند به روز شد",
"Could not update public document sharing": "اشتراک گذاری عمومی سند به روز نشد",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "مجموعه <em>{{ collectionName }}</em> خصوصی است. تیم‌ها به طور پیش‌فرض امکان دسترسی به آن را ندارند.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "اعضای تیم به طور پیش‌فرض امکان مشاهده سندهای مجموعه <em>{{ collectionName }}</em> را دارند.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "اعضای تیم به طور پیش‌فرض امکان مشاهده و ویرایش سندهای مجموعه <em>{{ collectionName }}</em> را دارند.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "اعضای تیم به طور پیش‌فرض امکان مشاهده سندهای مجموعه <em>{{ collectionName }}</em> را دارند.",
"When enabled, documents can be shared publicly on the internet.": "زمانی که فعال باشد، اسناد را می‌توان به عمومی عمومی روی اینترنت به اشتراک گذاشت.",
"Public sharing is currently disabled in the team security settings.": "اشتراک‌گذاری عمومی در حال حاضر در تنظیمات امنیتی تیم غیرفعال است.",
"Additional access": "دسترسی‌های اضافه",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "نمای شروع",
"This is the screen that team members will first see when they sign in.": "این صفحه‌ای است که اعضای تیم هنگام ورود به سیستم، ابتدا آن را مشاهده خواهند کرد.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "صادر کردن در حال انجام…",
"Export deleted": "خروجی حذف شد",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+9 -2
View File
@@ -10,6 +10,10 @@
"Developer": "Développeur",
"Open document": "Ouvrir le document",
"New document": "Nouveau document",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Télécharger",
"Download document": "Télécharger le document",
"Duplicate": "Dupliquer",
@@ -198,6 +202,7 @@
"Export": "Exporter",
"Webhooks": "Webhooks",
"Integrations": "Intégrations",
"Draw.io": "Draw.io",
"Insert column after": "Insérer une colonne après",
"Insert column before": "Insérer une colonne avant",
"Insert row after": "Insérer une ligne après",
@@ -227,7 +232,7 @@
"Sorry, that link wont work for this embed type": "Désolé, ce lien ne fonctionne pas pour ce type d'intégration",
"File attachment": "Pièce jointe",
"Find or create a doc": "Rechercher ou créer un doc",
"Big heading": "Grand titre",
"Big heading": "En-tête",
"Medium heading": "Titre moyen",
"Small heading": "Petit titre",
"Heading": "Titre",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Les autorisations de partage des documents publics ont été mises à jour",
"Could not update public document sharing": "Impossible de mettre à jour le partage de documents publics",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "La collection <em>{{ collectionName }}</em> est privée. Les membres de l'équipe n'y ont pas accès par défaut.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Les membres de l'équipe peuvent afficher les documents de la collection <em>{{ collectionName }}</em> par défaut.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Les membres de l'équipe peuvent afficher et modifier les documents de la collection <em>{{ collectionName }}</em> par défaut.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Les membres de l'équipe peuvent afficher les documents de la collection <em>{{ collectionName }}</em> par défaut.",
"When enabled, documents can be shared publicly on the internet.": "Lorsque cette option est activée, les documents peuvent être partagés publiquement sur Internet.",
"Public sharing is currently disabled in the team security settings.": "Le partage public est actuellement désactivé dans les paramètres de sécurité de l'équipe.",
"Additional access": "Accès supplémentaire",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choisissez un sous-domaine pour activer une page de connexion propre à votre équipe.",
"Start view": "Page d'accueil",
"This is the screen that team members will first see when they sign in.": "Cette page s'affichera pour les membres de l'équipe lors de leur première connexion.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export en cours…",
"Export deleted": "Exportation supprimée",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "Un export complet peut prendre un certain temps, pensez à exporter un seul document ou une seule collection. Les données sont exportées sous forme d'archive zip de vos documents en format Markdown. Une fois l'export commencé, ous pouvez fermer cette page nous enverrons un lien à <em>{{ userEmail }}</em> quand ce sera terminé.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Buka dokumen",
"New document": "Dokumen baru",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Unduh",
"Download document": "Unduh dokumen",
"Duplicate": "Duplikat",
@@ -198,6 +202,7 @@
"Export": "Ekspor",
"Webhooks": "Webhooks",
"Integrations": "Integrasi",
"Draw.io": "Draw.io",
"Insert column after": "Insert column after",
"Insert column before": "Insert column before",
"Insert row after": "Insert row after",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Pilih subdomain untuk mengaktifkan halaman masuk hanya untuk tim Anda.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "Ini layar yang para anggota tim lihat pertama kali saat mereka masuk.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Pengeksporan sedang berlangsung…",
"Export deleted": "Ekspor dihapus",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+64 -57
View File
@@ -1,38 +1,42 @@
{
"Open collection": "Open collection",
"Open collection": "Apri la raccolta",
"New collection": "Nuova raccolta",
"Create a collection": "Crea raccolta",
"Edit collection": "Modifica raccolta",
"Star": "Preferito",
"Unstar": "Rimuovi dai Preferiti",
"Delete IndexedDB cache": "Delete IndexedDB cache",
"IndexedDB cache deleted": "IndexedDB cache deleted",
"Developer": "Developer",
"Delete IndexedDB cache": "Svuota la cache d'IndexedDB",
"IndexedDB cache deleted": "La cache d'IndexedDB è stata svuotata",
"Developer": "Sviluppatore",
"Open document": "Apri documento",
"New document": "Nuovo documento",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Download",
"Download document": "Scarica documento",
"Duplicate": "Duplica",
"Duplicate document": "Duplica documento",
"Document duplicated": "Documento duplicato",
"Pin to collection": "Fissa alla raccolta",
"Pinned to collection": "Pinned to collection",
"Pin to home": "Pin to home",
"Pinned to team home": "Pinned to team home",
"Pin": "Pin",
"Pinned to collection": "Fissa nella raccolta",
"Pin to home": "Fissa nella home",
"Pinned to team home": "Fissa nella home del team",
"Pin": "Fissa",
"Print": "Stampa",
"Print document": "Print document",
"Print document": "Stampa documento",
"Import document": "Importa documento",
"Templatize": "Templatize",
"Templatize": "Rendi un modello",
"Create template": "Crea un modello",
"Search documents for \"{{searchQuery}}\"": "Search documents for \"{{searchQuery}}\"",
"Search documents for \"{{searchQuery}}\"": "Cerca documenti per \"{{searchQuery}}\"",
"Move": "Sposta",
"Move {{ documentName }}": "Move {{ documentName }}",
"Move {{ documentName }}": "Sposta {{ documentName }}",
"Archive": "Archivio",
"Document archived": "Documento archiviato",
"Delete": "Cancella",
"Delete {{ documentName }}": "Elimina {{ documentName }}",
"Permanently delete": "Permanently delete",
"Permanently delete": "Elimina permanentemente",
"Permanently delete {{ documentName }}": "Cancella definitivamente {{ documentName }}",
"Home": "Home",
"Drafts": "Bozze",
@@ -49,18 +53,18 @@
"Dark": "Scuro",
"Light": "Chiaro",
"System": "Sistema",
"Appearance": "Appearance",
"Change theme": "Change theme",
"Change theme to": "Change theme to",
"Appearance": "Aspetto",
"Change theme": "Cambia tema",
"Change theme to": "Cambia tema in",
"Switch team": "Cambia team",
"Select a team": "Select a team",
"Select a team": "Scegli un team",
"Invite people": "Invita persone",
"Collection": "Raccolta",
"Debug": "Debug",
"Document": "Document",
"Document": "Documento",
"Navigation": "Navigazione",
"People": "People",
"Recent searches": "Recent searches",
"People": "Persone",
"Recent searches": "Ricerche recenti",
"currently editing": "attualmente in modifica",
"currently viewing": "attualmente visualizzato",
"previously edited": "precedentemente modificato",
@@ -68,19 +72,19 @@
"Viewers": "Visitatori",
"Im sure Delete": "Im sure Delete",
"Deleting": "Sto eliminando",
"Are you sure about that? Deleting the <em>{{collectionName}}</em> collection is permanent and cannot be restored, however documents within will be moved to the trash.": "Deleting the <em>{{collectionName}}</em> collection is permanent and cannot be restored, however documents within will be moved to the trash.",
"Also, <em>{{collectionName}}</em> is being used as the start view deleting it will reset the start view to the Home page.": "Also, <em>{{collectionName}}</em> is being used as the start view deleting it will reset the start view to the Home page.",
"Are you sure about that? Deleting the <em>{{collectionName}}</em> collection is permanent and cannot be restored, however documents within will be moved to the trash.": "Eliminare la raccolta <em>{{collectionName}}</em> è permanente ed irreversibile, tutti i documenti al suo interno verranno però spostati nel cestino.",
"Also, <em>{{collectionName}}</em> is being used as the start view deleting it will reset the start view to the Home page.": "<em>{{collectionName}}</em> è anche usata come schermata iniziale - eliminarla comporterebbe il reset della schermata iniziale alla pagina Home.",
"Sorry, an error occurred saving the collection": "Spiacenti, si è verificato un errore durante la collezione",
"Add a description": "Aggiungi una descrizione",
"Collapse": "Raggruppa",
"Expand": "Espandi",
"Type a command or search": "Type a command or search",
"Open search from anywhere with the {{ shortcut }} shortcut": "Open search from anywhere with the {{ shortcut }} shortcut",
"Type a command or search": "Digita un comando o cerca",
"Open search from anywhere with the {{ shortcut }} shortcut": "Apri la barra di ricerca ovunque tu sia con la scorciatoia {{ shortcut }}",
"Server connection lost": "Connessione al server interrotta",
"Edits you make will sync once youre online": "Le modifiche apportate verranno sincronizzate una volta che sarai online",
"Submenu": "Sottomenu",
"Collections could not be loaded, please reload the app": "Collections could not be loaded, please reload the app",
"Default collection": "Default collection",
"Collections could not be loaded, please reload the app": "Impossibile caricare le raccolte, per favore ricarica l'app",
"Default collection": "Raccolta predefinita",
"Deleted Collection": "Raccolte Eliminate",
"Unpin": "Rimuovi contrassegno",
"History": "Cronologia",
@@ -90,18 +94,18 @@
"Draft": "Bozza",
"Template": "Template",
"New doc": "Nuovo documento",
"You deleted": "You deleted",
"{{ userName }} deleted": "{{ userName }} deleted",
"You archived": "You archived",
"{{ userName }} archived": "{{ userName }} archived",
"You created": "You created",
"{{ userName }} created": "{{ userName }} created",
"You published": "You published",
"{{ userName }} published": "{{ userName }} published",
"You saved": "You saved",
"{{ userName }} saved": "{{ userName }} saved",
"You updated": "You updated",
"{{ userName }} updated": "{{ userName }} updated",
"You deleted": "Tu hai eliminato",
"{{ userName }} deleted": "{{ userName }} ha eliminato",
"You archived": "Tu hai archiviato",
"{{ userName }} archived": "{{ userName }} ha archiviato",
"You created": "Tu hai creato",
"{{ userName }} created": "{{ userName }} ha creato",
"You published": "Tu hai pubblicato",
"{{ userName }} published": "{{ userName }} ha pubblicato",
"You saved": "Tu hai salvato",
"{{ userName }} saved": "{{ userName }} ha salvato",
"You updated": "Tu hai aggiornato",
"{{ userName }} updated": "{{ userName }} ha salvato",
"Never viewed": "Mai visualizzati",
"Viewed": "Visto",
"in": "in",
@@ -116,13 +120,13 @@
"{{ completed }} task done": "{{ completed }} attività completata",
"{{ completed }} task done_plural": "{{ completed }} attività completate",
"{{ completed }} of {{ total }} tasks": "{{ completed }} di {{ total }} attività",
"Template created, go ahead and customize it": "Template created, go ahead and customize it",
"Template created, go ahead and customize it": "Modello creato, procedi e personalizzalo",
"Creating": "Creazione",
"Creating a template from <em>{{titleWithDefault}}</em> is a non-destructive action we'll make a copy of the document and turn it into a template that can be used as a starting point for new documents.": "Creating a template from <em>{{titleWithDefault}}</em> is a non-destructive action we'll make a copy of the document and turn it into a template that can be used as a starting point for new documents.",
"Creating a template from <em>{{titleWithDefault}}</em> is a non-destructive action we'll make a copy of the document and turn it into a template that can be used as a starting point for new documents.": "Creare un modello da <em>{{titleWithDefault}}</em> è un'azione non distruttiva - faremo una copia del documento e lo convertiremo in un modello, così che potrà essere usato come punto d'inizio per nuovi documenti.",
"Currently editing": "Attualemente in modifica",
"Currently viewing": "Attualmente visualizzato",
"Viewed {{ timeAgo }} ago": "Visualizzato {{ timeAgo }} fa",
"Module failed to load": "Module failed to load",
"Module failed to load": "Caricamento del modulo fallito",
"Loading Failed": "Caricamento fallito",
"Sorry, part of the application failed to load. This may be because it was updated since you opened the tab or because of a failed network request. Please try reloading.": "Sorry, part of the application failed to load. This may be because it was updated since you opened the tab or because of a failed network request. Please try reloading.",
"Reload": "Ricaricare",
@@ -138,40 +142,40 @@
"{{userName}} deleted": "{{userName}} eliminato",
"{{userName}} moved from trash": "{{userName}} spostato dal cestino",
"{{userName}} published": "{{userName}} pubblicato",
"{{userName}} unpublished": "{{userName}} unpublished",
"{{userName}} moved": "{{userName}} moved",
"{{userName}} unpublished": "{{userName}} ha annullato la pubblicazione",
"{{userName}} moved": "{{userName}} ha spostato",
"Icon": "Icona",
"Show menu": "Mostra menu",
"Choose icon": "Scegli icona",
"Loading": "Caricamento in corso",
"Loading editor": "Loading editor",
"Loading editor": "Caricando l'editor",
"Search": "Cerca",
"Default access": "Accesso predefinito",
"View and edit": "Visualizza e modifica",
"View only": "Visualizza soltanto",
"No access": "No access",
"No access": "Accesso negato",
"Role": "Ruolo",
"Member": "Membro",
"Viewer": "Viewer",
"Viewer": "Visualizzatore",
"Admin": "Amministratore",
"Outline is available in your language {{optionLabel}}, would you like to change?": "Outline è disponibile nella tua lingua {{optionLabel}}, vuoi cambiare?",
"Change Language": "Cambia Lingua",
"Dismiss": "Chiudi",
"Youre offline.": "Youre offline.",
"Sorry, an error occurred.": "Sorry, an error occurred.",
"Click to retry": "Click to retry",
"Back": "Back",
"Youre offline.": "Sei offline.",
"Sorry, an error occurred.": "Spiacenti, si è verificato un errore.",
"Click to retry": "Clicca per riprovare",
"Back": "Indietro",
"Documents": "Documenti",
"Results": "Results",
"No results for {{query}}": "No results for {{query}}",
"Results": "Risultati",
"No results for {{query}}": "Nessun risultato per {{query}}",
"Logo": "Logo",
"Move document": "Move document",
"You can't reorder documents in an alphabetically sorted collection": "You can't reorder documents in an alphabetically sorted collection",
"Move document": "Sposta il documento",
"You can't reorder documents in an alphabetically sorted collection": "Non è possibile riordinare i documenti in una raccolta ordinata alfabeticamente",
"Collections": "Raccolta",
"Untitled": "Senza titolo",
"New nested document": "Nuovo documento annidato",
"Document not supported try Markdown, Plain text, HTML, or Word": "Document not supported try Markdown, Plain text, HTML, or Word",
"Empty": "Empty",
"Document not supported try Markdown, Plain text, HTML, or Word": "Documento non supportato prova Markdown, testo semplice, HTML o Word",
"Empty": "Vuoto",
"Starred documents could not be loaded": "Starred documents could not be loaded",
"Starred": "Preferiti",
"Show more": "Mostra altro",
@@ -198,6 +202,7 @@
"Export": "Esporta",
"Webhooks": "Webhooks",
"Integrations": "Integrazioni",
"Draw.io": "Draw.io",
"Insert column after": "Inserisci colonna dopo",
"Insert column before": "Inserisci colonna prima",
"Insert row after": "Inserisci riga sotto",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export in progress…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "ドキュメントを開く",
"New document": "新しいドキュメント",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "ダウンロード",
"Download document": "ドキュメントをダウンロード",
"Duplicate": "文書の複製",
@@ -198,6 +202,7 @@
"Export": "エクスポート",
"Webhooks": "Webhooks",
"Integrations": "システム連携",
"Draw.io": "Draw.io",
"Insert column after": "後に列を挿入",
"Insert column before": "前に列を挿入",
"Insert row after": "下に行を挿入",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "公開文書の共有許可を更新しました",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "<em>{{ collectionName }}</em> コレクションは非公開です。チームメンバーはデフォルトではアクセスできません。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "チームメンバーはデフォルトで <em>{{ collectionName }}</em> コレクション内のドキュメントを表示できます。",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "チームメンバーは、 <em>{{ collectionName }}</em> コレクション内のドキュメントをデフォルトで\n 表示および編集できます。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "チームメンバーはデフォルトで <em>{{ collectionName }}</em> コレクション内のドキュメントを表示できます。",
"When enabled, documents can be shared publicly on the internet.": "有効にすると、ドキュメントをインターネット上で公開して共有できます。",
"Public sharing is currently disabled in the team security settings.": "チームのセキュリティ設定で公開共有が無効になっています。",
"Additional access": "追加アクセス",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "起動時表示",
"This is the screen that team members will first see when they sign in.": "チームメンバーがログインしたときに最初に表示される画面です。",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "エクスポートが進行中…",
"Export deleted": "エクスポート削除",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "完全なデータエクスポートを生成するには、しばらく時間がかかることがあります。代わりに、単一の文書またはコレクションをエクスポートすることを検討してください。データのエクスポートは、すべての文書をMarkdown形式で含むZIPファイルになります。処理が開始された後、必要であれば、このウェブページを安全に閉じることができます。通知を有効にした場合、手続きが完了すると、URLが <em>{{ userEmail }}</em> にメールされます。",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "문서 열기",
"New document": "새 문서",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "다운로드",
"Download document": "문서 다운로드",
"Duplicate": "복사하기",
@@ -198,6 +202,7 @@
"Export": "내보내기",
"Webhooks": "Webhooks",
"Integrations": "연동",
"Draw.io": "Draw.io",
"Insert column after": "뒤에 열 추가",
"Insert column before": "앞에 열 추가",
"Insert row after": "뒤에 행 추가",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "팀 구성원은 기본적으로 <em>{{ collectionName }}</em> 컬렉션의 문서를 볼 수 있습니다",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "팀 구성원은 기본적으로 <em>{{ collectionName }}</em> 컬렉션의 문서를 보거나 수정할 수 있습니다",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "팀 구성원은 기본적으로 <em>{{ collectionName }}</em> 컬렉션의 문서를 볼 수 있습니다",
"When enabled, documents can be shared publicly on the internet.": "활성화되면 문서를 인터넷에 공유 할 수 있습니다.",
"Public sharing is currently disabled in the team security settings.": "현재 팀 보안 설정에서 공개 공유가 비활성화되어 있습니다.",
"Additional access": "추가 액세스",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "보기 시작",
"This is the screen that team members will first see when they sign in.": "팀원들이 로그인할 때 가장 먼저 보게 되는 화면입니다.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "내보내기 진행 중…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Ontwikkelaar",
"Open document": "Open document",
"New document": "Nieuw document",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Download",
"Download document": "Download document",
"Duplicate": "Dupliceer",
@@ -198,6 +202,7 @@
"Export": "Exporteer",
"Webhooks": "Webhooks",
"Integrations": "Intergraties",
"Draw.io": "Draw.io",
"Insert column after": "Voeg een kolom rechts in",
"Insert column before": "Voeg een kolom links in",
"Insert row after": "Voeg een rij eronder in",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Toestemmingen voor publieke documentdeling zijn bijgewerkt",
"Could not update public document sharing": "Openbare delen van documenten kon niet bijgewerkt worden",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "De <em>{{ collectionName }}</em> collectie is privé. Team leden hebben standaard geen toegang.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Teamleden kunnen standaard documenten in de <em>{{ collectionName }}</em> collectie bekijken en bewerken.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Teamleden kunnen standaard documenten in de <em>{{ collectionName }}</em> collectie bekijken en bewerken.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Teamleden kunnen standaard documenten in de <em>{{ collectionName }}</em> collectie bekijken en bewerken.",
"When enabled, documents can be shared publicly on the internet.": "Indien ingeschakeld, kunnen documenten publiekelijk worden gedeeld op het internet.",
"Public sharing is currently disabled in the team security settings.": "Openbaar delen is momenteel uitgeschakeld in de beveiligingsinstellingen van het team.",
"Additional access": "Extra toegang",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Kies een subdomein om een inlogpagina alleen voor jouw team in te schakelen.",
"Start view": "Start weergave",
"This is the screen that team members will first see when they sign in.": "Dit is het scherm dat teamleden voor het eerst te zien krijgen wanneer ze inloggen.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Bezig met exporteren…",
"Export deleted": "Export verwijderd",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+9 -2
View File
@@ -10,6 +10,10 @@
"Developer": "Deweloper",
"Open document": "Otwórz dokument",
"New document": "Nowy dokument",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Pobierz",
"Download document": "Pobierz dokument",
"Duplicate": "Zduplikuj",
@@ -198,6 +202,7 @@
"Export": "Eksportuj",
"Webhooks": "Webhooks",
"Integrations": "Integracje",
"Draw.io": "Draw.io",
"Insert column after": "Wstaw kolumnę po",
"Insert column before": "Wstaw kolumnę przed",
"Insert row after": "Wstaw wiersz po",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Uprawnienia publicznego udostępniania dokumentów zostały zaktualizowane",
"Could not update public document sharing": "Nie udało się zaktualizować udostępniania dokumentów publicznych",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "Kolekcja <em>{{ collectionName }}</em> jest prywatna. Domyślnie członkowie Twojego zespołu nie mają do niej dostępu.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Członkowie zespołu mogą domyślnie przeglądać dokumenty w kolekcji <em>{{ collectionName }}</em>.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Członkowie zespołu mogą domyślnie oglądać i edytować dokumenty w kolekcji <em>{{ collectionName }}</em>.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Członkowie zespołu mogą domyślnie przeglądać dokumenty w kolekcji <em>{{ collectionName }}</em>.",
"When enabled, documents can be shared publicly on the internet.": "Gdy włączone, dokumenty mogą być udostępniane publicznie w Internecie.",
"Public sharing is currently disabled in the team security settings.": "Udostępnianie publiczne jest obecnie wyłączone w ustawieniach zabezpieczeń zespołu.",
"Additional access": "Dodatkowe uprawnienia",
@@ -537,7 +542,7 @@
"Get started by choosing a sign-in method for your new team below…": "Zacznij od wybrania metody logowania dla swojego nowego zespołu poniżej…",
"Login to {{ authProviderName }}": "Zaloguj się do {{ authProviderName }}",
"You signed in with {{ authProviderName }} last time.": "Zalogowałeś się za pomocą {{ authProviderName }} ostatnim razem.",
"Or": "Or",
"Or": "Lub",
"Already have an account? Go to <1>login</1>.": "Masz już konto? <1>Zaloguj się</1>.",
"Any collection": "Dowolna kolekcja",
"Any time": "W dowolnym czasie",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Widok początkowy",
"This is the screen that team members will first see when they sign in.": "Jest to ekran, który członkowie zespołu zobaczą po raz pierwszy po zalogowaniu.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Trwa eksport…",
"Export deleted": "Eksport usunięty",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Abrir documento",
"New document": "Novo documento",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Baixar",
"Download document": "Baixar documento",
"Duplicate": "Duplicar",
@@ -198,6 +202,7 @@
"Export": "Exportar",
"Webhooks": "Webhooks",
"Integrations": "Integrações",
"Draw.io": "Draw.io",
"Insert column after": "Inserir coluna à esquerda",
"Insert column before": "Inserir coluna à direita",
"Insert row after": "Inserir linha acima",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "As permissões de compartilhamento de documentos públicos foram atualizadas",
"Could not update public document sharing": "Não foi possível atualizar o compartilhamento de documentos públicos",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "A <em>{{ collectionName }}</em> é uma coleção particular. Os membros da equipe não têm acesso a ele por padrão.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Os membros da equipe podem visualizar os documentos da coleção <em>{{ collectionName }}</em> por padrão.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Os membros da equipe podem visualizar e editar os documentos da coleção <em>{{ collectionName }}</em>\n por padrão.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Os membros da equipe podem visualizar os documentos da coleção <em>{{ collectionName }}</em> por padrão.",
"When enabled, documents can be shared publicly on the internet.": "Quando ativado, os documentos podem ser compartilhados publicamente na Internet.",
"Public sharing is currently disabled in the team security settings.": "Compartilhamento público está atualmente desativado nas configurações de segurança da equipe.",
"Additional access": "Acesso adicional",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Início da visualização",
"This is the screen that team members will first see when they sign in.": "Esta é a tela que os membros da equipe verão pela primeira vez quando fizerem login.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Exportação em progresso…",
"Export deleted": "Exportação excluída",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Open document",
"New document": "Novo documento",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Download",
"Download document": "Download document",
"Duplicate": "Duplicar",
@@ -198,6 +202,7 @@
"Export": "Exportar",
"Webhooks": "Webhooks",
"Integrations": "Integrações",
"Draw.io": "Draw.io",
"Insert column after": "Inserir coluna depois",
"Insert column before": "Insira coluna antes",
"Insert row after": "Inserir linha depois",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export in progress…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+34 -27
View File
@@ -10,6 +10,10 @@
"Developer": "Разработчик",
"Open document": "Открыть документ",
"New document": "Новый документ",
"Subscribe": "Подписаться",
"Subscribed to document notifications": "Подписаться на обновления документа",
"Unsubscribe": "Отписаться",
"Unsubscribed from document notifications": "Отписаться от уведомлений о документе",
"Download": "Скачать",
"Download document": "Скачать документ",
"Duplicate": "Создать копию",
@@ -53,7 +57,7 @@
"Change theme": "Сменить тему",
"Change theme to": "Сменить тему на",
"Switch team": "Сменить команду",
"Select a team": "Select a team",
"Select a team": "Выбрать команду",
"Invite people": "Пригласить людей",
"Collection": "Коллекция",
"Debug": "Отладка",
@@ -138,7 +142,7 @@
"{{userName}} deleted": "{{userName}} удален",
"{{userName}} moved from trash": "{{userName}} перемещен из корзины",
"{{userName}} published": "Опубликовано {{userName}}",
"{{userName}} unpublished": "{{userName}} unpublished",
"{{userName}} unpublished": "Снято с публикации {{userName}}",
"{{userName}} moved": "Перемещено {{userName}}",
"Icon": "Значок",
"Show menu": "Показать меню",
@@ -158,7 +162,7 @@
"Change Language": "Сменить язык",
"Dismiss": "Убрать",
"Youre offline.": "Вы офлайн.",
"Sorry, an error occurred.": "Sorry, an error occurred.",
"Sorry, an error occurred.": "К сожалению, произошла ошибка.",
"Click to retry": "Кликните, чтобы повторить",
"Back": "Назад",
"Documents": "Документы",
@@ -198,6 +202,7 @@
"Export": "Экспорт",
"Webhooks": "Webhooks",
"Integrations": "Интеграции",
"Draw.io": "Draw.io",
"Insert column after": "Вставить справа",
"Insert column before": "Вставить слева",
"Insert row after": "Вставить снизу",
@@ -244,7 +249,7 @@
"Keep typing to filter": "Продолжайте печатать для фильтрации",
"Open link": "Открыть ссылку",
"Go to link": "Перейти по ссылке",
"Sorry, that type of link is not supported": "Sorry, that type of link is not supported",
"Sorry, that type of link is not supported": "К сожалению, этот тип ссылки не поддерживается",
"Ordered list": "Нумерованный список",
"Page break": "Разрыв страницы",
"Paste a link": "Вставить ссылку",
@@ -344,7 +349,7 @@
"Sort": "Сортировать",
"Saving": "Сохранение",
"Save": "Сохранить",
"Export started. If you have notifications enabled, you will receive an email when it's complete.": "Export started. If you have notifications enabled, you will receive an email when it's complete.",
"Export started. If you have notifications enabled, you will receive an email when it's complete.": "Экспорт запущен. Если у вас включены уведомления, вы получите письмо по завершении экспорта.",
"Exporting the collection <em>{{collectionName}}</em> may take a few seconds. Your documents will be a zip of folders with files in Markdown format. Please visit the Export section on settings to get the zip.": "Экспорт коллекции <em>{{collectionName}}</em> может занять несколько секунд. Ваши документы будут представлять собой архив папок с файлами в формате Markdown. Пожалуйста, посетите раздел «Экспорт» в настройках, чтобы скачать zip.",
"Exporting": "Экспортируется",
"Export Collection": "Экспортировать Коллекцию",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Разрешения на общий доступ к документам обновлены",
"Could not update public document sharing": "Не удалось обновить общий доступ к документу",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "Коллекция <em>{{ collectionName }}</em> является частной. По умолчанию члены команды не имеют к ней доступа.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Члены группы могут просматривать документы в коллекции <em>{{ collectionName }}</em> по умолчанию.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Члены группы могут просматривать и редактировать документы в коллекции <em>{{ collectionName }}</em> по умолчанию.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Члены группы могут просматривать документы в коллекции <em>{{ collectionName }}</em> по умолчанию.",
"When enabled, documents can be shared publicly on the internet.": "Если этот параметр включен, документы можно публиковать в Интернет.",
"Public sharing is currently disabled in the team security settings.": "Общий доступ в настоящее время отключен в настройках безопасности команды.",
"Additional access": "Дополнительный доступ",
@@ -431,11 +436,11 @@
"Share nested documents": "Поделиться вложенными документами",
"Nested documents are publicly available": "К вложенным документам открыт общий доступ",
"Nested documents are not shared": "Вложенные документы не находятся в общем доступе",
"{{ teamName }} is using Outline to share documents, please login to continue.": "{{ teamName }} is using Outline to share documents, please login to continue.",
"{{ teamName }} is using Outline to share documents, please login to continue.": "{{ teamName }} использует Outline для совместного использования документов, пожалуйста, войдите для продолжения.",
"Are you sure you want to delete the <em>{{ documentTitle }}</em> template?": "Удаляем шаблон <em>{{ documentTitle }}</em>?",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>.": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>one nested document</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>._plural": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested documents</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.": "Вы уверены? Удаление документа <em>{{ documentTitle }}</em> удалит всю его историю</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>.": "Вы уверены? Удаление документа <em>{{ documentTitle }}</em> удалит всю его историю и <em>один дочерний документ</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>._plural": "Вы уверены? Удаление документа <em>{{ documentTitle }}</em> удалит всю его историю и <em>{{ any }} дочерних документа(-ов)</em>.",
"If youd like the option of referencing or restoring the {{noun}} in the future, consider archiving it instead.": "Если понадобится вернуться к {{noun}} в дальнейшем, лучше архивируйте.",
"Archiving": "Архивирование",
"Document moved": "Документ перемещен",
@@ -599,14 +604,14 @@
"Webhook updated": "Вебхук обновлен",
"Update": "Обновление",
"Updating": "Обновление",
"Provide a descriptive name for this webhook and the URL we should send a POST request to when matching events are created.": "Provide a descriptive name for this webhook and the URL we should send a POST request to when matching events are created.",
"Subscribe to all events, groups, or individual events. We recommend only subscribing to the minimum amount of events that your application needs to function.": "Subscribe to all events, groups, or individual events. We recommend only subscribing to the minimum amount of events that your application needs to function.",
"Provide a descriptive name for this webhook and the URL we should send a POST request to when matching events are created.": "Укажите наглядное имя для этого вебхука и URL-адрес, по которому мы отправим POST запрос при создании подходящих событий.",
"Subscribe to all events, groups, or individual events. We recommend only subscribing to the minimum amount of events that your application needs to function.": "Подпишитесь на все события, группы или отдельные события. Мы рекомендуем подписаться на минимальное количество событий, которое требуется для функционирования вашего приложения.",
"URL": "URL",
"All events": "Все события",
"All {{ groupName }} events": "All {{ groupName }} events",
"All {{ groupName }} events": "Все события {{ groupName }}",
"Delete webhook": "Удалить вебхук",
"Disabled": "Отключено",
"Subscribed events": "Subscribed events",
"Subscribed events": "События с подпиской",
"Edit webhook": "Редактировать вебхук",
"Webhook created": "Вебхук создан",
"Logo updated": "Логотип обновлен",
@@ -619,19 +624,21 @@
"Choose a subdomain to enable a login page just for your team.": "Выберите поддомен, чтобы включить страницу входа только для вашей команды.",
"Start view": "Начать просмотр",
"This is the screen that team members will first see when they sign in.": "Это экран, который участники команды увидят при входе в систему.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Добавьте здесь адрес вашей инсталляции draw.io для автоматического встраивания диаграмм в документы.",
"Draw.io deployment": "Развертывание Draw.io",
"Export in progress…": "Выполняется экспорт…",
"Export deleted": "Экспорт удален",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "Полный экспорт может занять некоторое время, рассмотрите возможность экспорта одного документа или коллекции. Экспортированные данные представляют собой zip-архив ваших документов в формате Markdown. Вы можете покинуть эту страницу после того, как экспорт начнется — если у вас включены уведомления, мы отправим ссылку по адресу <em>{{ userEmail }}</em> , когда он будет завершен.",
"Export Requested": "Экспорт запрошен",
"Requesting Export": "Запрос на экспорт",
"Export Data": "Экспорт данных",
"Recent exports": "Недавний экспорт",
"Are you sure you want to disable collaborative editing?": "Are you sure you want to disable collaborative editing?",
"Are you sure you want to disable collaborative editing?": "Вы действительно хотите отключить совместное редактирование?",
"Manage optional and beta features. Changing these settings will affect the experience for all team members.": "Управление дополнительными и экспериментальными функциями. Изменение этих настроек повлияет на пользовательский опыт для всех членов команды.",
"Collaborative editing": "Совместное редактирование",
"When enabled multiple people can edit documents at the same time with shared presence and live cursors.": "Когда этот параметр включен, несколько человек могут редактировать документы одновременно с общим присутствием и живыми курсорами.",
"Im sure Disable": "Я уверен - Отключить",
"Enabling collaborative editing again in the future may cause some documents to revert to this point in time. It is not advised to disable this feature.": "Enabling collaborative editing again in the future may cause some documents to revert to this point in time. It is not advised to disable this feature.",
"Enabling collaborative editing again in the future may cause some documents to revert to this point in time. It is not advised to disable this feature.": "Повторное включение совместного редактирования в будущем может привести к откату некоторых документов в эту точку времени. Не рекомендуется отключать эту функцию.",
"New group": "Новая группа",
"Groups can be used to organize and manage the people on your team.": "Группы могут быть использованы для организации и управления людьми в вашей команде.",
"All groups": "Все группы",
@@ -650,11 +657,11 @@
"Collection created": "Коллекция создана",
"Receive a notification whenever a new collection is created": "Получать уведомление каждый раз, когда создана новая коллекция",
"Invite accepted": "Приглашение принято",
"Receive a notification when someone you invited creates an account": "Receive a notification when someone you invited creates an account",
"Export completed": "Export completed",
"Receive a notification when an export you requested has been completed": "Receive a notification when an export you requested has been completed",
"Receive a notification when someone you invited creates an account": "Получать уведомления, когда кто-то, кого вы пригласили, создает учетную запись",
"Export completed": "Экспорт завершен",
"Receive a notification when an export you requested has been completed": "Получать уведомление о готовности запрошенного экспорта",
"Getting started": "Начало работы",
"Tips on getting started with Outlines features and functionality": "Tips on getting started with Outlines features and functionality",
"Tips on getting started with Outlines features and functionality": "Советы по началу работы с функциями и возможностями Outline",
"New features": "Новые возможности",
"Receive an email when new features of note are added": "Получать уведомления о новых возможностях по электронной почте",
"Notifications saved": "Уведомления сохранены",
@@ -674,9 +681,9 @@
"Delete Account": "Удалить аккаунт",
"You may delete your account at any time, note that this is unrecoverable": "Удалить аккаунт можно в любое время — но вернуть данные не получится",
"Delete account": "Удалить аккаунт",
"Are you sure you want to require invites?": "Are you sure you want to require invites?",
"Are you sure you want to require invites?": "Вы уверены, что хотите требовать приглашений?",
"Im sure": "Я уверен",
"New users will first need to be invited to create an account. <em>Default role</em> and <em>Allowed domains</em> will no longer apply.": "New users will first need to be invited to create an account. <em>Default role</em> and <em>Allowed domains</em> will no longer apply.",
"New users will first need to be invited to create an account. <em>Default role</em> and <em>Allowed domains</em> will no longer apply.": "Новым пользователям нужно будет получать приглашение для создания аккаунта. <em>Роль по умолчанию</em> и <em>Разрешенные домены</em> больше не будут применяться.",
"Settings that impact the access, security, and content of your knowledge base.": "Настройки, влияющие на доступ, безопасность и содержимое вашей базы знаний.",
"Allow email authentication": "Разрешить аутентификацию по электронной почте",
"When enabled, users can sign-in using their email address": "Если этот параметр включен, пользователи могут входить в систему, используя свой адрес электронной почты",
@@ -686,12 +693,12 @@
"Links to supported services are shown as rich embeds within your documents": "Ссылки на поддерживаемые сервисы отображаются в ваших документах в виде расширенных вставок",
"Collection creation": "Создание коллекции",
"Allow members to create new collections within the knowledge base": "Разрешить участникам создавать новые коллекции в базе знаний",
"Require invites": "Require invites",
"Require members to be invited to the team before they can create an account using SSO.": "Require members to be invited to the team before they can create an account using SSO.",
"Require invites": "Требуется приглашение",
"Require members to be invited to the team before they can create an account using SSO.": "Требовать, чтобы участники были приглашены в команду, прежде чем они смогут создать аккаунт с помощью SSO.",
"Default role": "Роль по умолчанию",
"The default user role for new accounts. Changing this setting does not affect existing user accounts.": "Роль пользователя по умолчанию для новых учетных записей. Изменение этого параметра не влияет на существующие учетные записи пользователей.",
"Allowed domains": "Разрешенные домены",
"The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.",
"The domains which should be allowed to create new accounts using SSO. Changing this setting does not affect existing user accounts.": "Домены, которым должно быть разрешено создавать новые учетные записи с помощью SSO. Изменение этой настройки не повлияет на существующие учетные записи пользователей.",
"Remove domain": "Удалить домен",
"Add a domain": "Добавить домен",
"Save changes": "Сохранить изменения",
@@ -717,7 +724,7 @@
"There are no templates just yet.": "Шаблоны пока что отсутствуют.",
"You can create templates to help your team create consistent and accurate documentation.": "Вы можете создать шаблоны, чтобы помочь своей команде привести документацию к одному виду.",
"Trash is empty at the moment.": "Корзина пуста.",
"A confirmation code has been sent to your email address, please enter the code below to permanantly destroy your account.": "A confirmation code has been sent to your email address, please enter the code below to permanantly destroy your account.",
"A confirmation code has been sent to your email address, please enter the code below to permanantly destroy your account.": "Код подтверждения был отправлен на ваш адрес электронной почты, пожалуйста, введите код ниже, чтобы навсегда уничтожить ваш аккаунт.",
"<em>Note:</em> Signing back in will cause a new account to be automatically reprovisioned.": "<em>Примечание:</em> При повторном входе в систему будет создана новая учетная запись.",
"Are you sure? Deleting your account will destroy identifying data associated with your user and cannot be undone. You will be immediately logged out of Outline and all your API tokens will be revoked.": "Вы уверены? Удаление вашего аккаунта приведет к уничтожению идентификационных данных связанных с вашим пользователем. Незамедлительно будет выполнен выход из учетной записи, а все ваши API токены будут отозваны.",
"Delete My Account": "Удалить Мой Аккаунт",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Open document",
"New document": "New document",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Ladda ned",
"Download document": "Download document",
"Duplicate": "Duplicera",
@@ -198,6 +202,7 @@
"Export": "Exportera",
"Webhooks": "Webhooks",
"Integrations": "Integrations",
"Draw.io": "Draw.io",
"Insert column after": "Insert column after",
"Insert column before": "Insert column before",
"Insert row after": "Insert row after",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export in progress…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "เปิดเอกสาร",
"New document": "เอกสารใหม่",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "ดาวน์โหลด",
"Download document": "ดาวน์โหลดเอกสาร",
"Duplicate": "ทำสำเนา",
@@ -198,6 +202,7 @@
"Export": "ส่งออก",
"Webhooks": "Webhooks",
"Integrations": "Integration",
"Draw.io": "Draw.io",
"Insert column after": "แทรกคอลัมน์ถัดไป",
"Insert column before": "แทรกคอลัมน์ก่อนหน้า",
"Insert row after": "แทรกแถวถัดไป",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Public document sharing permissions were updated",
"Could not update public document sharing": "Could not update public document sharing",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Team members can view documents in the <em>{{ collectionName }}</em> collection by default.",
"When enabled, documents can be shared publicly on the internet.": "When enabled, documents can be shared publicly on the internet.",
"Public sharing is currently disabled in the team security settings.": "Public sharing is currently disabled in the team security settings.",
"Additional access": "Additional access",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Export in progress…",
"Export deleted": "Export deleted",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "Belgeyi aç",
"New document": "Yeni belge",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "İndir",
"Download document": "Belgeyi indir",
"Duplicate": "Çoğalt",
@@ -198,6 +202,7 @@
"Export": "Dışa Aktar",
"Webhooks": "Webhooks",
"Integrations": "Entegrasyonlar",
"Draw.io": "Draw.io",
"Insert column after": "Sağına sütun ekle",
"Insert column before": "Soluna Sütun Ekle",
"Insert row after": "Sonrasına satır ekle",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Herkese açık belge paylaşım izinleri güncellendi",
"Could not update public document sharing": "Herkese açık doküman paylaşımı güncellenemedi",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "<em>{{ collectionName }}</em> koleksiyonu özeldir. Takım üyelerinin varsayılan olarak buna erişimi yoktur.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Takım üyeleri varsayılan olarak <em>{{ collectionName }}</em> koleksiyonundaki belgeleri görüntüleyebilir.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Takım üyeleri, varsayılan olarak varsayılan olarak <em>{{ collectionName }}</em> koleksiyonundaki belgeleri görüntüleyebilir ve düzenleyebilir.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Takım üyeleri varsayılan olarak <em>{{ collectionName }}</em> koleksiyonundaki belgeleri görüntüleyebilir.",
"When enabled, documents can be shared publicly on the internet.": "Etkinleştirildiğinde, belgeler internette herkese açık olarak paylaşılabilir.",
"Public sharing is currently disabled in the team security settings.": "Herkese açık paylaşım şu anda ekip güvenlik ayarlarında devre dışı.",
"Additional access": "Ek erişim",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Yalnızca ekibiniz için bir giriş sayfasını etkinleştirmek için bir alt alan adı seçin.",
"Start view": "Görünümü başlat",
"This is the screen that team members will first see when they sign in.": "Bu, takım üyelerinin oturum açtıklarında ilk görecekleri ekrandır.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Dışa aktarma işlemi devam ediyor…",
"Export deleted": "Dışa aktarma silindi",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Nhà phát triển",
"Open document": "Mở tài liệu",
"New document": "Tài liệu mới",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "Tải về",
"Download document": "Tải tài liệu",
"Duplicate": "Nhân bản",
@@ -198,6 +202,7 @@
"Export": "Xuất",
"Webhooks": "Webhook",
"Integrations": "Tích hợp",
"Draw.io": "Draw.io",
"Insert column after": "Chèn cột sau",
"Insert column before": "Chèn cột trước",
"Insert row after": "Chèn hàng sau",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "Quyền chia sẻ tài liệu công khai đã được cập nhật",
"Could not update public document sharing": "Không thể cập nhật tài liệu chia sẻ công khai",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "Bộ sưu tập <em>{{ collectionName }}</em> là riêng tư. Các thành viên trong nhóm không có quyền truy cập vào nó theo mặc định.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Các thành viên trong nhóm có thể xem các tài liệu trong bộ sưu tập <em>{{ collectionName }}</em> theo mặc định.",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "Các thành viên trong nhóm có thể xem và chỉnh sửa các tài liệu trong bộ sưu tập <em>{{ collectionName }}</em> mặc định.",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "Các thành viên trong nhóm có thể xem các tài liệu trong bộ sưu tập <em>{{ collectionName }}</em> theo mặc định.",
"When enabled, documents can be shared publicly on the internet.": "Khi được bật, các tài liệu có thể được chia sẻ công khai trên internet.",
"Public sharing is currently disabled in the team security settings.": "Chia sẻ công khai hiện bị tắt trong cài đặt bảo mật của nhóm.",
"Additional access": "Quyền truy cập bổ sung",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Chọn một miền phụ để kích hoạt trang đăng nhập chỉ dành cho nhóm của bạn.",
"Start view": "Bắt đầu xem",
"This is the screen that team members will first see when they sign in.": "Đây là màn hình mà các thành viên trong nhóm sẽ nhìn thấy đầu tiên khi họ đăng nhập.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "Đang xuất dữ liệu…",
"Export deleted": "Kết xuất đã bị xóa",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
+15 -8
View File
@@ -10,6 +10,10 @@
"Developer": "开发者",
"Open document": "打开文档",
"New document": "新建文档",
"Subscribe": "订阅",
"Subscribed to document notifications": "订阅文档通知",
"Unsubscribe": "取消订阅",
"Unsubscribed from document notifications": "取消订阅文档通知",
"Download": "下载",
"Download document": "下载文档",
"Duplicate": "复制",
@@ -53,7 +57,7 @@
"Change theme": "更改主题",
"Change theme to": "更改主题",
"Switch team": "切换团队",
"Select a team": "Select a team",
"Select a team": "选择一个团队",
"Invite people": "邀请其他人",
"Collection": "文档集",
"Debug": "调试",
@@ -198,6 +202,7 @@
"Export": "导出",
"Webhooks": "Webhooks",
"Integrations": "集成",
"Draw.io": "Draw.io",
"Insert column after": "在右侧插入列",
"Insert column before": "在左侧插入列",
"Insert row after": "下方插入行",
@@ -259,7 +264,7 @@
"Table": "表格",
"Tip": "提示",
"Tip notice": "提示信息",
"Show diagram": "Show diagram",
"Show diagram": "显示图表",
"Show source": "查看源代码",
"Warning": "警告",
"Warning notice": "警告信息",
@@ -344,7 +349,7 @@
"Sort": "排序",
"Saving": "保存中",
"Save": "保存",
"Export started. If you have notifications enabled, you will receive an email when it's complete.": "Export started. If you have notifications enabled, you will receive an email when it's complete.",
"Export started. If you have notifications enabled, you will receive an email when it's complete.": "导出已开始。如果您启用了通知,您将在导出完毕后收到一封电子邮件。",
"Exporting the collection <em>{{collectionName}}</em> may take a few seconds. Your documents will be a zip of folders with files in Markdown format. Please visit the Export section on settings to get the zip.": "导出文档集 <em>{{collectionName}}</em> 可能需要几秒钟。您的文档将是包含 Markdown 格式文件的文件夹的压缩包。请访问“设置”页面的“导出”栏目以获取压缩包。",
"Exporting": "正在导出……",
"Export Collection": "导出文档集",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "公共文档共享权限已更新",
"Could not update public document sharing": "无法更新公共文档共享",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "<em>{{ collectionName }}</em> 合集是私有的。默认情况下团队成员没有访问权限。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "默认情况下,团队成员可以访问 <em>{{ collectionName }}</em> 合集中的文档。",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "默认情况下,团队成员可以访问和编辑 <em>{{ collectionName }}</em> 合集中的文档。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "默认情况下,团队成员可以访问 <em>{{ collectionName }}</em> 合集中的文档。",
"When enabled, documents can be shared publicly on the internet.": "启用后,可以在互联网上公开共享文档。",
"Public sharing is currently disabled in the team security settings.": "公共共享目前在团队安全设置中被禁用。",
"Additional access": "额外访问权限",
@@ -433,8 +438,8 @@
"Nested documents are not shared": "子文档未被共享",
"{{ teamName }} is using Outline to share documents, please login to continue.": "{{ teamName }} 正在使用 Outline 共享文档,请先登录。",
"Are you sure you want to delete the <em>{{ documentTitle }}</em> template?": "确认删除 <em>{{ documentTitle }}</em> 文档模板?",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>.": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>one nested document</em>.",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.": "您确定吗?删除 <em>{{ documentTitle }}</em> 文档将一并清除其所有历史记录</em>",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>.": "您确定吗?删除 <em>{{ documentTitle }}</em> 文档将一并清除其所有历史记录与<em>子文档</em>",
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested document</em>._plural": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history and <em>{{ any }} nested documents</em>.",
"If youd like the option of referencing or restoring the {{noun}} in the future, consider archiving it instead.": "如果您将来希望引用或还原{{noun}},请考虑将其存档。",
"Archiving": "正在归档",
@@ -605,7 +610,7 @@
"All events": "全部事件",
"All {{ groupName }} events": "全部 {{ groupName }} 事件",
"Delete webhook": "删除 Webhook",
"Disabled": "Disabled",
"Disabled": "已禁用",
"Subscribed events": "Subscribed events",
"Edit webhook": "编辑 Webhook",
"Webhook created": "已创建 Webhook",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "选择一个子域名来启用登陆页面,仅供你的团队使用。",
"Start view": "开始查看",
"This is the screen that team members will first see when they sign in.": "这是团队成员登录时首先看到的屏幕。",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "部署于 Draw.io",
"Export in progress…": "正在导出",
"Export deleted": "导出已删除",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
@@ -651,7 +658,7 @@
"Receive a notification whenever a new collection is created": "每当创建新文档集时收到通知",
"Invite accepted": "邀请已被接受",
"Receive a notification when someone you invited creates an account": "Receive a notification when someone you invited creates an account",
"Export completed": "Export completed",
"Export completed": "导出已完成",
"Receive a notification when an export you requested has been completed": "Receive a notification when an export you requested has been completed",
"Getting started": "新手指南",
"Tips on getting started with Outlines features and functionality": "开始使用 Outline 的特性和功能的提示",
+8 -1
View File
@@ -10,6 +10,10 @@
"Developer": "Developer",
"Open document": "打開文件",
"New document": "建立新文件",
"Subscribe": "Subscribe",
"Subscribed to document notifications": "Subscribed to document notifications",
"Unsubscribe": "Unsubscribe",
"Unsubscribed from document notifications": "Unsubscribed from document notifications",
"Download": "下載",
"Download document": "下載文件",
"Duplicate": "複製",
@@ -198,6 +202,7 @@
"Export": "匯出",
"Webhooks": "Webhooks",
"Integrations": "整合",
"Draw.io": "Draw.io",
"Insert column after": "插入欄位於右方",
"Insert column before": "插入欄位於左方",
"Insert row after": "插入下方列",
@@ -384,8 +389,8 @@
"Public document sharing permissions were updated": "公開分享文件的權限已經更新",
"Could not update public document sharing": "無法更新公開文件的權限設定",
"The <em>{{ collectionName }}</em> collection is private. Team members have no access to it by default.": "<em>{{ collectionName }}</em>文件集將被設為非公開。預設情況下,團隊成員將無法存取。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "預設情況下,團隊成員可以檢視<em>{{ collectionName }}</em>中的文件。",
"Team members can view and edit documents in the <em>{{ collectionName }}</em> collection by\n default.": "預設情況下,團隊成員可以檢視與編輯<em>{{ collectionName }}</em>中的文件。",
"Team members can view documents in the <em>{{ collectionName }}</em> collection by default.": "預設情況下,團隊成員可以檢視<em>{{ collectionName }}</em>中的文件。",
"When enabled, documents can be shared publicly on the internet.": "當啟用時,文件將會被公開分享到網際網路",
"Public sharing is currently disabled in the team security settings.": "團隊的安全性設定已經停用公開分享功能。",
"Additional access": "額外的存取權限",
@@ -619,6 +624,8 @@
"Choose a subdomain to enable a login page just for your team.": "Choose a subdomain to enable a login page just for your team.",
"Start view": "Start view",
"This is the screen that team members will first see when they sign in.": "This is the screen that team members will first see when they sign in.",
"Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.": "Add your self-hosted draw.io installation url here to enable automatic embedding of diagrams within documents.",
"Draw.io deployment": "Draw.io deployment",
"Export in progress…": "正在匯出...",
"Export deleted": "匯出已刪除",
"A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.": "A full export might take some time, consider exporting a single document or collection. The exported data is a zip of your documents in Markdown format. You may leave this page once the export has started if you have notifications enabled, we will email a link to <em>{{ userEmail }}</em> when its complete.",
File diff suppressed because it is too large Load Diff
@@ -1,6 +1,6 @@
import { createGlobalStyle } from "styled-components";
import styledNormalize from "styled-normalize";
import { breakpoints, depths } from "@shared/styles";
import { breakpoints, depths } from ".";
export default createGlobalStyle`
${styledNormalize}
@@ -12,7 +12,7 @@ export default createGlobalStyle`
html,
body {
width: 100%;
min-height: 100vh;
height: 100%;
margin: 0;
padding: 0;
print-color-adjust: exact;
@@ -39,6 +39,13 @@ export default createGlobalStyle`
text-rendering: optimizeLegibility;
}
@media (min-width: ${breakpoints.tablet}px) {
html,
body {
min-height: 100vh;
}
}
@media (min-width: ${breakpoints.tablet}px) and (display-mode: standalone) {
body:after {
content: "";
+8 -2
View File
@@ -1,3 +1,9 @@
/**
* Parse the likely document identifier from a given url.
*
* @param url The url to parse.
* @returns A document identifier or undefined if not found.
*/
export default function parseDocumentSlug(url: string) {
let parsed;
@@ -12,6 +18,6 @@ export default function parseDocumentSlug(url: string) {
}
return parsed.lastIndexOf("/doc/") === 0
? parsed.replace(/^\/doc\//, "")
: null;
? parsed.replace(/^\/doc\//, "").split("#")[0]
: undefined;
}
+64 -7
View File
@@ -3680,7 +3680,7 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.5.0:
acorn@^8.5.0, acorn@^8.7.1:
version "8.8.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
@@ -5985,7 +5985,7 @@ damerau-levenshtein@^1.0.6:
resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791"
integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==
data-urls@^3.0.1:
data-urls@^3.0.1, data-urls@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143"
integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==
@@ -6636,6 +6636,11 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
entities@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
entities@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
@@ -8357,10 +8362,10 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
https-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
dependencies:
agent-base "6"
debug "4"
@@ -9617,6 +9622,39 @@ jsdom@^19.0.0:
ws "^8.2.3"
xml-name-validator "^4.0.0"
jsdom@^20.0.0:
version "20.0.0"
resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.0.tgz#882825ac9cc5e5bbee704ba16143e1fa78361ebf"
integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==
dependencies:
abab "^2.0.6"
acorn "^8.7.1"
acorn-globals "^6.0.0"
cssom "^0.5.0"
cssstyle "^2.3.0"
data-urls "^3.0.2"
decimal.js "^10.3.1"
domexception "^4.0.0"
escodegen "^2.0.0"
form-data "^4.0.0"
html-encoding-sniffer "^3.0.0"
http-proxy-agent "^5.0.0"
https-proxy-agent "^5.0.1"
is-potential-custom-element-name "^1.0.1"
nwsapi "^2.2.0"
parse5 "^7.0.0"
saxes "^6.0.0"
symbol-tree "^3.2.4"
tough-cookie "^4.0.0"
w3c-hr-time "^1.0.2"
w3c-xmlserializer "^3.0.0"
webidl-conversions "^7.0.0"
whatwg-encoding "^2.0.0"
whatwg-mimetype "^3.0.0"
whatwg-url "^11.0.0"
ws "^8.8.0"
xml-name-validator "^4.0.0"
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
@@ -11026,6 +11064,11 @@ node-gyp-build@^3.9.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25"
integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==
node-htmldiff@^0.9.4:
version "0.9.4"
resolved "https://registry.yarnpkg.com/node-htmldiff/-/node-htmldiff-0.9.4.tgz#d8fec52fbe736780afff28d2c8476ec106520887"
integrity sha512-Nvnv0bcehOFsH/TD+bi4ls3iWTRQiytqII5+I1iBUypO+GFMYLcyBJfS2U3DMRSIYzfZHysaYLYoCXx6Q148Hg==
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -11560,6 +11603,13 @@ parse5@6.0.1, parse5@^6.0.1:
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
parse5@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746"
integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==
dependencies:
entities "^4.4.0"
parseqs@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5"
@@ -13224,6 +13274,13 @@ saxes@^5.0.1:
dependencies:
xmlchars "^2.2.0"
saxes@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
dependencies:
xmlchars "^2.2.0"
scheduler@^0.19.1:
version "0.19.1"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
@@ -15638,7 +15695,7 @@ ws@^7.5.3:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
ws@^8.2.3, ws@^8.5.0:
ws@^8.2.3, ws@^8.5.0, ws@^8.8.0:
version "8.8.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0"
integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==