Compare commits

...

35 Commits

Author SHA1 Message Date
Anthony Stirling
625275124a fix for #818 2024-02-18 15:47:19 +00:00
Anthony Stirling
c96ebccae4 Download message for game 2024-02-18 13:30:56 +00:00
Anthony Stirling
20cb460a7e controls and sizing bounds 2024-02-18 09:45:50 +00:00
Anthony Stirling
3a62d19979 game const 2024-02-18 09:21:30 +00:00
Ludy
51ad741744 Fix 746 (#825)
* Fix: #746

* formatting
2024-02-18 07:40:30 +00:00
Anthony Stirling
673f005fe6 Game fixes and ocr docs (#824) 2024-02-17 23:23:07 +00:00
Ludy
8d9f0361d0 Fix Serbia Language (#822)
* Fix Serbia Language

* Rename messages_sr_Latn_RS.properties to messages_sr_LATN_RS.properties

* Update languages.html

* Update README.md
2024-02-17 19:56:56 +00:00
Anthony Stirling
56e3ec1219 Update HowToUseOCR.md 2024-02-17 19:28:32 +00:00
dependabot[bot]
a0acafcefc Bump org.springframework:spring-webmvc from 6.1.2 to 6.1.3 (#713)
Bumps [org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/spring-projects/spring-framework/releases)
- [Commits](https://github.com/spring-projects/spring-framework/compare/v6.1.2...v6.1.3)

---
updated-dependencies:
- dependency-name: org.springframework:spring-webmvc
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 13:24:38 +00:00
dependabot[bot]
918f5954b7 Bump io.micrometer:micrometer-core from 1.12.2 to 1.12.3 (#806)
Bumps [io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer) from 1.12.2 to 1.12.3.
- [Release notes](https://github.com/micrometer-metrics/micrometer/releases)
- [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.12.2...v1.12.3)

---
updated-dependencies:
- dependency-name: io.micrometer:micrometer-core
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-17 13:23:10 +00:00
albanobattistella
148dcdaee7 Update messages_it_IT.properties (#816) 2024-02-17 13:22:15 +00:00
Anthony Stirling
a5f0777892 Update ConfigInitializer.java for auto settings removal 2024-02-17 13:10:00 +00:00
Ludy
010426d488 Document (#803)
* Update HowToAddNewLanguage.md

* Update HowToUseOCR.md

* Update LocalRunGuide.md

* Update README.md

* Update LocalRunGuide.md

* Update README.md

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-02-16 22:42:56 +00:00
Aliarev
6fc9c7be90 Update french translation (#814) 2024-02-16 22:24:26 +00:00
Sherif Metwally
094fde9801 Update-helm-chart (#815)
* upgrade app in helm chart to 0.20.2

* update and correct UI env variable names in chart values.yaml
2024-02-16 22:23:11 +00:00
Ludy
e4a76e96af HTML, CSS, JS and JAVA corrections (#810)
* CSS corrections

* HTML corrections

* JS corrections

* JAVA corrections

* remove tab

* CSS corrections 2

* JS corrections 2

* back to the roots

* max-linie 127

* add slash hr|br

* return bootstrap-icons.css

* return bootstrap-icons.min.css

* return bootstrap.min.css

* Update bootstrap-icons.css

* Update bootstrap-icons.min.css

* Update bootstrap-icons.min.css

* Update bootstrap.min.css

* CSS corrections

* HTML corrections

* JS corrections

* JAVA corrections

* remove tab

* CSS corrections 2

* JS corrections 2

* back to the roots

* max-linie 127

* add slash hr|br

* return bootstrap-icons.css

* Update bootstrap-icons.css

* Bootstrap CSS

* Update prism.css
2024-02-16 21:49:06 +00:00
Anthony Stirling
68f582bcb9 Merge pull request #811 from NeilJared/main
Update messages_es_ES.properties
2024-02-14 21:27:59 +00:00
NeilJared
639aed7120 Update messages_es_ES.properties
Updated es_ES translation
2024-02-14 12:22:47 +01:00
NeilJared
994bb4d1d2 Update messages_es_ES.properties
Minor bug fixes: es_ES translation
2024-02-14 11:57:34 +01:00
Anthony Stirling
80b11a55fa Merge pull request #804 from Ludy87/missing_pageSelectionPrompt
add missing propertie pageSelectionPrompt
2024-02-11 22:43:08 +00:00
Ludy87
3cfb554623 missing propertie pageSelectionPrompt 2024-02-11 21:10:04 +01:00
Eric
e84f9c5946 Merge pull request #796 from Ludy87/languages
Languages
2024-02-11 14:41:15 -05:00
Ludy87
17cc31d6e7 add placeholder translation 2024-02-11 14:32:34 -05:00
Ludy87
0c6e10a6dd add separator 2024-02-11 14:32:34 -05:00
Ludy87
297c57631f remove dublicate -> change showJS.tags to autoRedact.tags 2024-02-11 14:32:34 -05:00
Ludy87
bd4e252bb6 added missing strings 2024-02-11 14:32:33 -05:00
Ludy87
0ce34c70bc Update messages_de_DE.properties 2024-02-11 14:32:33 -05:00
Ludy87
4df75cfba1 Update messages_de_DE.properties 2024-02-11 14:32:33 -05:00
Ludy87
2aa435bcfb double spaces removed 2024-02-11 14:32:33 -05:00
Ludy87
0a4a9e6947 Removed unnecessary characters and added DE missing strings 2024-02-11 14:32:32 -05:00
Anthony Stirling
d5860d0b55 Update PdfToTextOrRTFRequest.java 2024-02-11 18:47:43 +00:00
Eric
6a487ce514 Merge pull request #802 from Stirling-Tools/normalize_files
refactor: normalize all files (strip trailing whitespace + convert CRLF to LF)
2024-02-11 13:11:37 -05:00
sbplat
4f3b85e66b refactor: normalize files that contained both CRLF and LF 2024-02-11 12:14:21 -05:00
sbplat
370cd97e05 misc: update .git-blame-ignore-revs to ignore normalize files commit in blame 2024-02-11 11:54:03 -05:00
sbplat
55d4fda01b refactor: normalize files 2024-02-11 11:47:00 -05:00
208 changed files with 23300 additions and 23504 deletions

View File

@@ -1,2 +1,5 @@
# Formatting # Formatting
5f771b785130154ed47952635b7acef371ffe0ec 5f771b785130154ed47952635b7acef371ffe0ec
# Normalize files
55d4fda01b2f39f5b7d7b4fda5214bd7ff0fd5dd

View File

@@ -12,7 +12,7 @@ https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/temp
and add a flag svg file to and add a flag svg file to
https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags https://github.com/Stirling-Tools/Stirling-PDF/tree/main/src/main/resources/static/images/flags
Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/) Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/)
If your language isnt represented by a flag just find whichever closely matches it, such as for Arabic i chose Saudi Arabia If your language isn't represented by a flag just find whichever closely matches it, such as for Arabic i chose Saudi Arabia
For example to add Polish you would add For example to add Polish you would add
@@ -32,7 +32,7 @@ Copy and rename it to messages_{your data-language-code here}.properties, in the
Then simply translate all property entries within that file and make a PR into main for others to use! Then simply translate all property entries within that file and make a PR into main for others to use!
If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but wont be able to verify the translations themselves) If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but won't be able to verify the translations themselves)

View File

@@ -2,8 +2,8 @@
This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker. This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker.
## My OCR used to work and now doesnt! ## My OCR used to work and now doesn't!
Please update your tesseract docker volume path version from 4.00 to 5 The paths have changed for the tessadata locations on new docker images, please use ``/usr/share/tessdata`` (Others should still work for backwards compatability but might not)
## How does the OCR Work ## How does the OCR Work
Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition. Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition.

View File

@@ -65,7 +65,7 @@ sudo make install
``` ```
### Step 3: Install Additional Software ### Step 3: Install Additional Software
Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and opencv for patern recognition functionality. Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and opencv for pattern recognition functionality.
Install the following software: Install the following software:
@@ -264,7 +264,7 @@ sudo systemctl restart stirlingpdf.service
Remember to set the necessary environment variables before running the project if you want to customize the application the list can be seen in the main readme. Remember to set the necessary environment variables before running the project if you want to customize the application the list can be seen in the main readme.
You can do this in the terminal by using the `export` command or -D arguements to java -jar command: You can do this in the terminal by using the `export` command or -D argument to java -jar command:
```bash ```bash
export APP_HOME_NAME="Stirling PDF" export APP_HOME_NAME="Stirling PDF"

View File

@@ -6,7 +6,7 @@
[![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Stirling-Tools/Stirling-PDF/) [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Stirling-Tools/Stirling-PDF/)
[![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf) [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf)
[![Paypal Donate](https://img.shields.io/badge/Paypal%20Donate-yellow?style=flat&logo=paypal)](https://www.paypal.com/paypalme/froodleplex) [![Paypal Donate](https://img.shields.io/badge/Paypal%20Donate-yellow?style=flat&logo=paypal)](https://www.paypal.com/paypalme/froodleplex)
[![Github Sponser](https://img.shields.io/badge/Github%20Sponsor-yellow?style=flat&logo=github)](https://github.com/sponsors/Frooodle) [![Github Sponsor](https://img.shields.io/badge/Github%20Sponsor-yellow?style=flat&logo=github)](https://github.com/sponsors/Frooodle)
[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af)
@@ -172,7 +172,7 @@ Stirling PDF currently supports 26!
- Hindi (हिंदी) (hi_IN) - Hindi (हिंदी) (hi_IN)
- Hungarian (Magyar) (hu_HU) - Hungarian (Magyar) (hu_HU)
- Bulgarian (Български) (bg_BG) - Bulgarian (Български) (bg_BG)
- Sebian Latin alphabet (Srpski) (sr-Latn-RS) - Sebian Latin alphabet (Srpski) (sr_LATN_RS)
## Contributing (creating issues, translations, fixing bugs, etc.) ## Contributing (creating issues, translations, fixing bugs, etc.)
@@ -262,7 +262,7 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
- Redact text (Via UI not just automated way) - Redact text (Via UI not just automated way)
- Add Forms - Add Forms
- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing - Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing
- Fill forms mannual and automatic - Fill forms manually or automatically
### Q2: Why is my application downloading .htm files? ### Q2: Why is my application downloading .htm files?
This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files. This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files.

View File

@@ -89,7 +89,7 @@ dependencies {
//security updates //security updates
implementation 'ch.qos.logback:logback-classic:1.4.14' implementation 'ch.qos.logback:logback-classic:1.4.14'
implementation 'ch.qos.logback:logback-core:1.4.14' implementation 'ch.qos.logback:logback-core:1.4.14'
implementation 'org.springframework:spring-webmvc:6.1.2' implementation 'org.springframework:spring-webmvc:6.1.3'
implementation("io.github.pixee:java-security-toolkit:1.1.2") implementation("io.github.pixee:java-security-toolkit:1.1.2")
@@ -150,7 +150,7 @@ dependencies {
implementation 'org.bouncycastle:bcprov-jdk18on:1.77' implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.2'
implementation 'io.micrometer:micrometer-core:1.12.2' implementation 'io.micrometer:micrometer-core:1.12.3'
implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' implementation group: 'com.google.zxing', name: 'core', version: '3.5.2'
// https://mvnrepository.com/artifact/org.commonmark/commonmark // https://mvnrepository.com/artifact/org.commonmark/commonmark
implementation 'org.commonmark:commonmark:0.21.0' implementation 'org.commonmark:commonmark:0.21.0'

View File

@@ -1,5 +1,5 @@
apiVersion: v2 apiVersion: v2
appVersion: 0.14.2 appVersion: 0.20.2
description: locally hosted web application that allows you to perform various operations on PDF files description: locally hosted web application that allows you to perform various operations on PDF files
home: https://github.com/Stirling-Tools/Stirling-PDF home: https://github.com/Stirling-Tools/Stirling-PDF
keywords: keywords:

View File

@@ -16,11 +16,11 @@ commonLabels: {}
# team_name: dev # team_name: dev
envs: [] envs: []
# - name: PP_HOME_NAME # - name: UI_APP_NAME
# value: "Stirling PDF" # value: "Stirling PDF"
# - name: APP_HOME_DESCRIPTION # - name: UI_HOME_DESCRIPTION
# value: "Your locally hosted one-stop-shop for all your PDF needs." # value: "Your locally hosted one-stop-shop for all your PDF needs."
# - name: APP_NAVBAR_NAME # - name: UI_APP_NAVBAR_NAME
# value: "Stirling PDF" # value: "Stirling PDF"
# - name: ALLOW_GOOGLE_VISIBILITY # - name: ALLOW_GOOGLE_VISIBILITY
# value: "true" # value: "true"

View File

@@ -15,7 +15,7 @@ services:
ports: ports:
- 8080:8080 - 8080:8080
volumes: volumes:
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw - /stirling/latest/data:/usr/share/tessdata:rw
- /stirling/latest/config:/configs:rw - /stirling/latest/config:/configs:rw
- /stirling/latest/logs:/logs:rw - /stirling/latest/logs:/logs:rw
environment: environment:

View File

@@ -15,7 +15,7 @@ services:
ports: ports:
- 8080:8080 - 8080:8080
volumes: volumes:
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw - /stirling/latest/data:/usr/share/tessdata:rw
- /stirling/latest/config:/configs:rw - /stirling/latest/config:/configs:rw
- /stirling/latest/logs:/logs:rw - /stirling/latest/logs:/logs:rw
environment: environment:

View File

@@ -15,7 +15,7 @@ services:
ports: ports:
- 8080:8080 - 8080:8080
volumes: volumes:
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw - /stirling/latest/data:/usr/share/tessdata:rw
- /stirling/latest/config:/configs:rw - /stirling/latest/config:/configs:rw
- /stirling/latest/logs:/logs:rw - /stirling/latest/logs:/logs:rw
environment: environment:

View File

@@ -15,7 +15,7 @@ services:
ports: ports:
- 8080:8080 - 8080:8080
volumes: volumes:
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw - /stirling/latest/data:/usr/share/tessdata:rw
- /stirling/latest/config:/configs:rw - /stirling/latest/config:/configs:rw
- /stirling/latest/logs:/logs:rw - /stirling/latest/logs:/logs:rw
environment: environment:

View File

@@ -1,37 +0,0 @@
import cv2
import sys
import argparse
import numpy as np
def is_blank_image(image_path, threshold=10, white_percent=99, white_value=255, blur_size=5):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print(f"Error: Unable to read the image file: {image_path}")
return False
# Apply Gaussian blur to reduce noise
blurred_image = cv2.GaussianBlur(image, (blur_size, blur_size), 0)
_, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY)
# Calculate the percentage of white pixels in the thresholded image
white_pixels = np.sum(thresholded_image == white_value)
white_pixel_percentage = (white_pixels / thresholded_image.size) * 100
print(f"Page has white pixel percent of {white_pixel_percentage}")
return white_pixel_percentage >= white_percent
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Detect if an image is considered blank or not.')
parser.add_argument('image_path', help='The path to the image file.')
parser.add_argument('-t', '--threshold', type=int, default=10, help='Threshold for determining white pixels. The default value is 10.')
parser.add_argument('-w', '--white_percent', type=float, default=99, help='The percentage of white pixels for an image to be considered blank. The default value is 99.')
args = parser.parse_args()
blank = is_blank_image(args.image_path, args.threshold, args.white_percent)
# Return code 1: The image is considered blank.
# Return code 0: The image is not considered blank.
sys.exit(int(blank))

View File

@@ -79,6 +79,16 @@ public class ConfigInitializer
return parts.length > 0 ? parts[0].trim().replace("#", "").trim() : ""; return parts.length > 0 ? parts[0].trim().replace("#", "").trim() : "";
}; };
Function<String, Integer> getIndentationLevel =
line -> {
int count = 0;
for (char ch : line.toCharArray()) {
if (ch == ' ') count++;
else break;
}
return count;
};
Set<String> userKeys = userLines.stream().map(extractKey).collect(Collectors.toSet()); Set<String> userKeys = userLines.stream().map(extractKey).collect(Collectors.toSet());
for (String line : templateLines) { for (String line : templateLines) {
@@ -134,10 +144,77 @@ public class ConfigInitializer
.map(extractKey) .map(extractKey)
.anyMatch(templateKey -> templateKey.equalsIgnoreCase(userKey)); .anyMatch(templateKey -> templateKey.equalsIgnoreCase(userKey));
if (!isPresentInTemplate && !isCommented.apply(userLine)) { if (!isPresentInTemplate && !isCommented.apply(userLine)) {
if (!childOfTemplateEntry(
isCommented,
extractKey,
getIndentationLevel,
userLines,
userLine,
templateLines)) {
// check if userLine is a child of a entry within templateLines or not, if child
// of parent in templateLines then dont add to mergedLines, if anything else
// then add
mergedLines.add(userLine); mergedLines.add(userLine);
} }
} }
}
Files.write(outputPath, mergedLines, StandardCharsets.UTF_8); Files.write(outputPath, mergedLines, StandardCharsets.UTF_8);
} }
// New method to check if a userLine is a child of an entry in templateLines
boolean childOfTemplateEntry(
Function<String, Boolean> isCommented,
Function<String, String> extractKey,
Function<String, Integer> getIndentationLevel,
List<String> userLines,
String userLine,
List<String> templateLines) {
String userKey = extractKey.apply(userLine).trim();
int userIndentation = getIndentationLevel.apply(userLine);
// Start by assuming the line is not a child of an entry in templateLines
boolean isChild = false;
// Iterate backwards through userLines from the current line to find any parent
for (int i = userLines.indexOf(userLine) - 1; i >= 0; i--) {
String potentialParentLine = userLines.get(i);
int parentIndentation = getIndentationLevel.apply(potentialParentLine);
// Check if we've reached a potential parent based on indentation
if (parentIndentation < userIndentation) {
String parentKey = extractKey.apply(potentialParentLine).trim();
// Now, check if this potential parent or any of its parents exist in templateLines
boolean parentExistsInTemplate =
templateLines.stream()
.filter(line -> !isCommented.apply(line)) // Skip commented lines
.anyMatch(
templateLine -> {
String templateKey =
extractKey.apply(templateLine).trim();
return parentKey.equalsIgnoreCase(templateKey);
});
if (!parentExistsInTemplate) {
// If the parent does not exist in template, check the next level parent
userIndentation =
parentIndentation; // Update userIndentation to the parent's indentation
// for next iteration
if (parentIndentation == 0) {
// If we've reached the top-level parent and it's not in template, the
// original line is considered not a child
isChild = false;
break;
}
} else {
// If any parent exists in template, the original line is considered a child
isChild = true;
break;
}
}
}
return isChild; // Return true if the line is not a child of any entry in templateLines
}
} }

View File

@@ -140,7 +140,6 @@ public class EndpointConfiguration {
// CLI // CLI
addEndpointToGroup("CLI", "compress-pdf"); addEndpointToGroup("CLI", "compress-pdf");
addEndpointToGroup("CLI", "extract-image-scans"); addEndpointToGroup("CLI", "extract-image-scans");
addEndpointToGroup("CLI", "remove-blanks");
addEndpointToGroup("CLI", "repair"); addEndpointToGroup("CLI", "repair");
addEndpointToGroup("CLI", "pdf-to-pdfa"); addEndpointToGroup("CLI", "pdf-to-pdfa");
addEndpointToGroup("CLI", "file-to-pdf"); addEndpointToGroup("CLI", "file-to-pdf");
@@ -218,6 +217,7 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "split-by-size-or-count"); addEndpointToGroup("Java", "split-by-size-or-count");
addEndpointToGroup("Java", "overlay-pdf"); addEndpointToGroup("Java", "overlay-pdf");
addEndpointToGroup("Java", "split-pdf-by-sections"); addEndpointToGroup("Java", "split-pdf-by-sections");
addEndpointToGroup("Java", "remove-blanks");
// Javascript // Javascript
addEndpointToGroup("Javascript", "pdf-organizer"); addEndpointToGroup("Javascript", "pdf-organizer");

View File

@@ -9,6 +9,9 @@ import org.springframework.security.authentication.dao.DaoAuthenticationProvider
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
@@ -44,6 +47,11 @@ public class SecurityConfiguration {
@Autowired private FirstLoginFilter firstLoginFilter; @Autowired private FirstLoginFilter firstLoginFilter;
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
@Bean @Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); http.addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
@@ -53,6 +61,14 @@ public class SecurityConfiguration {
http.csrf(csrf -> csrf.disable()); http.csrf(csrf -> csrf.disable());
http.addFilterBefore(rateLimitingFilter(), UsernamePasswordAuthenticationFilter.class); http.addFilterBefore(rateLimitingFilter(), UsernamePasswordAuthenticationFilter.class);
http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class); http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class);
http.sessionManagement(
sessionManagement ->
sessionManagement
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.maximumSessions(3)
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry())
.expiredUrl("/login?logout=true"));
http.formLogin( http.formLogin(
formLogin -> formLogin ->
formLogin formLogin

View File

@@ -10,6 +10,9 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
@@ -228,11 +231,27 @@ public class UserController {
if (currentUsername.equals(username)) { if (currentUsername.equals(username)) {
throw new IllegalArgumentException("Cannot delete currently logined in user."); throw new IllegalArgumentException("Cannot delete currently logined in user.");
} }
invalidateUserSessions(username);
userService.deleteUser(username); userService.deleteUser(username);
return "redirect:/addUsers"; return "redirect:/addUsers";
} }
@Autowired private SessionRegistry sessionRegistry;
private void invalidateUserSessions(String username) {
for (Object principal : sessionRegistry.getAllPrincipals()) {
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
if (userDetails.getUsername().equals(username)) {
for (SessionInformation session :
sessionRegistry.getAllSessions(principal, false)) {
session.expireNow();
}
}
}
}
}
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@PostMapping("/get-api-key") @PostMapping("/get-api-key")
public ResponseEntity<String> getApiKey(Principal principal) { public ResponseEntity<String> getApiKey(Principal principal) {

View File

@@ -41,7 +41,7 @@ public class OCRController {
private static final Logger logger = LoggerFactory.getLogger(OCRController.class); private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
public List<String> getAvailableTesseractLanguages() { public List<String> getAvailableTesseractLanguages() {
String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata"; String tessdataDir = "/usr/share/tessdata";
File[] files = new File(tessdataDir).listFiles(); File[] files = new File(tessdataDir).listFiles();
if (files == null) { if (files == null) {
return Collections.emptyList(); return Collections.emptyList();

View File

@@ -33,6 +33,8 @@ public class AccountWebController {
return "redirect:/"; return "redirect:/";
} }
model.addAttribute("currentPage", "login");
if (request.getParameter("error") != null) { if (request.getParameter("error") != null) {
model.addAttribute("error", request.getParameter("error")); model.addAttribute("error", request.getParameter("error"));
@@ -112,6 +114,7 @@ public class AccountWebController {
model.addAttribute("role", user.get().getRolesAsString()); model.addAttribute("role", user.get().getRolesAsString());
model.addAttribute("settings", settingsJson); model.addAttribute("settings", settingsJson);
model.addAttribute("changeCredsFlag", user.get().isFirstLogin()); model.addAttribute("changeCredsFlag", user.get().isFirstLogin());
model.addAttribute("currentPage", "account");
} }
} else { } else {
return "redirect:/"; return "redirect:/";

View File

@@ -82,7 +82,7 @@ public class OtherWebController {
} }
public List<String> getAvailableTesseractLanguages() { public List<String> getAvailableTesseractLanguages() {
String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata"; String tessdataDir = "/usr/share/tessdata";
File[] files = new File(tessdataDir).listFiles(); File[] files = new File(tessdataDir).listFiles();
if (files == null) { if (files == null) {
return Collections.emptyList(); return Collections.emptyList();

View File

@@ -12,6 +12,6 @@ public class PdfToTextOrRTFRequest extends PDFFile {
@Schema( @Schema(
description = "The output Text or RTF format", description = "The output Text or RTF format",
allowableValues = {"rtf", "txt:Text"}) allowableValues = {"rtf", "txt"})
private String outputFormat; private String outputFormat;
} }

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=اختر صورة
genericSubmit=إرسال genericSubmit=إرسال
processTimeWarning=تحذير: يمكن أن تستغرق هذه العملية ما يصل إلى دقيقة حسب حجم الملف processTimeWarning=تحذير: يمكن أن تستغرق هذه العملية ما يصل إلى دقيقة حسب حجم الملف
pageOrderPrompt=ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): pageOrderPrompt=ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=اذهب goToPage=اذهب
true=\u0635\u062D\u064A\u062D true=\u0635\u062D\u064A\u062D
false=\u062E\u0637\u0623 false=\u062E\u0637\u0623
@@ -19,6 +20,7 @@ save=\u062D\u0641\u0638
close=\u0625\u063A\u0644\u0627\u0642 close=\u0625\u063A\u0644\u0627\u0642
filesSelected=الملفات المحددة filesSelected=الملفات المحددة
noFavourites=لم تتم إضافة أي مفضلات noFavourites=لم تتم إضافة أي مفضلات
downloadComplete=Download Complete
bored=الانتظار بالملل؟ bored=الانتظار بالملل؟
alphabet=\u0627\u0644\u0623\u0628\u062C\u062F\u064A\u0629 alphabet=\u0627\u0644\u0623\u0628\u062C\u062F\u064A\u0629
downloadPdf=تنزيل PDF downloadPdf=تنزيل PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=\u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\
changeMetadata.modDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062A\u0639\u062F\u064A\u0644 (yyyy / MM / dd HH: mm: ss): changeMetadata.modDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062A\u0639\u062F\u064A\u0644 (yyyy / MM / dd HH: mm: ss):
changeMetadata.producer=\u0627\u0644\u0645\u0646\u062A\u062C: changeMetadata.producer=\u0627\u0644\u0645\u0646\u062A\u062C:
changeMetadata.subject=\u0627\u0644\u0645\u0648\u0636\u0648\u0639: changeMetadata.subject=\u0627\u0644\u0645\u0648\u0636\u0648\u0639:
changeMetadata.title=\u0627\u0644\u0639\u0646\u0648\u0627\u0646:
changeMetadata.trapped=\u0645\u062D\u0627\u0635\u0631: changeMetadata.trapped=\u0645\u062D\u0627\u0635\u0631:
changeMetadata.selectText.4=\u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629 \u0623\u062E\u0631\u0649: changeMetadata.selectText.4=\u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629 \u0623\u062E\u0631\u0649:
changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0627\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u062E\u0635\u0635 changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0627\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u062E\u0635\u0635

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Изберете изображение(я)
genericSubmit=Подайте genericSubmit=Подайте
processTimeWarning=Предупреждение: Този процес може да отнеме до минута в зависимост от размера на файла processTimeWarning=Предупреждение: Този процес може да отнеме до минута в зависимост от размера на файла
pageOrderPrompt=Персонализиран ред на страниците (Въведете разделен със запетаи списък с номера на страници или функции като 2n+1): pageOrderPrompt=Персонализиран ред на страниците (Въведете разделен със запетаи списък с номера на страници или функции като 2n+1):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Давай goToPage=Давай
true=Вярно true=Вярно
false=Невярно false=Невярно
@@ -19,6 +20,7 @@ save=Съхранете
close=Затворете close=Затворете
filesSelected=избрани файлове filesSelected=избрани файлове
noFavourites=Няма добавени любими noFavourites=Няма добавени любими
downloadComplete=Download Complete
bored=Отекчени сте да чакате? bored=Отекчени сте да чакате?
alphabet=Азбука alphabet=Азбука
downloadPdf=Изтеглете PDF downloadPdf=Изтеглете PDF
@@ -42,7 +44,7 @@ red=Червено
green=Зелено green=Зелено
blue=Синьо blue=Синьо
custom=Персонализиране... custom=Персонализиране...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Настройки на акаунта
account.adminSettings=Настройки на администратора - Преглед и добавяне на потребители account.adminSettings=Настройки на администратора - Преглед и добавяне на потребители
account.userControlSettings=Настройки за потребителски контрол account.userControlSettings=Настройки за потребителски контрол
account.changeUsername=Промени потребител account.changeUsername=Промени потребител
account.changeUsername=Промени потребител account.newUsername=Ново потребителско име
account.password=Парола за потвърждение account.password=Парола за потвърждение
account.oldPassword=Стара парола account.oldPassword=Стара парола
account.newPassword=Нова парола account.newPassword=Нова парола
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=единична страница
home.showJS.title=Показване на Javascript home.showJS.title=Показване на Javascript
home.showJS.desc=Търси и показва всеки JS, инжектиран в PDF home.showJS.desc=Търси и показва всеки JS, инжектиран в PDF
showJS.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит showJS.tags=JS
home.autoRedact.title=Автоматично редактиране home.autoRedact.title=Автоматично редактиране
home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст
showJS.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Дезинфектирай PDF sanitizePDF.title=Дезинфектирай PDF
sanitizePDF.header=Дезинфектира PDF файл sanitizePDF.header=Дезинфектира PDF файл
@@ -866,7 +869,6 @@ changeMetadata.keywords=Ключови думи:
changeMetadata.modDate=Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс): changeMetadata.modDate=Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс):
changeMetadata.producer=Продуцент: changeMetadata.producer=Продуцент:
changeMetadata.subject=Тема: changeMetadata.subject=Тема:
changeMetadata.title=Заглавие:
changeMetadata.trapped=В капан: changeMetadata.trapped=В капан:
changeMetadata.selectText.4=Други метаданни: changeMetadata.selectText.4=Други метаданни:
changeMetadata.selectText.5=Добавяне на персонализиране метаданни changeMetadata.selectText.5=Добавяне на персонализиране метаданни

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Selecciona Imatge(s)
genericSubmit=Envia genericSubmit=Envia
processTimeWarning=Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu processTimeWarning=Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu
pageOrderPrompt=Ordre de Pàgines (Llista separada per comes) : pageOrderPrompt=Ordre de Pàgines (Llista separada per comes) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Anar goToPage=Anar
true=Verdader true=Verdader
false=Fals false=Fals
@@ -19,6 +20,7 @@ save=Desa
close=Tanca close=Tanca
filesSelected=fitxers seleccionats filesSelected=fitxers seleccionats
noFavourites=No s'ha afegit cap favorit noFavourites=No s'ha afegit cap favorit
downloadComplete=Download Complete
bored=Avorrit esperant? bored=Avorrit esperant?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Descarregueu PDF downloadPdf=Descarregueu PDF
@@ -42,7 +44,7 @@ red=Vermell
green=Verd green=Verd
blue=Blau blue=Blau
custom=Personalitzat... custom=Personalitzat...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Opcions del compte
account.adminSettings=Opcions d'Admin - Veure i afegir usuaris account.adminSettings=Opcions d'Admin - Veure i afegir usuaris
account.userControlSettings=Opcions de Control d'Usuari account.userControlSettings=Opcions de Control d'Usuari
account.changeUsername=Canvia nom usuari account.changeUsername=Canvia nom usuari
account.changeUsername=Canvia nom usuari account.newUsername=Nom d'usuari nou
account.password=Confirma contrasenya account.password=Confirma contrasenya
account.oldPassword=Password Antic account.oldPassword=Password Antic
account.newPassword=Password Nou account.newPassword=Password Nou
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=Keywords:
changeMetadata.modDate=Data Modificació (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Data Modificació (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Productor: changeMetadata.producer=Productor:
changeMetadata.subject=Assumpte: changeMetadata.subject=Assumpte:
changeMetadata.title=Títol:
changeMetadata.trapped=Atrapat: changeMetadata.trapped=Atrapat:
changeMetadata.selectText.4=Altres Metadades: changeMetadata.selectText.4=Altres Metadades:
changeMetadata.selectText.5=Afegir entrada personalizada changeMetadata.selectText.5=Afegir entrada personalizada

View File

@@ -11,6 +11,7 @@ imgPrompt=Wählen Sie ein Bild
genericSubmit=Einreichen genericSubmit=Einreichen
processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern
pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein): pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein):
pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein):
goToPage=Los goToPage=Los
true=Wahr true=Wahr
false=Falsch false=Falsch
@@ -19,6 +20,7 @@ save=Speichern
close=Schließen close=Schließen
filesSelected=Dateien ausgewählt filesSelected=Dateien ausgewählt
noFavourites=Keine Favoriten hinzugefügt noFavourites=Keine Favoriten hinzugefügt
downloadComplete=Download Complete
bored=Langeweile beim Warten? bored=Langeweile beim Warten?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=PDF herunterladen downloadPdf=PDF herunterladen
@@ -42,10 +44,10 @@ red=Rot
green=Grün green=Grün
blue=Blau blue=Blau
custom=benutzerdefiniert... custom=benutzerdefiniert...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=In Arbeit, funktioniert möglicherweise nicht oder ist fehlerhaft. Bitte melden Sie alle Probleme!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Ja
no=No no=Nein
changedCredsMessage=Anmeldedaten geändert! changedCredsMessage=Anmeldedaten geändert!
notAuthenticatedMessage=Benutzer nicht authentifiziert. notAuthenticatedMessage=Benutzer nicht authentifiziert.
userNotFoundMessage=Benutzer nicht gefunden. userNotFoundMessage=Benutzer nicht gefunden.
@@ -56,24 +58,24 @@ usernameExistsMessage=Neuer Benutzername existiert bereits.
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Pipeline-Menü (Alpha)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Benutzerdefinierter Upload
pipeline.configureButton=Configure pipeline.configureButton=Konfigurieren
pipeline.defaultOption=Custom pipeline.defaultOption=Benutzerdefiniert
pipeline.submitButton=Submit pipeline.submitButton=Speichern
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=Pipeline-Konfiguration
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=Pipeline-Name
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Save Operation Settings
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=Geben Sie hier den Namen der Pipeline ein
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=Vorgang auswählen
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=Vorgang hinzufügen
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Pipeline:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=Downloaden
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=Validieren
@@ -120,11 +122,11 @@ account.accountSettings=Kontoeinstellungen
account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen
account.userControlSettings=Benutzerkontrolle account.userControlSettings=Benutzerkontrolle
account.changeUsername=Benutzername ändern account.changeUsername=Benutzername ändern
account.changeUsername=Benutzername ändern account.newUsername=Neuer Benutzername
account.password=Bestätigungspasswort account.password=Bestätigungspasswort
account.oldPassword=Altes Passwort account.oldPassword=Altes Passwort
account.newPassword=Neues Passwort account.newPassword=Neues Passwort
account.changePassword=Password ändern account.changePassword=Passwort ändern
account.confirmNewPassword=Neues Passwort bestätigen account.confirmNewPassword=Neues Passwort bestätigen
account.signOut=Abmelden account.signOut=Abmelden
account.yourApiKey=Dein API Schlüssel account.yourApiKey=Dein API Schlüssel
@@ -146,7 +148,7 @@ adminUserSettings.role=Rolle
adminUserSettings.actions=Aktion adminUserSettings.actions=Aktion
adminUserSettings.apiUser=Eingeschränkter API-Benutzer adminUserSettings.apiUser=Eingeschränkter API-Benutzer
adminUserSettings.webOnlyUser=Nur Web-Benutzer adminUserSettings.webOnlyUser=Nur Web-Benutzer
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Demo-Benutzer (Keine benutzerdefinierten Einstellungen)
adminUserSettings.forceChange=Benutzer dazu zwingen, Benutzernamen/Passwort bei der Anmeldung zu ändern adminUserSettings.forceChange=Benutzer dazu zwingen, Benutzernamen/Passwort bei der Anmeldung zu ändern
adminUserSettings.submit=Benutzer speichern adminUserSettings.submit=Benutzer speichern
@@ -283,8 +285,8 @@ home.removeBlanks.title=Leere Seiten entfernen
home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument
removeBlanks.tags=cleanup,streamline,non-content,organize removeBlanks.tags=cleanup,streamline,non-content,organize
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=Anmerkungen entfernen
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=Entfernt alle Kommentare/Anmerkungen aus einem PDF
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=comments,highlight,notes,markup,remove
home.compare.title=Vergleichen home.compare.title=Vergleichen
@@ -304,7 +306,7 @@ home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern
scalePages.tags=resize,modify,dimension,adapt scalePages.tags=resize,modify,dimension,adapt
home.pipeline.title=Pipeline (Fortgeschritten) home.pipeline.title=Pipeline (Fortgeschritten)
home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch einen Pipeline Skript home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch ein Pipeline Skript
pipeline.tags=automate,sequence,scripted,batch-process pipeline.tags=automate,sequence,scripted,batch-process
home.add-page-numbers.title=Seitenzahlen hinzufügen home.add-page-numbers.title=Seitenzahlen hinzufügen
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Automatisch zensieren/schwärzen home.autoRedact.title=Automatisch zensieren/schwärzen
home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text
showJS.tags=zensieren,schwärzen autoRedact.tags=zensieren,schwärzen
home.tableExtraxt.title=Tabelle extrahieren home.tableExtraxt.title=Tabelle extrahieren
home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren
@@ -386,8 +388,8 @@ home.split-by-sections.title=PDF in Abschnitte teilen
home.split-by-sections.desc=Teilen Sie jede Seite einer PDF-Datei in kleinere horizontale und vertikale Abschnitte auf home.split-by-sections.desc=Teilen Sie jede Seite einer PDF-Datei in kleinere horizontale und vertikale Abschnitte auf
split-by-sections.tags=abschnitte,teilen,bearbeiten split-by-sections.tags=abschnitte,teilen,bearbeiten
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Stempel zu PDF hinzufügen
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Fügen Sie an festgelegten Stellen Text oder Bildstempel hinzu
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
@@ -466,37 +468,38 @@ HTMLToPDF.header=HTML zu PDF
HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc.
HTMLToPDF.submit=Konvertieren HTMLToPDF.submit=Konvertieren
HTMLToPDF.credit=Verwendet WeasyPrint HTMLToPDF.credit=Verwendet WeasyPrint
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=Breite der Seite in Zentimetern. (Leer auf Standard)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern. (Leer auf Standard)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern. (Leer auf Standard)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern. (Leer auf Standard)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern. (Leer auf Standard)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern. (Leer auf Standard)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=Den Hintergrund der Website rendern.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern.
HTMLToPDF.none=None HTMLToPDF.none=Keine
HTMLToPDF.print=Print HTMLToPDF.print=Drucken
HTMLToPDF.screen=Screen HTMLToPDF.screen=Bildschirm
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=PDF Stempel
AddStampRequest.title=Stamp PDF AddStampRequest.title=PDF Stempel
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=Stempeltyp
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=Stempeltext
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=Stampelbild
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Alphabet
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=Schriftart/Bildgröße
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Rotation
AddStampRequest.opacity=Opacity AddStampRequest.opacity=Deckkraft
AddStampRequest.position=Position AddStampRequest.position=Position
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=X-Koordinate überschreiben
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Y-Koordinate überschreiben
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=Benutzerdefinierter Rand
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Benutzerdefinierte Textfarbe
AddStampRequest.submit=Submit AddStampRequest.submit=Abschicken
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF Bereinigen sanitizePDF.title=PDF Bereinigen
@@ -548,7 +551,7 @@ crop.submit=Abschicken
#autoSplitPDF #autoSplitPDF
autoSplitPDF.title=PDF automatisch teilen autoSplitPDF.title=PDF automatisch teilen
autoSplitPDF.header=PDF automatisch teilen autoSplitPDF.header=PDF automatisch teilen
autoSplitPDF.description=Drucken Sie, fügen Sie ein, scannen Sie, laden Sie hoch, und lassen Sie uns Ihre Dokumente automatisch trennen. Kein manuelles Sortieren erforderlich. autoSplitPDF.description=Drucken Sie, fügen Sie ein, scannen Sie, laden Sie hoch und lassen Sie uns Ihre Dokumente automatisch trennen. Kein manuelles Sortieren erforderlich.
autoSplitPDF.selectText.1=Drucken Sie einige Trennblätter aus (schwarz/weiß ist ausreichend). autoSplitPDF.selectText.1=Drucken Sie einige Trennblätter aus (schwarz/weiß ist ausreichend).
autoSplitPDF.selectText.2=Scannen Sie alle Dokumente auf einmal, indem Sie das Trennblatt zwischen die Dokumente einlegen. autoSplitPDF.selectText.2=Scannen Sie alle Dokumente auf einmal, indem Sie das Trennblatt zwischen die Dokumente einlegen.
autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling PDF den Rest. autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling PDF den Rest.
@@ -568,7 +571,7 @@ pipeline.title=Pipeline
pageLayout.title=Mehrseitiges Layout pageLayout.title=Mehrseitiges Layout
pageLayout.header=Mehrseitiges Layout pageLayout.header=Mehrseitiges Layout
pageLayout.pagesPerSheet=Seiten pro Blatt: pageLayout.pagesPerSheet=Seiten pro Blatt:
pageLayout.addBorder=Add Borders pageLayout.addBorder=Ränder hinzufügen
pageLayout.submit=Abschicken pageLayout.submit=Abschicken
@@ -584,11 +587,11 @@ scalePages.submit=Abschicken
certSign.title=Zertifikatsignierung certSign.title=Zertifikatsignierung
certSign.header=Signieren Sie ein PDF mit Ihrem Zertifikat (in Arbeit) certSign.header=Signieren Sie ein PDF mit Ihrem Zertifikat (in Arbeit)
certSign.selectPDF=Wählen Sie eine PDF-Datei zum Signieren aus: certSign.selectPDF=Wählen Sie eine PDF-Datei zum Signieren aus:
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=Hinweis: Wenn Ihr Zertifikatstyp unten nicht aufgeführt ist, konvertieren Sie ihn bitte mit dem Befehlszeilentool keytool in eine Java Keystore-Datei (.jks). Wählen Sie dann unten die Option „.jks-Datei“ aus.
certSign.selectKey=Wählen Sie Ihre private Schlüsseldatei aus (PKCS#8-Format, könnte .pem oder .der sein): certSign.selectKey=Wählen Sie Ihre private Schlüsseldatei aus (PKCS#8-Format, könnte .pem oder .der sein):
certSign.selectCert=Wählen Sie Ihre Zertifikatsdatei aus (X.509-Format, könnte .pem oder .der sein): certSign.selectCert=Wählen Sie Ihre Zertifikatsdatei aus (X.509-Format, könnte .pem oder .der sein):
certSign.selectP12=Wählen Sie Ihre PKCS#12-Keystore-Datei (.p12 oder .pfx) aus (optional, falls angegeben, sollte sie Ihren privaten Schlüssel und Ihr Zertifikat enthalten): certSign.selectP12=Wählen Sie Ihre PKCS#12-Keystore-Datei (.p12 oder .pfx) aus (optional, falls angegeben, sollte sie Ihren privaten Schlüssel und Ihr Zertifikat enthalten):
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.selectJKS=Wählen Sie Ihre Java Keystore-Datei (.jks oder .keystore):
certSign.certType=Zertifikattyp certSign.certType=Zertifikattyp
certSign.password=Geben Sie Ihr Keystore- oder Private-Key-Passwort ein (falls vorhanden): certSign.password=Geben Sie Ihr Keystore- oder Private-Key-Passwort ein (falls vorhanden):
certSign.showSig=Signatur anzeigen certSign.showSig=Signatur anzeigen
@@ -700,7 +703,7 @@ compress.selectText.1=Manueller Modus Von 1 bis 4
compress.selectText.2=Optimierungsstufe: compress.selectText.2=Optimierungsstufe:
compress.selectText.3=4 (Schrecklich für Textbilder) compress.selectText.3=4 (Schrecklich für Textbilder)
compress.selectText.4=Automatischer Modus Passt die Qualität automatisch an, um das PDF auf die exakte Größe zu bringen compress.selectText.4=Automatischer Modus Passt die Qualität automatisch an, um das PDF auf die exakte Größe zu bringen
compress.selectText.5=Erwartete PDF-Größe (z. B. 25 MB, 10,8 MB, 25 KB) compress.selectText.5=Erwartete PDF-Größe (z.B. 25 MB, 10,8 MB, 25 KB)
compress.submit=Komprimieren compress.submit=Komprimieren
@@ -731,8 +734,8 @@ multiTool.title=PDF-Multitool
multiTool.header=PDF-Multitool multiTool.header=PDF-Multitool
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=PDF anzeigen
viewPdf.header=View PDF viewPdf.header=PDF anzeigen
#pageRemover #pageRemover
pageRemover.title=Seiten entfernen pageRemover.title=Seiten entfernen
@@ -767,10 +770,10 @@ split.submit=Aufteilen
imageToPDF.title=Bild zu PDF imageToPDF.title=Bild zu PDF
imageToPDF.header=Bild zu PDF imageToPDF.header=Bild zu PDF
imageToPDF.submit=Umwandeln imageToPDF.submit=Umwandeln
imageToPDF.selectLabel=Image Fit Options imageToPDF.selectLabel=Bild anpassen
imageToPDF.fillPage=Fill Page imageToPDF.fillPage=Seite füllen
imageToPDF.fitDocumentToImage=Fit Page to Image imageToPDF.fitDocumentToImage=Seite an Bild anpassen
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios imageToPDF.maintainAspectRatio=Seitenverhältnisse beibehalten
imageToPDF.selectText.2=PDF automatisch drehen imageToPDF.selectText.2=PDF automatisch drehen
imageToPDF.selectText.3=Mehrere Dateien verarbeiten (nur aktiv, wenn Sie mit mehreren Bildern arbeiten) imageToPDF.selectText.3=Mehrere Dateien verarbeiten (nur aktiv, wenn Sie mit mehreren Bildern arbeiten)
imageToPDF.selectText.4=In ein einziges PDF zusammenführen imageToPDF.selectText.4=In ein einziges PDF zusammenführen
@@ -860,13 +863,12 @@ changeMetadata.selectText.1=Bitte bearbeiten Sie die Variablen, die Sie ändern
changeMetadata.selectText.2=Alle Metadaten löschen changeMetadata.selectText.2=Alle Metadaten löschen
changeMetadata.selectText.3=Benutzerdefinierte Metadaten anzeigen: changeMetadata.selectText.3=Benutzerdefinierte Metadaten anzeigen:
changeMetadata.author=Autor: changeMetadata.author=Autor:
changeMetadata.creationDate=Erstellungsdatum (jjjj/MM/tt HH:mm:ss): changeMetadata.creationDate=Erstellungsdatum (JJJJ/MM/TT HH:mm:ss):
changeMetadata.creator=Ersteller: changeMetadata.creator=Ersteller:
changeMetadata.keywords=Schlüsselwörter: changeMetadata.keywords=Schlüsselwörter:
changeMetadata.modDate=Änderungsdatum (JJJJ/MM/TT HH:mm:ss): changeMetadata.modDate=Änderungsdatum (JJJJ/MM/TT HH:mm:ss):
changeMetadata.producer=Produzent: changeMetadata.producer=Produzent:
changeMetadata.subject=Betreff: changeMetadata.subject=Betreff:
changeMetadata.title=Titel:
changeMetadata.trapped=Gefangen: changeMetadata.trapped=Gefangen:
changeMetadata.selectText.4=Andere Metadaten: changeMetadata.selectText.4=Andere Metadaten:
changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen
@@ -930,7 +932,7 @@ split-by-size-or-count.type.size=Nach Größe
split-by-size-or-count.type.pageCount=Nach Anzahl Seiten split-by-size-or-count.type.pageCount=Nach Anzahl Seiten
split-by-size-or-count.type.docCount=Nach Anzahl Dokumenten split-by-size-or-count.type.docCount=Nach Anzahl Dokumenten
split-by-size-or-count.value.label=Wert eingeben split-by-size-or-count.value.label=Wert eingeben
split-by-size-or-count.value.placeholder=Größe eingeben (z. B.: 2MB oder 3KB) oder Anzahl (z. B.: 5) split-by-size-or-count.value.placeholder=Größe eingeben (z.B.: 2MB oder 3KB) oder Anzahl (z.B.: 5)
split-by-size-or-count.submit=Erstellen split-by-size-or-count.submit=Erstellen
@@ -943,7 +945,7 @@ overlay-pdfs.mode.sequential=Sequentielles Overlay
overlay-pdfs.mode.interleaved=Verschachteltes Overlay overlay-pdfs.mode.interleaved=Verschachteltes Overlay
overlay-pdfs.mode.fixedRepeat=Feste-Wiederholung Overlay overlay-pdfs.mode.fixedRepeat=Feste-Wiederholung Overlay
overlay-pdfs.counts.label=Overlay Anzahl (für Feste-Wiederholung) overlay-pdfs.counts.label=Overlay Anzahl (für Feste-Wiederholung)
overlay-pdfs.counts.placeholder=Komma-separierte Anzahl eingeben (z. B.: 2,3,1) overlay-pdfs.counts.placeholder=Komma-separierte Anzahl eingeben (z.B.: 2,3,1)
overlay-pdfs.position.label=Overlay Position auswählen overlay-pdfs.position.label=Overlay Position auswählen
overlay-pdfs.position.foreground=Vordergrund overlay-pdfs.position.foreground=Vordergrund
overlay-pdfs.position.background=Hintergrund overlay-pdfs.position.background=Hintergrund
@@ -961,10 +963,11 @@ split-by-sections.submit=PDF teilen
#licenses #licenses
licenses.nav=Licenses licenses.nav=Lizenzen
licenses.title=3rd Party Licenses licenses.title=Lizenzen von Drittanbietern
licenses.header=3rd Party Licenses licenses.header=Lizenzen von Drittanbietern
licenses.module=Module licenses.module=Modul
licenses.version=Version licenses.version=Version
licenses.license=License licenses.license=Lizenz

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u0
genericSubmit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE genericSubmit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE
processTimeWarning=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C1\u03BA\u03AD\u03C3\u03B5\u03B9 \u03AD\u03C9\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC \u03B1\u03BD\u03AC\u03BB\u03BF\u03B3\u03B1 \u03BC\u03B5 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 processTimeWarning=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C1\u03BA\u03AD\u03C3\u03B5\u03B9 \u03AD\u03C9\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC \u03B1\u03BD\u03AC\u03BB\u03BF\u03B3\u03B1 \u03BC\u03B5 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5
pageOrderPrompt=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03B7 \u03A3\u03B5\u03B9\u03C1\u03AC \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 (\u03A0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C3\u03C4\u03B5 \u03BC\u03AF\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B5 \u03B1\u03C0\u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03B9\u03B4\u03CE\u03BD, \u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1 \u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2 \u03CC\u03C0\u03C9\u03C2 2n+1) : pageOrderPrompt=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03B7 \u03A3\u03B5\u03B9\u03C1\u03AC \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 (\u03A0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C3\u03C4\u03B5 \u03BC\u03AF\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B5 \u03B1\u03C0\u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03B9\u03B4\u03CE\u03BD, \u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1 \u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2 \u03CC\u03C0\u03C9\u03C2 2n+1) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Go goToPage=Go
true=\u0391\u03BB\u03B7\u03B8\u03AD\u03C2 true=\u0391\u03BB\u03B7\u03B8\u03AD\u03C2
false=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF false=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF
@@ -19,6 +20,7 @@ save=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
close=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF close=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF
filesSelected=\u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B1\u03BD filesSelected=\u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B1\u03BD
noFavourites=\u039A\u03B1\u03BD\u03AD\u03BD\u03B1 \u03B1\u03B3\u03B1\u03C0\u03AE\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF noFavourites=\u039A\u03B1\u03BD\u03AD\u03BD\u03B1 \u03B1\u03B3\u03B1\u03C0\u03AE\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF
downloadComplete=Download Complete
bored=\u0392\u03B1\u03C1\u03B9\u03AD\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BC\u03AD\u03BD\u03B5\u03C4\u03B5; bored=\u0392\u03B1\u03C1\u03B9\u03AD\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BC\u03AD\u03BD\u03B5\u03C4\u03B5;
alphabet=\u0391\u03BB\u03C6\u03AC\u03B2\u03B7\u03C4\u03BF alphabet=\u0391\u03BB\u03C6\u03AC\u03B2\u03B7\u03C4\u03BF
downloadPdf=\u039A\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF downloadPdf=\u039A\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF
@@ -42,7 +44,7 @@ red=\u039A\u03CC\u03BA\u03BA\u03B9\u03BD\u03BF
green=\u03A0\u03C1\u03AC\u03C3\u03B9\u03BD\u03BF green=\u03A0\u03C1\u03AC\u03C3\u03B9\u03BD\u03BF
blue=\u039C\u03C0\u03BB\u03AD blue=\u039C\u03C0\u03BB\u03AD
custom=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE... custom=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \
account.adminSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE - \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD account.adminSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE - \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD
account.userControlSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03A7\u03B5\u03B9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03A7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD account.userControlSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03A7\u03B5\u03B9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03A7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD
account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7
account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 account.newUsername=\u039d\u03ad\u03bf \u038c\u03bd\u03bf\u03bc\u03b1 \u03a7\u03c1\u03ae\u03c3\u03c4\u03b7
account.password=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 account.password=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2
account.oldPassword=\u03A0\u03B1\u03BB\u03B9\u03CC\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 account.oldPassword=\u03A0\u03B1\u03BB\u03B9\u03CC\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2
account.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 account.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=single page
home.showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript home.showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript
home.showJS.desc=\u0391\u03BD\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1 Javascript \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03BD\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF home.showJS.desc=\u0391\u03BD\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1 Javascript \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03BD\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF
showJS.tags=Redact,Hide,black out,black,marker,hidden showJS.tags=JS
home.autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 home.autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5
home.autoRedact.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 (\u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1) \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF\u03C5 \u03C3\u03B5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 home.autoRedact.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 (\u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1) \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF\u03C5 \u03C3\u03B5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2
showJS.tags=Redact,Hide,black out,black,marker,hidden autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF sanitizePDF.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF
sanitizePDF.header=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 sanitizePDF.header=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5
@@ -866,7 +869,6 @@ changeMetadata.keywords=\u039B\u03AD\u03BE\u03B5\u03B9\u03C2-\u03BA\u03BB\u03B5\
changeMetadata.modDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=\u03A0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03CC\u03C2: changeMetadata.producer=\u03A0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03CC\u03C2:
changeMetadata.subject=\u0398\u03AD\u03BC\u03B1: changeMetadata.subject=\u0398\u03AD\u03BC\u03B1:
changeMetadata.title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=\u0386\u03BB\u03BB\u03B1 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1: changeMetadata.selectText.4=\u0386\u03BB\u03BB\u03B1 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1:
changeMetadata.selectText.5=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD changeMetadata.selectText.5=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr = left to right, rtl = right to left) # the direction that the language is written (ltr = left to right, rtl = right to left)
@@ -20,6 +20,7 @@ save=Save
close=Close close=Close
filesSelected=files selected filesSelected=files selected
noFavourites=No favourites added noFavourites=No favourites added
downloadComplete=Download Complete
bored=Bored Waiting? bored=Bored Waiting?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=Download PDF downloadPdf=Download PDF
@@ -43,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,8 +121,8 @@ account.title=Account Settings
account.accountSettings=Account Settings account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=New Username
account.changeUsername=Change Username account.changeUsername=Change Username
account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -367,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=Redact,Hide,black out,black,marker,hidden autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -499,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -867,7 +869,6 @@ changeMetadata.keywords=Keywords:
changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producer: changeMetadata.producer=Producer:
changeMetadata.subject=Subject: changeMetadata.subject=Subject:
changeMetadata.title=Title:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Other Metadata: changeMetadata.selectText.4=Other Metadata:
changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.selectText.5=Add Custom Metadata Entry

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Select Image(s)
genericSubmit=Submit genericSubmit=Submit
processTimeWarning=Warning: This process can take up to a minute depending on file-size processTimeWarning=Warning: This process can take up to a minute depending on file-size
pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) : pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Go goToPage=Go
true=True true=True
false=False false=False
@@ -19,6 +20,7 @@ save=Save
close=Close close=Close
filesSelected=files selected filesSelected=files selected
noFavourites=No favorites added noFavourites=No favorites added
downloadComplete=Download Complete
bored=Bored Waiting? bored=Bored Waiting?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=Download PDF downloadPdf=Download PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=Keywords:
changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producer: changeMetadata.producer=Producer:
changeMetadata.subject=Subject: changeMetadata.subject=Subject:
changeMetadata.title=Title:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Other Metadata: changeMetadata.selectText.4=Other Metadata:
changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.selectText.5=Add Custom Metadata Entry

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Seleccionar Imagen(es)
genericSubmit=Enviar genericSubmit=Enviar
processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo
pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma): pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma):
pageSelectionPrompt=Selección de página personalizada (Intruduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1) :
goToPage=Ir a goToPage=Ir a
true=Verdadero true=Verdadero
false=Falso false=Falso
@@ -19,6 +20,7 @@ save=Guardar
close=Cerrar close=Cerrar
filesSelected=archivos seleccionados filesSelected=archivos seleccionados
noFavourites=No se agregaron favoritos noFavourites=No se agregaron favoritos
downloadComplete=Download Complete
bored=¿Cansado de esperar? bored=¿Cansado de esperar?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=Descargar PDF downloadPdf=Descargar PDF
@@ -56,7 +58,7 @@ usernameExistsMessage=El nuevo nombre de usuario está en uso.
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Menu Pipeline (Alfa) pipeline.header=Menú de canalización (Alfa)
pipeline.uploadButton=Cargar personalización pipeline.uploadButton=Cargar personalización
pipeline.configureButton=Configurar pipeline.configureButton=Configurar
pipeline.defaultOption=Personalizar pipeline.defaultOption=Personalizar
@@ -65,13 +67,13 @@ pipeline.submitButton=Enviar
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Configuración Pipeline pipelineOptions.header=Configuración de la canalización
pipelineOptions.pipelineNameLabel=Nombre del Pipeline pipelineOptions.pipelineNameLabel=Nombre de la canalización
pipelineOptions.saveSettings=Guardar configuración de la oiperación pipelineOptions.saveSettings=Guardar configuración de la canalización
pipelineOptions.pipelineNamePrompt=Introduzca aquí el nombre del pipeline pipelineOptions.pipelineNamePrompt=Introduzca aquí el nombre de la canalización
pipelineOptions.selectOperation=Seleccione la operación pipelineOptions.selectOperation=Seleccione la operación
pipelineOptions.addOperationButton=Añadir operación pipelineOptions.addOperationButton=Añadir operación
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Canalización:
pipelineOptions.saveButton=Descargar pipelineOptions.saveButton=Descargar
pipelineOptions.validateButton=Validar pipelineOptions.validateButton=Validar
@@ -120,7 +122,7 @@ account.accountSettings=Configuración de la cuenta
account.adminSettings=Configuración de Administrador - Ver y Añadir Usuarios account.adminSettings=Configuración de Administrador - Ver y Añadir Usuarios
account.userControlSettings=Configuración de control de usuario account.userControlSettings=Configuración de control de usuario
account.changeUsername=Cambiar nombre de usuario account.changeUsername=Cambiar nombre de usuario
account.changeUsername=Cambiar nombre de usuario account.newUsername=nuevo nombre de usuario
account.password=Confirmar contraseña account.password=Confirmar contraseña
account.oldPassword=Contraseña anterior account.oldPassword=Contraseña anterior
account.newPassword=Nueva Contraseña account.newPassword=Nueva Contraseña
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redactar home.autoRedact.title=Auto Redactar
home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF a CSV home.tableExtraxt.title=PDF a CSV
home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV home.tableExtraxt.desc=Extraer Tablas de un PDF convirtiéndolas a CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Personalizar margen
AddStampRequest.customColor=Personalizar color de texto AddStampRequest.customColor=Personalizar color de texto
AddStampRequest.submit=Enviar AddStampRequest.submit=Enviar
#sanitizePDF #sanitizePDF
sanitizePDF.title=Desinfectar archivo PDF sanitizePDF.title=Desinfectar archivo PDF
sanitizePDF.header=Desinfectar un archivo PDF sanitizePDF.header=Desinfectar un archivo PDF
@@ -561,7 +564,7 @@ autoSplitPDF.submit=Entregar
#pipeline #pipeline
pipeline.title=Pipeline pipeline.title=Canalización
#pageLayout #pageLayout
@@ -866,7 +869,6 @@ changeMetadata.keywords=Palabras clave:
changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss): changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Productor: changeMetadata.producer=Productor:
changeMetadata.subject=Asunto: changeMetadata.subject=Asunto:
changeMetadata.title=Título:
changeMetadata.trapped=Capturado: changeMetadata.trapped=Capturado:
changeMetadata.selectText.4=Otros Metadatos: changeMetadata.selectText.4=Otros Metadatos:
changeMetadata.selectText.5=Agregar entrada de metadatos personalizados changeMetadata.selectText.5=Agregar entrada de metadatos personalizados

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Hautatu Irudia(k)
genericSubmit=Bidali genericSubmit=Bidali
processTimeWarning=Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera processTimeWarning=Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera
pageOrderPrompt=Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda) pageOrderPrompt=Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda)
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Joan goToPage=Joan
true=Egiazkoa true=Egiazkoa
false=Faltsua false=Faltsua
@@ -19,6 +20,7 @@ save=Gorde
close=Itxi close=Itxi
filesSelected=Hautatutako fitxategiak filesSelected=Hautatutako fitxategiak
noFavourites=Ez dira gogokoak gehitu noFavourites=Ez dira gogokoak gehitu
downloadComplete=Download Complete
bored=Itxaroten aspertuta? bored=Itxaroten aspertuta?
alphabet=Alfabetoa alphabet=Alfabetoa
downloadPdf=PDFa deskargatu downloadPdf=PDFa deskargatu
@@ -42,7 +44,7 @@ red=Gorria
green=Berdea green=Berdea
blue=Urdina blue=Urdina
custom=Pertsonalizatu... custom=Pertsonalizatu...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Kontuaren ezarpenak
account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak
account.userControlSettings=Erabiltzaile ezarpen kontrolak account.userControlSettings=Erabiltzaile ezarpen kontrolak
account.changeUsername=Aldatu erabiltzaile izena account.changeUsername=Aldatu erabiltzaile izena
account.changeUsername=Aldatu erabiltzaile izena account.newUsername=Erabiltzaile izen berria
account.password=Konfirmatu pasahitza account.password=Konfirmatu pasahitza
account.oldPassword=Pasahitz zaharra account.oldPassword=Pasahitz zaharra
account.newPassword=Pasahitz berria account.newPassword=Pasahitz berria
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Idatzi home.autoRedact.title=Auto Idatzi
home.autoRedact.desc=Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua home.autoRedact.desc=Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF-a desinfektatu sanitizePDF.title=PDF-a desinfektatu
sanitizePDF.header=PDF fitxategi bat desinfektatu sanitizePDF.header=PDF fitxategi bat desinfektatu
@@ -866,7 +869,6 @@ changeMetadata.keywords=Gako-hitzak:
changeMetadata.modDate=Aldatze-data (aaaa/MM/dd HH:mm:ss): changeMetadata.modDate=Aldatze-data (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Ekoizlea: changeMetadata.producer=Ekoizlea:
changeMetadata.subject=Gaia: changeMetadata.subject=Gaia:
changeMetadata.title=Izenburua:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Beste metadatu batzuk: changeMetadata.selectText.4=Beste metadatu batzuk:
changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Choisir une image
genericSubmit=Envoyer genericSubmit=Envoyer
processTimeWarning=Attention, ce processus peut prendre jusqu\u2019à une minute en fonction de la taille du fichier. processTimeWarning=Attention, ce processus peut prendre jusqu\u2019à une minute en fonction de la taille du fichier.
pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0: pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0:
pageSelectionPrompt=Sélection des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0:
goToPage=Aller goToPage=Aller
true=Vrai true=Vrai
false=Faux false=Faux
@@ -19,6 +20,7 @@ save=Enregistrer
close=Fermer close=Fermer
filesSelected=fichiers sélectionnés filesSelected=fichiers sélectionnés
noFavourites=Aucun favori ajouté noFavourites=Aucun favori ajouté
downloadComplete=Téléchargement terminé
bored=Ennuyé d\u2019attendre\u00a0? bored=Ennuyé d\u2019attendre\u00a0?
alphabet=Alphabet alphabet=Alphabet
downloadPdf=Télécharger le PDF downloadPdf=Télécharger le PDF
@@ -42,10 +44,10 @@ red=Rouge
green=Vert green=Vert
blue=Bleu blue=Bleu
custom=Personnalisé\u2026 custom=Personnalisé\u2026
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=En cours de développement, merci de nous remonter les problèmes que vous pourriez constater!
poweredBy=Powered by poweredBy=Propulsé par
yes=Yes yes=Oui
no=No no=Non
changedCredsMessage=Les identifiants ont été mis à jour\u00a0! changedCredsMessage=Les identifiants ont été mis à jour\u00a0!
notAuthenticatedMessage=Utilisateur non authentifié. notAuthenticatedMessage=Utilisateur non authentifié.
userNotFoundMessage=Utilisateur non trouvé. userNotFoundMessage=Utilisateur non trouvé.
@@ -56,24 +58,24 @@ usernameExistsMessage=Le nouveau nom d\u2019utilisateur existe déjà.
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Alpha) pipeline.header=Menu Pipeline (Alpha)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Télécharger une personnalisation
pipeline.configureButton=Configure pipeline.configureButton=Configurer
pipeline.defaultOption=Custom pipeline.defaultOption=Personnaliser
pipeline.submitButton=Submit pipeline.submitButton=Soumettre
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=Configuration du pipeline
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=Nom du pipeline
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Sauvegarder la configuration
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=Entrez ici le nom du pipeline
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=Sélectionner une opération
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=Ajouter une opération
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Pipeline:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=Télécharger
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=Valider
@@ -120,7 +122,7 @@ account.accountSettings=Paramètres du compte
account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs
account.userControlSettings=Contrôle des paramètres des utilisateurs account.userControlSettings=Contrôle des paramètres des utilisateurs
account.changeUsername=Modifier le nom d\u2019utilisateur account.changeUsername=Modifier le nom d\u2019utilisateur
account.changeUsername=Modifier le nom d\u2019utilisateur account.newUsername=Nouveau nom d\u2019utilisateur
account.password=Mot de passe de confirmation account.password=Mot de passe de confirmation
account.oldPassword=Ancien mot de passe account.oldPassword=Ancien mot de passe
account.newPassword=Nouveau mot de passe account.newPassword=Nouveau mot de passe
@@ -146,7 +148,7 @@ adminUserSettings.role=Rôle
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
adminUserSettings.apiUser=Utilisateur API limité adminUserSettings.apiUser=Utilisateur API limité
adminUserSettings.webOnlyUser=Utilisateur Web uniquement adminUserSettings.webOnlyUser=Utilisateur Web uniquement
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Demo User (Paramètres par défaut)
adminUserSettings.forceChange=Forcer l\u2019utilisateur à changer son nom d\u2019utilisateur/mot de passe lors de la connexion adminUserSettings.forceChange=Forcer l\u2019utilisateur à changer son nom d\u2019utilisateur/mot de passe lors de la connexion
adminUserSettings.submit=Ajouter adminUserSettings.submit=Ajouter
@@ -158,7 +160,7 @@ home.searchBar=Rechercher des fonctionnalités...
home.viewPdf.title=Visionner le PDF home.viewPdf.title=Visionner le PDF
home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images.
viewPdf.tags=visualiser,lire,annoter,texte,image viewPdf.tags=visualiser,lire,annoter,texte,image
home.multiTool.title=Outil multifonction PDF home.multiTool.title=Outil multifonction PDF
@@ -167,7 +169,7 @@ multiTool.tags=outil multifonction,opération multifonction,interface utilisateu
home.merge.title=Fusionner home.merge.title=Fusionner
home.merge.desc=Fusionnez facilement plusieurs PDF en un seul. home.merge.desc=Fusionnez facilement plusieurs PDF en un seul.
merge.tags=fusionner,opérations sur les pages,backeend,server side,merge merge.tags=fusionner,opérations sur les pages,backend,server side,merge
home.split.title=Diviser home.split.title=Diviser
home.split.desc=Divisez un PDF en plusieurs documents. home.split.desc=Divisez un PDF en plusieurs documents.
@@ -283,9 +285,9 @@ home.removeBlanks.title=Supprimer les pages vierges
home.removeBlanks.desc=Détectez et supprimez les pages vierges d\u2019un PDF. home.removeBlanks.desc=Détectez et supprimez les pages vierges d\u2019un PDF.
removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=Supprimer les annotations
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=Supprimer tous les commentaires/annotations d\u2019un PDF.
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=commentaires,supprimer,annotations,highlight,notes,markup,remove
home.compare.title=Comparer home.compare.title=Comparer
home.compare.desc=Comparez et visualisez les différences entre deux PDF. home.compare.desc=Comparez et visualisez les différences entre deux PDF.
@@ -362,14 +364,14 @@ PdfToSinglePage.tags=fusionner,merge,une seule page,single page
home.showJS.title=Afficher le JavaScript home.showJS.title=Afficher le JavaScript
home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
showJS.tags=caviarder,redact,auto showJS.tags=JS
home.autoRedact.title=Caviarder automatiquement home.autoRedact.title=Caviarder automatiquement
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF. home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF.
showJS.tags=caviarder,redact,auto autoRedact.tags=caviarder,redact,auto
home.tableExtraxt.title=PDF en CSV home.tableExtraxt.title=PDF en CSV
home.tableExtraxt.desc=Extrait les tableaux d\u2019un PDF et les transforme en CSV home.tableExtraxt.desc=Extrait les tableaux d\u2019un PDF et les transforme en CSV.
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,Table Extraction,extract,convert
@@ -379,16 +381,16 @@ autoSizeSplitPDF.tags=pdf,split,document,organization
home.overlay-pdfs.title=Incrustation de PDF home.overlay-pdfs.title=Incrustation de PDF
home.overlay-pdfs.desc=Incrustation d\u2019un PDF sur un autre PDF home.overlay-pdfs.desc=Incrustation d\u2019un PDF sur un autre PDF.
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Overlay,incrustation
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=Séparer un PDF en sections
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=Diviser chaque page d\u2019un PDF en sections horizontales/verticales plus petites.
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Sections,Diviser,Section Split, Divide, Customize
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Ajouter un tampon sur un PDF
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Ajouter un texte ou l\u2019image d\u2019un tampon à un emplacement défini.
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Tampon,Ajouter,Stamp,Add image,center image,Watermark,PDF,Embed,Customize
########################### ###########################
@@ -466,37 +468,38 @@ HTMLToPDF.header=HTML en PDF
HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis). HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis).
HTMLToPDF.submit=Convertir HTMLToPDF.submit=Convertir
HTMLToPDF.credit=Utilise WeasyPrint. HTMLToPDF.credit=Utilise WeasyPrint.
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Niveau de zoom pour l\u2019affichage du site web.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=Largeur de la page en centimètres. (Vide par défaut)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=Hauteur de la page en centimètres. (Vide par défaut)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=Marge supérieure de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=Marge inférieure de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=Marge gauche de la page en millimètres. (Vide par défaut)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=Marge droite de la page en millimètres. (Vide par défaut)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=Restituer l\u2019image de fond des sites web.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=Activer l\u2019entête par défaut (Nom et numéro de page)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=Modifier le type de média CSS de la page.
HTMLToPDF.none=None HTMLToPDF.none=Aucun
HTMLToPDF.print=Print HTMLToPDF.print=Imprimer
HTMLToPDF.screen=Screen HTMLToPDF.screen=Écran
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=Tampon PDF
AddStampRequest.title=Stamp PDF AddStampRequest.title=Tampon PDF
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=Type de tampon
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=Tampon texte
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=Tampon image
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Alphabet
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=Taille de fonte/image
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Rotation
AddStampRequest.opacity=Opacity AddStampRequest.opacity=Opacité
AddStampRequest.position=Position AddStampRequest.position=Position
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=Définir coordonnées X
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Définir coordonnées Y
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=Marge personnalisée
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Couleur de texte personnalisée
AddStampRequest.submit=Submit AddStampRequest.submit=Soumettre
#sanitizePDF #sanitizePDF
sanitizePDF.title=Assainir sanitizePDF.title=Assainir
@@ -584,11 +587,11 @@ scalePages.submit=Ajuster
certSign.title=Signer avec un certificat certSign.title=Signer avec un certificat
certSign.header=Signer avec un certificat (Travail en cours) certSign.header=Signer avec un certificat (Travail en cours)
certSign.selectPDF=PDF à signer certSign.selectPDF=PDF à signer
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=Note: Si votre type de certificat n\u2019est pas listé ci\u002Ddessous, merci de le convertir en fichier Java Keystore (.jks) en utilisant l\u2019outil en ligne de commande keytool. Puis choisissez l\u2019option Fichier .jks ci\u002Ddessous.
certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der) certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der)
certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der) certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der)
certSign.selectP12=Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, s\u2019il n\u2019est fourni, il doit contenir votre clé privée et votre certificat) certSign.selectP12=Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, s\u2019il n\u2019est fourni, il doit contenir votre clé privée et votre certificat)
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.selectJKS=Sélectionner votre fichier Java Keystore File (.jks or .keystore):
certSign.certType=Type de certificat certSign.certType=Type de certificat
certSign.password=Mot de passe keystore ou clé privée le cas échéant certSign.password=Mot de passe keystore ou clé privée le cas échéant
certSign.showSig=Afficher la signature certSign.showSig=Afficher la signature
@@ -609,9 +612,9 @@ removeBlanks.submit=Supprimer les pages vierges
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=Supprimer les annotations
removeAnnotations.header=Remove Annotations removeAnnotations.header=Supprimer les annotations
removeAnnotations.submit=Remove removeAnnotations.submit=Supprimer
#compare #compare
@@ -693,14 +696,14 @@ fileToPDF.submit=Convertir
#compress #compress
compress.title=Compresser compress.title=Compresser un PDF
compress.header=Compresser compress.header=Compresser un PDF (lorsque c\u2019est possible!)
compress.credit=Ce service utilise Ghostscript pour la compression et l\u2019optimisation des PDF. compress.credit=Ce service utilise Ghostscript pour la compression et l\u2019optimisation des PDF.
compress.selectText.1=Mode manuel \u2013 de 1 à 4 compress.selectText.1=Mode manuel \u2013 de 1 à 4
compress.selectText.2=Niveau d\u2019optimisation compress.selectText.2=Niveau d\u2019optimisation
compress.selectText.3=4 (terrible pour les images textuelles) compress.selectText.3=4 (terrible pour les images textuelles)
compress.selectText.4=Mode automatique \u2013 ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte compress.selectText.4=Mode automatique \u2013 ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte
compress.selectText.5=Taille PDF attendue (par exemple, 25\u202fMo, 10,8\u202fMo, 25\u202fKo) compress.selectText.5=Taille PDF attendue (par exemple, 25\u202fMB, 10,8\u202fMB, 25\u202fKB)
compress.submit=Compresser compress.submit=Compresser
@@ -731,8 +734,8 @@ multiTool.title=Outil multifonction PDF
multiTool.header=Outil multifonction PDF multiTool.header=Outil multifonction PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=Visualiser un PDF
viewPdf.header=View PDF viewPdf.header=Visualiser un PDF
#pageRemover #pageRemover
pageRemover.title=Supprimer des pages pageRemover.title=Supprimer des pages
@@ -787,7 +790,7 @@ pdfToImage.multi=Plusieurs images
pdfToImage.colorType=Type d\u2019impression pdfToImage.colorType=Type d\u2019impression
pdfToImage.color=Couleur pdfToImage.color=Couleur
pdfToImage.grey=Niveaux de gris pdfToImage.grey=Niveaux de gris
pdfToImage.blackwhite=Noir et blanc (peut engendre une perde de données\u00a0!) pdfToImage.blackwhite=Noir et blanc (peut engendrer une perte de données\u00a0!)
pdfToImage.submit=Convertir pdfToImage.submit=Convertir
@@ -866,8 +869,7 @@ changeMetadata.keywords=Mots clés
changeMetadata.modDate=Date de modification (yyyy/MM/dd HH:mm:ss) changeMetadata.modDate=Date de modification (yyyy/MM/dd HH:mm:ss)
changeMetadata.producer=Producteur changeMetadata.producer=Producteur
changeMetadata.subject=Sujet changeMetadata.subject=Sujet
changeMetadata.title=Titre changeMetadata.trapped=Recouvrement (technique dimpression)
changeMetadata.trapped=Défoncé (technique dimpression)
changeMetadata.selectText.4=Autres métadonnées changeMetadata.selectText.4=Autres métadonnées
changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée
changeMetadata.submit=Modifier changeMetadata.submit=Modifier
@@ -935,19 +937,19 @@ split-by-size-or-count.submit=Séparer
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=Incrustation de PDF
overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base overlay-pdfs.baseFile.label=Sélectionner le fichier PDF de base
overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer overlay-pdfs.overlayFiles.label=Sélectionner les fichiers PDF à superposer
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=Sélectionner le mode d\u2019incrustation
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=Superposition séquentielle
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=Superposition entrelacée
overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe overlay-pdfs.mode.fixedRepeat=Superposition à répétition fixe
overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe) overlay-pdfs.counts.label=Nombre de superpositions (pour le mode de répétition fixe)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=Compteurs (séparés par des virgules, exemple : 2,3,1)
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=Définir la position de l\u2019incrustation
overlay-pdfs.position.foreground=Premier plan overlay-pdfs.position.foreground=Premier plan
overlay-pdfs.position.background=Arrière-plan overlay-pdfs.position.background=Arrière-plan
overlay-pdfs.submit=Submit overlay-pdfs.submit=Soumettre
#split-by-sections #split-by-sections
@@ -961,11 +963,11 @@ split-by-sections.submit=Diviser le PDF
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licences
licenses.title=3rd Party Licenses licenses.title=Licences tierces
licenses.header=3rd Party Licenses licenses.header=Licences tierces
licenses.module=Module licenses.module=Module
licenses.version=Version licenses.version=Version
licenses.license=License licenses.license=Licence

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=छवियों का चयन करें
genericSubmit=प्रस्तुत करें genericSubmit=प्रस्तुत करें
processTimeWarning=चेतावनी: यह प्रक्रिया फ़ाइल के आकार पर निर्भर करती है और यह से एक मिनट तक लग सकती है processTimeWarning=चेतावनी: यह प्रक्रिया फ़ाइल के आकार पर निर्भर करती है और यह से एक मिनट तक लग सकती है
pageOrderPrompt=कस्टम पेज क्रम (पेज नंबरों या 2n+1 जैसे कार्यों की एक कॉमा से अलग-अलग सूची दर्ज करें): pageOrderPrompt=कस्टम पेज क्रम (पेज नंबरों या 2n+1 जैसे कार्यों की एक कॉमा से अलग-अलग सूची दर्ज करें):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=जाएँ goToPage=जाएँ
true=सही true=सही
false=गलत false=गलत
@@ -19,6 +20,7 @@ save=सहेजें
close=बंद करें close=बंद करें
filesSelected=फ़ाइलें चयनित हैं filesSelected=फ़ाइलें चयनित हैं
noFavourites=कोई पसंदीदा जोड़ा नहीं गया है noFavourites=कोई पसंदीदा जोड़ा नहीं गया है
downloadComplete=Download Complete
bored=बोर हो रहे हैं? bored=बोर हो रहे हैं?
alphabet=वर्णमाला alphabet=वर्णमाला
downloadPdf=पीडीएफ़ डाउनलोड करें downloadPdf=पीडीएफ़ डाउनलोड करें
@@ -42,7 +44,7 @@ red=लाल
green=हरा green=हरा
blue=नीला blue=नीला
custom=कस्टम... custom=कस्टम...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=खाता सेटिंग्स
account.adminSettings=व्यवस्थापक सेटिंग्स - उपयोगकर्ताओं को देखें और जोड़ें account.adminSettings=व्यवस्थापक सेटिंग्स - उपयोगकर्ताओं को देखें और जोड़ें
account.userControlSettings=उपयोगकर्ता नियंत्रण सेटिंग्स account.userControlSettings=उपयोगकर्ता नियंत्रण सेटिंग्स
account.changeUsername=उपयोगकर्ता नाम परिवर्तन करें account.changeUsername=उपयोगकर्ता नाम परिवर्तन करें
account.changeUsername=उपयोगकर्ता नाम परिवर्तन करें account.newUsername=नया उपयोगकर्ता नाम
account.password=पासवर्ड पुष्टि account.password=पासवर्ड पुष्टि
account.oldPassword=पुराना पासवर्ड account.oldPassword=पुराना पासवर्ड
account.newPassword=नया पासवर्ड account.newPassword=नया पासवर्ड
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=एकल पृष्ठ
home.showJS.title=जावास्क्रिप्ट दिखाएं home.showJS.title=जावास्क्रिप्ट दिखाएं
home.showJS.desc=पीडीएफ़ में डाला गया कोई भी जावास्क्रिप्ट खोजता है और प्रदर्शित करता है home.showJS.desc=पीडीएफ़ में डाला गया कोई भी जावास्क्रिप्ट खोजता है और प्रदर्शित करता है
showJS.tags=गोपनीयकरण, छिपाना, काला करना, काला, मार्कर, छिपा हुआ showJS.tags=जे एस
home.autoRedact.title=स्वतः गोपनीयकरण home.autoRedact.title=स्वतः गोपनीयकरण
home.autoRedact.desc=प्रविष्ट पाठ के आधार पर पीडीएफ़ में पाठ को स्वतः गोपनीयकरित(काला करें) home.autoRedact.desc=प्रविष्ट पाठ के आधार पर पीडीएफ़ में पाठ को स्वतः गोपनीयकरित(काला करें)
showJS.tags=गोपनीयकरण, छिपाना, काला करना, काला, मार्कर, छिपा हुआ autoRedact.tags=गोपनीयकरण, छिपाना, काला करना, काला, मार्कर, छिपा हुआ
home.tableExtraxt.title=PDF से CSV में home.tableExtraxt.title=PDF से CSV में
home.tableExtraxt.desc=CSV में बदलते हुए पीडीएफ़ से तालिकाएँ निकालता है home.tableExtraxt.desc=CSV में बदलते हुए पीडीएफ़ से तालिकाएँ निकालता है
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=पीडीएफ़ को सफाई करें sanitizePDF.title=पीडीएफ़ को सफाई करें
sanitizePDF.header=एक पीडीएफ़ फ़ाइल को सफाई करें sanitizePDF.header=एक पीडीएफ़ फ़ाइल को सफाई करें
@@ -866,7 +869,6 @@ changeMetadata.keywords=कीवर्ड्स:
changeMetadata.modDate=संशोधन तिथि (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=संशोधन तिथि (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=निर्माता: changeMetadata.producer=निर्माता:
changeMetadata.subject=विषय: changeMetadata.subject=विषय:
changeMetadata.title=शीर्षक:
changeMetadata.trapped=फंसा हुआ: changeMetadata.trapped=फंसा हुआ:
changeMetadata.selectText.4=अन्य मेटाडेटा: changeMetadata.selectText.4=अन्य मेटाडेटा:
changeMetadata.selectText.5=कस्टम मेटाडेटा एंट्री जोड़ें changeMetadata.selectText.5=कस्टम मेटाडेटा एंट्री जोड़ें

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Válasszon képeket
genericSubmit=Beküldés genericSubmit=Beküldés
processTimeWarning=Figyelmeztetés: Ez a folyamat akár egy percig is eltarthat a fájlmérettől függően processTimeWarning=Figyelmeztetés: Ez a folyamat akár egy percig is eltarthat a fájlmérettől függően
pageOrderPrompt=Egyedi oldalsorrend (Adjon meg vesszővel elválasztott oldalszámokat vagy függvényeket, például 2n+1): pageOrderPrompt=Egyedi oldalsorrend (Adjon meg vesszővel elválasztott oldalszámokat vagy függvényeket, például 2n+1):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Ugrás goToPage=Ugrás
true=Igaz true=Igaz
false=Hamis false=Hamis
@@ -19,6 +20,7 @@ save=Mentés
close=Bezárás close=Bezárás
filesSelected=kiválasztott fájlok filesSelected=kiválasztott fájlok
noFavourites=Nincs hozzáadva kedvenc noFavourites=Nincs hozzáadva kedvenc
downloadComplete=Download Complete
bored=Unatkozol? bored=Unatkozol?
alphabet=Ábécé alphabet=Ábécé
downloadPdf=PDF letöltése downloadPdf=PDF letöltése
@@ -42,7 +44,7 @@ red=Piros
green=Zöld green=Zöld
blue=Kék blue=Kék
custom=Egyedi... custom=Egyedi...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -119,8 +121,8 @@ account.title=Fiókbeállítások
account.accountSettings=Fiókbeállítások account.accountSettings=Fiókbeállítások
account.adminSettings=Admin Beállítások - Felhasználók megtekintése és hozzáadása account.adminSettings=Admin Beállítások - Felhasználók megtekintése és hozzáadása
account.userControlSettings=Felhasználói vezérlési beállítások account.userControlSettings=Felhasználói vezérlési beállítások
account.changeUsername=Új felhasználónév account.changeUsername=Felhasználónév módosítása
account.changeUsername=Új felhasználónév account.newUsername=Új felhasználónév
account.password=Megerősítő jelszó account.password=Megerősítő jelszó
account.oldPassword=Régi jelszó account.oldPassword=Régi jelszó
account.newPassword=Új jelszó account.newPassword=Új jelszó
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=egyetlen lap
home.showJS.title=JavaScript megjelenítése home.showJS.title=JavaScript megjelenítése
home.showJS.desc=Keres és megjelenít bármilyen JS-t, amit beinjektáltak a PDF-be home.showJS.desc=Keres és megjelenít bármilyen JS-t, amit beinjektáltak a PDF-be
showJS.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett showJS.tags=JS
home.autoRedact.title=Automatikus Elrejtés home.autoRedact.title=Automatikus Elrejtés
home.autoRedact.desc=Automatikusan kitakar (elrejt) szöveget egy PDF-ben az input szöveg alapján home.autoRedact.desc=Automatikusan kitakar (elrejt) szöveget egy PDF-ben az input szöveg alapján
showJS.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett autoRedact.tags=Elrejt,Elrejtés,kitakarás,fekete,fekete,marker,elrejtett
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Táblázatok kinyerése a PDF-ből CSV formátumra konvertálva home.tableExtraxt.desc=Táblázatok kinyerése a PDF-ből CSV formátumra konvertálva
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF tisztítása sanitizePDF.title=PDF tisztítása
sanitizePDF.header=PDF fájl megtisztítása sanitizePDF.header=PDF fájl megtisztítása
@@ -866,7 +869,6 @@ changeMetadata.keywords=Kulcsszavak:
changeMetadata.modDate=Módosítás dátuma (éééé/hh/nn ÓÓ:PP:MM): changeMetadata.modDate=Módosítás dátuma (éééé/hh/nn ÓÓ:PP:MM):
changeMetadata.producer=Készítő: changeMetadata.producer=Készítő:
changeMetadata.subject=Tárgy: changeMetadata.subject=Tárgy:
changeMetadata.title=Cím:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Egyéb metaadatok: changeMetadata.selectText.4=Egyéb metaadatok:
changeMetadata.selectText.5=Egyedi metaadatbejegyzés hozzáadása changeMetadata.selectText.5=Egyedi metaadatbejegyzés hozzáadása

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl=right to left) # the direction that the language is written (ltr=left to right, rtl=right to left)
@@ -11,6 +11,7 @@ imgPrompt=Pilih Gambar
genericSubmit=Kirim genericSubmit=Kirim
processTimeWarning=Peringatan: Proses ini dapat memakan waktu hingga satu menit, tergantung pada ukuran berkas processTimeWarning=Peringatan: Proses ini dapat memakan waktu hingga satu menit, tergantung pada ukuran berkas
pageOrderPrompt=Urutan Halaman Khusus (Masukkan daftar nomor halaman yang dipisahkan dengan koma atau Fungsi seperti 2n + 1) : pageOrderPrompt=Urutan Halaman Khusus (Masukkan daftar nomor halaman yang dipisahkan dengan koma atau Fungsi seperti 2n + 1) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Ke goToPage=Ke
true=Benar true=Benar
false=Salah false=Salah
@@ -19,6 +20,7 @@ save=Simpan
close=Tutup close=Tutup
filesSelected=berkas dipilih filesSelected=berkas dipilih
noFavourites=Tidak ada favorit yang ditambahkan noFavourites=Tidak ada favorit yang ditambahkan
downloadComplete=Download Complete
bored=Bosan Menunggu? bored=Bosan Menunggu?
alphabet=Abjad alphabet=Abjad
downloadPdf=Unduh PDF downloadPdf=Unduh PDF
@@ -42,7 +44,7 @@ red=Merah
green=Hijau green=Hijau
blue=Biru blue=Biru
custom=Kustom... custom=Kustom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Pengaturan Akun
account.adminSettings=Pengaturan Admin - Melihat dan Menambahkan Pengguna account.adminSettings=Pengaturan Admin - Melihat dan Menambahkan Pengguna
account.userControlSettings=Pengaturan Kontrol Pengguna account.userControlSettings=Pengaturan Kontrol Pengguna
account.changeUsername=Ubah Nama Pengguna account.changeUsername=Ubah Nama Pengguna
account.changeUsername=Ubah Nama Pengguna account.newUsername=Nama pengguna baru
account.password=Konfirmasi Kata sandi account.password=Konfirmasi Kata sandi
account.oldPassword=Kata sandi lama account.oldPassword=Kata sandi lama
account.newPassword=Kata Sandi Baru account.newPassword=Kata Sandi Baru
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=halaman tunggal
home.showJS.title=Tampilkan Javascript home.showJS.title=Tampilkan Javascript
home.showJS.desc=Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF home.showJS.desc=Mencari dan menampilkan JS apa pun yang disuntikkan ke dalam PDF
showJS.tags=Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi showJS.tags=JS
home.autoRedact.title=Redaksional Otomatis home.autoRedact.title=Redaksional Otomatis
home.autoRedact.desc=Menyunting Otomatis (Menghitamkan) teks dalam PDF berdasarkan teks masukan home.autoRedact.desc=Menyunting Otomatis (Menghitamkan) teks dalam PDF berdasarkan teks masukan
showJS.tags=Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi autoRedact.tags=Hapus, Sembunyikan, padamkan, hitam, hitam, penanda, tersembunyi
home.tableExtraxt.title=PDF ke CSV home.tableExtraxt.title=PDF ke CSV
home.tableExtraxt.desc=Mengekstrak Tabel dari PDF yang mengonversinya menjadi CSV home.tableExtraxt.desc=Mengekstrak Tabel dari PDF yang mengonversinya menjadi CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Bersihkan PDF sanitizePDF.title=Bersihkan PDF
sanitizePDF.header=Membersihkan berkas PDF sanitizePDF.header=Membersihkan berkas PDF
@@ -866,7 +869,6 @@ changeMetadata.keywords=Kata kunci:
changeMetadata.modDate=Tangal Diupdate (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Tangal Diupdate (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Produser: changeMetadata.producer=Produser:
changeMetadata.subject=Subjek: changeMetadata.subject=Subjek:
changeMetadata.title=Judul:
changeMetadata.trapped=Terperangkap: changeMetadata.trapped=Terperangkap:
changeMetadata.selectText.4=Metadata Lain-lain: changeMetadata.selectText.4=Metadata Lain-lain:
changeMetadata.selectText.5=Tambahkan Metadata Khusus changeMetadata.selectText.5=Tambahkan Metadata Khusus

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Scegli immagine/i
genericSubmit=Invia genericSubmit=Invia
processTimeWarning=Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file processTimeWarning=Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file
pageOrderPrompt=Ordine delle pagine (inserisci una lista di numeri separati da virgola): pageOrderPrompt=Ordine delle pagine (inserisci una lista di numeri separati da virgola):
pageSelectionPrompt=Selezione pagina personalizzata (inserisci un elenco separato da virgole di numeri di pagina 1,5,6 o funzioni come 2n+1) :
goToPage=Vai goToPage=Vai
true=Vero true=Vero
false=Falso false=Falso
@@ -19,6 +20,7 @@ save=Salva
close=Chiudi close=Chiudi
filesSelected=file selezionati filesSelected=file selezionati
noFavourites=Nessun preferito noFavourites=Nessun preferito
downloadComplete=Download Complete
bored=Stanco di aspettare? bored=Stanco di aspettare?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=Scarica PDF downloadPdf=Scarica PDF
@@ -119,8 +121,8 @@ account.title=Impostazioni Account
account.accountSettings=Impostazioni Account account.accountSettings=Impostazioni Account
account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti
account.userControlSettings=Impostazioni Utente account.userControlSettings=Impostazioni Utente
account.changeUsername=Cambia Username account.changeUsername=Cambia nome utente
account.changeUsername=Cambia Username account.newUsername=Nuovo nome utente
account.password=Conferma Password account.password=Conferma Password
account.oldPassword=Vecchia Password account.oldPassword=Vecchia Password
account.newPassword=Nuova Password account.newPassword=Nuova Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Redazione automatica home.autoRedact.title=Redazione automatica
home.autoRedact.desc=Redige automaticamente (oscura) il testo in un PDF in base al testo immesso home.autoRedact.desc=Redige automaticamente (oscura) il testo in un PDF in base al testo immesso
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=Da PDF a CSV home.tableExtraxt.title=Da PDF a CSV
home.tableExtraxt.desc=Estrae tabelle da un PDF convertendolo in CSV home.tableExtraxt.desc=Estrae tabelle da un PDF convertendolo in CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Margine personalizzato
AddStampRequest.customColor=Colore testo personalizzato AddStampRequest.customColor=Colore testo personalizzato
AddStampRequest.submit=Invia AddStampRequest.submit=Invia
#sanitizePDF #sanitizePDF
sanitizePDF.title=Pulire PDF sanitizePDF.title=Pulire PDF
sanitizePDF.header=Pulisci un file PDF sanitizePDF.header=Pulisci un file PDF
@@ -866,7 +869,6 @@ changeMetadata.keywords=Parole chiave:
changeMetadata.modDate=Data di modifica (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Data di modifica (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Produttore: changeMetadata.producer=Produttore:
changeMetadata.subject=Oggetto: changeMetadata.subject=Oggetto:
changeMetadata.title=Titolo:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Altre proprietà: changeMetadata.selectText.4=Altre proprietà:
changeMetadata.selectText.5=Aggiungi proprietà personalizzata: changeMetadata.selectText.5=Aggiungi proprietà personalizzata:

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=画像を選択
genericSubmit=送信 genericSubmit=送信
processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります
pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力): pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=移動 goToPage=移動
true=True true=True
false=False false=False
@@ -19,6 +20,7 @@ save=保存
close=閉じる close=閉じる
filesSelected=選択されたファイル filesSelected=選択されたファイル
noFavourites=お気に入りはありません noFavourites=お気に入りはありません
downloadComplete=Download Complete
bored=待ち時間が退屈 bored=待ち時間が退屈
alphabet=\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8 alphabet=\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8
downloadPdf=PDFをダウンロード downloadPdf=PDFをダウンロード
@@ -42,7 +44,7 @@ red=赤
green= green=
blue= blue=
custom=カスタム... custom=カスタム...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=アカウント設定
account.adminSettings=管理者設定 - ユーザーの表示と追加 account.adminSettings=管理者設定 - ユーザーの表示と追加
account.userControlSettings=ユーザー制御設定 account.userControlSettings=ユーザー制御設定
account.changeUsername=ユーザー名を変更 account.changeUsername=ユーザー名を変更
account.changeUsername=ユーザー名を変更 account.newUsername=新しいユーザーネーム
account.password=確認用パスワード account.password=確認用パスワード
account.oldPassword=旧パスワード account.oldPassword=旧パスワード
account.newPassword=新パスワード account.newPassword=新パスワード
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=自動塗りつぶし home.autoRedact.title=自動塗りつぶし
home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。 home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDFをCSVに変換 home.tableExtraxt.title=PDFをCSVに変換
home.tableExtraxt.desc=PDFから表を抽出しCSVに変換します。 home.tableExtraxt.desc=PDFから表を抽出しCSVに変換します。
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDFをサニタイズ sanitizePDF.title=PDFをサニタイズ
sanitizePDF.header=PDFファイルをサニタイズ sanitizePDF.header=PDFファイルをサニタイズ
@@ -866,7 +869,6 @@ changeMetadata.keywords=キーワード:
changeMetadata.modDate=変更日 (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=変更日 (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=プロデューサー: changeMetadata.producer=プロデューサー:
changeMetadata.subject=主題: changeMetadata.subject=主題:
changeMetadata.title=タイトル:
changeMetadata.trapped=トラッピング: changeMetadata.trapped=トラッピング:
changeMetadata.selectText.4=その他のメタデータ: changeMetadata.selectText.4=その他のメタデータ:
changeMetadata.selectText.5=カスタムメタデータの追加 changeMetadata.selectText.5=カスタムメタデータの追加
@@ -968,3 +970,4 @@ licenses.module=モジュール
licenses.version=バージョン licenses.version=バージョン
licenses.license=ライセンス licenses.license=ライセンス

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=이미지 선택
genericSubmit=확인 genericSubmit=확인
processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다 processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다
pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력): pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=이동 goToPage=이동
true= true=
false=거짓 false=거짓
@@ -19,6 +20,7 @@ save=저장
close=닫기 close=닫기
filesSelected=개 파일 선택됨 filesSelected=개 파일 선택됨
noFavourites=즐겨찾기 없음 noFavourites=즐겨찾기 없음
downloadComplete=Download Complete
bored=기다리는 게 지루하신가요? bored=기다리는 게 지루하신가요?
alphabet=\uC54C\uD30C\uBCB3 alphabet=\uC54C\uD30C\uBCB3
downloadPdf=PDF 다운로드 downloadPdf=PDF 다운로드
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=계정 설정
account.adminSettings=관리자 설정 - 사용자 추가 및 확인 account.adminSettings=관리자 설정 - 사용자 추가 및 확인
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=사용자명 변경 account.changeUsername=사용자명 변경
account.changeUsername=사용자명 변경 account.newUsername=사용자 이름
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=이전 비밀번호 account.oldPassword=이전 비밀번호
account.newPassword=새 비밀번호 account.newPassword=새 비밀번호
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=자동 검열 home.autoRedact.title=자동 검열
home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다. home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다.
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF 정제 sanitizePDF.title=PDF 정제
sanitizePDF.header=PDF 문서 정제 sanitizePDF.header=PDF 문서 정제
@@ -866,7 +869,6 @@ changeMetadata.keywords=키워드:
changeMetadata.modDate=수정일 (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=수정일 (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=생성자: changeMetadata.producer=생성자:
changeMetadata.subject=주제: changeMetadata.subject=주제:
changeMetadata.title=제목:
changeMetadata.trapped=잠긴 상태: changeMetadata.trapped=잠긴 상태:
changeMetadata.selectText.4=기타 메타데이터: changeMetadata.selectText.4=기타 메타데이터:
changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가 changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Selecteer afbeelding(en)
genericSubmit=Indienen genericSubmit=Indienen
processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte
pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) : pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Ga goToPage=Ga
true=Waar true=Waar
false=Onwaar false=Onwaar
@@ -19,6 +20,7 @@ save=Opslaan
close=Sluiten close=Sluiten
filesSelected=Bestanden geselecteerd filesSelected=Bestanden geselecteerd
noFavourites=Geen favorieten toegevoegd noFavourites=Geen favorieten toegevoegd
downloadComplete=Download Complete
bored=Verveeld met wachten? bored=Verveeld met wachten?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Download PDF downloadPdf=Download PDF
@@ -120,7 +122,7 @@ account.accountSettings=Account instellingen
account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen
account.userControlSettings=Gebruikerscontrole instellingen account.userControlSettings=Gebruikerscontrole instellingen
account.changeUsername=Wijzig gebruikersnaam account.changeUsername=Wijzig gebruikersnaam
account.changeUsername=Wijzig gebruikersnaam account.newUsername=Nieuwe gebruikersnaam
account.password=Bevestigingswachtwoord account.password=Bevestigingswachtwoord
account.oldPassword=Oud wachtwoord account.oldPassword=Oud wachtwoord
account.newPassword=Nieuw wachtwoord account.newPassword=Nieuw wachtwoord
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Automatisch censureren home.autoRedact.title=Automatisch censureren
home.autoRedact.desc=Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst home.autoRedact.desc=Automatisch censureren (onherkenbaar maken) van tekst in een PDF op basis van ingevoerde tekst
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF naar CSV home.tableExtraxt.title=PDF naar CSV
home.tableExtraxt.desc=Haalt tabellen uit een PDF en converteert ze naar CSV home.tableExtraxt.desc=Haalt tabellen uit een PDF en converteert ze naar CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Aangepaste marge
AddStampRequest.customColor=Aangepaste tekstkleur AddStampRequest.customColor=Aangepaste tekstkleur
AddStampRequest.submit=Indienen AddStampRequest.submit=Indienen
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF opschonen sanitizePDF.title=PDF opschonen
sanitizePDF.header=Een PDF-bestand opschonen sanitizePDF.header=Een PDF-bestand opschonen
@@ -866,7 +869,6 @@ changeMetadata.keywords=Trefwoorden:
changeMetadata.modDate=Wijzigingsdatum (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Wijzigingsdatum (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producent: changeMetadata.producer=Producent:
changeMetadata.subject=Onderwerp: changeMetadata.subject=Onderwerp:
changeMetadata.title=Titel:
changeMetadata.trapped=Vastgezet: changeMetadata.trapped=Vastgezet:
changeMetadata.selectText.4=Overige metadata: changeMetadata.selectText.4=Overige metadata:
changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Wybierz obraz(y)
genericSubmit=Wyślij genericSubmit=Wyślij
processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku
pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) : pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Idź goToPage=Idź
true=Tak true=Tak
false=Nie false=Nie
@@ -19,6 +20,7 @@ save=Zapisz
close=Zamknij close=Zamknij
filesSelected=wybrane pliki filesSelected=wybrane pliki
noFavourites=Nie dodano ulubionych noFavourites=Nie dodano ulubionych
downloadComplete=Download Complete
bored=Znudzony czekaniem? bored=Znudzony czekaniem?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Pobierz PDF downloadPdf=Pobierz PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=Słowa kluczowe:
changeMetadata.modDate=Data modyfikacji (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Data modyfikacji (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producent: changeMetadata.producer=Producent:
changeMetadata.subject=Temat: changeMetadata.subject=Temat:
changeMetadata.title=Tytuł:
changeMetadata.trapped=Zablokowany: changeMetadata.trapped=Zablokowany:
changeMetadata.selectText.4=Inne metadane: changeMetadata.selectText.4=Inne metadane:
changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Selecione a(s) imagem(ns)
genericSubmit=Enviar genericSubmit=Enviar
processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo
pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página): pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Ir goToPage=Ir
true=Verdadeiro true=Verdadeiro
false=Falso false=Falso
@@ -19,6 +20,7 @@ save=Salvar
close=Fechar close=Fechar
filesSelected=arquivos selecionados filesSelected=arquivos selecionados
noFavourites=Nenhum favorito adicionado noFavourites=Nenhum favorito adicionado
downloadComplete=Download Complete
bored=Entediado esperando? bored=Entediado esperando?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=baixar PDF downloadPdf=baixar PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JavaScript
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JavaScript autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitizar PDF sanitizePDF.title=Sanitizar PDF
sanitizePDF.header=Sanitizar um arquivo PDF sanitizePDF.header=Sanitizar um arquivo PDF
@@ -866,7 +869,6 @@ changeMetadata.keywords=Palavras-chave:
changeMetadata.modDate=Data de Modificação (aaaa/MM/dd HH:mm:ss): changeMetadata.modDate=Data de Modificação (aaaa/MM/dd HH:mm:ss):
changeMetadata.producer=Produtor: changeMetadata.producer=Produtor:
changeMetadata.subject=Assunto: changeMetadata.subject=Assunto:
changeMetadata.title=Título:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Outros Metadados changeMetadata.selectText.4=Outros Metadados
changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizados changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizados

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Selectează imagini
genericSubmit=Trimite genericSubmit=Trimite
processTimeWarning=Avertisment: Acest proces poate dura până la un minut în funcție de dimensiunea fișierului processTimeWarning=Avertisment: Acest proces poate dura până la un minut în funcție de dimensiunea fișierului
pageOrderPrompt=Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină): pageOrderPrompt=Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Mergi la pagină goToPage=Mergi la pagină
true=Adevărat true=Adevărat
false=Fals false=Fals
@@ -19,6 +20,7 @@ save=Salvează
close=Închide close=Închide
filesSelected=fișiere selectate filesSelected=fișiere selectate
noFavourites=Niciun favorit adăugat noFavourites=Niciun favorit adăugat
downloadComplete=Download Complete
bored=Plictisit așteptând? bored=Plictisit așteptând?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Descarcă PDF downloadPdf=Descarcă PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=Cuvinte cheie:
changeMetadata.modDate=Data modificării (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Data modificării (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Producător: changeMetadata.producer=Producător:
changeMetadata.subject=Subiect: changeMetadata.subject=Subiect:
changeMetadata.title=Titlu:
changeMetadata.trapped=Blocat: changeMetadata.trapped=Blocat:
changeMetadata.selectText.4=Alte Metadate: changeMetadata.selectText.4=Alte Metadate:
changeMetadata.selectText.5=Adăugați Intrare Metadate Personalizate changeMetadata.selectText.5=Adăugați Intrare Metadate Personalizate

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Выберите картинку(и)
genericSubmit=Отправить genericSubmit=Отправить
processTimeWarning=Внимание: Этот процесс может занять до минуты в зависимости от размера файла. processTimeWarning=Внимание: Этот процесс может занять до минуты в зависимости от размера файла.
pageOrderPrompt=Порядок страниц (введите список номеров страниц через запятую): pageOrderPrompt=Порядок страниц (введите список номеров страниц через запятую):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Вперед goToPage=Вперед
true=Истина true=Истина
false=Ложь false=Ложь
@@ -19,6 +20,7 @@ save=Сохранить
close=Закрыть close=Закрыть
filesSelected=файлов выбрано filesSelected=файлов выбрано
noFavourites=Нет избранного noFavourites=Нет избранного
downloadComplete=Download Complete
bored=Скучно ждать? bored=Скучно ждать?
alphabet=Алфавит alphabet=Алфавит
downloadPdf=Скачать PDF downloadPdf=Скачать PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Дезинфицировать PDF sanitizePDF.title=Дезинфицировать PDF
sanitizePDF.header=Дезинфицировать PDF файл sanitizePDF.header=Дезинфицировать PDF файл
@@ -866,7 +869,6 @@ changeMetadata.keywords=Ключевые слова:
changeMetadata.modDate=Дата изменения (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Дата изменения (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Изготовитель: changeMetadata.producer=Изготовитель:
changeMetadata.subject=Тема: changeMetadata.subject=Тема:
changeMetadata.title=Заголовок:
changeMetadata.trapped=Trapped: changeMetadata.trapped=Trapped:
changeMetadata.selectText.4=Другие метаданные: changeMetadata.selectText.4=Другие метаданные:
changeMetadata.selectText.5=Добавить пользовательскую запись метаданных changeMetadata.selectText.5=Добавить пользовательскую запись метаданных

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Odaberi sliku (slike)
genericSubmit=Prihvatiti genericSubmit=Prihvatiti
processTimeWarning=Warning:Upozorenje: Ovaj proces može trajati i do minut, u zavisnosti od veličine dokumenta processTimeWarning=Warning:Upozorenje: Ovaj proces može trajati i do minut, u zavisnosti od veličine dokumenta
pageOrderPrompt=Prilagođeni redosled stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) : pageOrderPrompt=Prilagođeni redosled stranica (unesi listu brojeva stranica ili funkcija, kao što su 2n+1, razdvojene zarezima) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Idi goToPage=Idi
true=Tačno true=Tačno
false=Netačno false=Netačno
@@ -19,6 +20,7 @@ save=Sačuvaj
close=Zatvori close=Zatvori
filesSelected=odabrani fajlovi filesSelected=odabrani fajlovi
noFavourites=Nema dodatih favorita noFavourites=Nema dodatih favorita
downloadComplete=Download Complete
bored=Da li ti je dosadno dok čekaš? bored=Da li ti je dosadno dok čekaš?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Skini PDF downloadPdf=Skini PDF
@@ -120,7 +122,7 @@ account.accountSettings=Podešavanja naloga
account.adminSettings=Admin podešavanja - Pregled i dodavanje korisnika account.adminSettings=Admin podešavanja - Pregled i dodavanje korisnika
account.userControlSettings=Podešavanja kontrole korisnika account.userControlSettings=Podešavanja kontrole korisnika
account.changeUsername=Pormeni korisničko ime account.changeUsername=Pormeni korisničko ime
account.changeUsername=Pormeni korisničko ime account.newUsername=Novo korisničko ime
account.password=Potvrda lozinke account.password=Potvrda lozinke
account.oldPassword=Stara lozinka account.oldPassword=Stara lozinka
account.newPassword=Nova lozinka account.newPassword=Nova lozinka
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=jedna-stranica
home.showJS.title=Prikaži JavaScript home.showJS.title=Prikaži JavaScript
home.showJS.desc=Pretražuje i prikazuje bilo koji JavaScript ubačen u PDF home.showJS.desc=Pretražuje i prikazuje bilo koji JavaScript ubačen u PDF
showJS.tags=Cenzura,Sakrij,prekrivanje,crna,marker,skriveno showJS.tags=JS
home.autoRedact.title=Automatsko Cenzurisanje home.autoRedact.title=Automatsko Cenzurisanje
home.autoRedact.desc=Automatsko cenzurisanje teksta u PDF-u na osnovu unetog teksta home.autoRedact.desc=Automatsko cenzurisanje teksta u PDF-u na osnovu unetog teksta
showJS.tags=Cenzura,Sakrij,prekrivanje,crna,marker,skriveno autoRedact.tags=Cenzura,Sakrij,prekrivanje,crna,marker,skriveno
home.tableExtraxt.title=PDF u CSV home.tableExtraxt.title=PDF u CSV
home.tableExtraxt.desc=Izdvaja tabele iz PDF-a pretvarajući ih u CSV home.tableExtraxt.desc=Izdvaja tabele iz PDF-a pretvarajući ih u CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitizacija PDF-a sanitizePDF.title=Sanitizacija PDF-a
sanitizePDF.header=Sanitizacija PDF fajla sanitizePDF.header=Sanitizacija PDF fajla
@@ -866,7 +869,6 @@ changeMetadata.keywords=Ključne reči:
changeMetadata.modDate=Datum izmene (gggg/MM/dd HH:mm:ss): changeMetadata.modDate=Datum izmene (gggg/MM/dd HH:mm:ss):
changeMetadata.producer=Proizvođač: changeMetadata.producer=Proizvođač:
changeMetadata.subject=Tema: changeMetadata.subject=Tema:
changeMetadata.title=Naslov:
changeMetadata.trapped=Zaglavljeno: changeMetadata.trapped=Zaglavljeno:
changeMetadata.selectText.4=Drugi metapodaci: changeMetadata.selectText.4=Drugi metapodaci:
changeMetadata.selectText.5=Dodaj prilagođeni unos metapodataka changeMetadata.selectText.5=Dodaj prilagođeni unos metapodataka

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Välj bild(er)
genericSubmit=Skicka genericSubmit=Skicka
processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek
pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) : pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Gå till goToPage=Gå till
true=True true=True
false=Falskt false=Falskt
@@ -19,6 +20,7 @@ save=Spara
close=Stäng close=Stäng
filesSelected=filer valda filesSelected=filer valda
noFavourites=Inga favoriter har lagts till noFavourites=Inga favoriter har lagts till
downloadComplete=Download Complete
bored=Utråkad att vänta? bored=Utråkad att vänta?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Ladda ner PDF downloadPdf=Ladda ner PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Account Settings
account.adminSettings=Admin Settings - View and Add Users account.adminSettings=Admin Settings - View and Add Users
account.userControlSettings=User Control Settings account.userControlSettings=User Control Settings
account.changeUsername=Change Username account.changeUsername=Change Username
account.changeUsername=Change Username account.newUsername=New Username
account.password=Confirmation Password account.password=Confirmation Password
account.oldPassword=Old password account.oldPassword=Old password
account.newPassword=New Password account.newPassword=New Password
@@ -366,7 +368,7 @@ showJS.tags=JS
home.autoRedact.title=Auto Redact home.autoRedact.title=Auto Redact
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
showJS.tags=JS autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=Sanitize PDF sanitizePDF.title=Sanitize PDF
sanitizePDF.header=Sanitize a PDF file sanitizePDF.header=Sanitize a PDF file
@@ -866,7 +869,6 @@ changeMetadata.keywords=Sökord:
changeMetadata.modDate=Ändringsdatum (åååå/MM/dd HH:mm:ss): changeMetadata.modDate=Ändringsdatum (åååå/MM/dd HH:mm:ss):
changeMetadata.producer=Producent: changeMetadata.producer=Producent:
changeMetadata.subject=Ämne: changeMetadata.subject=Ämne:
changeMetadata.title=Titel:
changeMetadata.trapped=Fångad: changeMetadata.trapped=Fångad:
changeMetadata.selectText.4=Andra metadata: changeMetadata.selectText.4=Andra metadata:
changeMetadata.selectText.5=Lägg till anpassad metadatapost changeMetadata.selectText.5=Lägg till anpassad metadatapost

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=Resim(leri) seçin
genericSubmit=Gönder genericSubmit=Gönder
processTimeWarning=Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir. processTimeWarning=Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir.
pageOrderPrompt=Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) : pageOrderPrompt=Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=Git goToPage=Git
true=Doğru true=Doğru
false=Yanlış false=Yanlış
@@ -19,6 +20,7 @@ save=Kaydet
close=Kapat close=Kapat
filesSelected=dosya seçildi filesSelected=dosya seçildi
noFavourites=Favori eklenmedi noFavourites=Favori eklenmedi
downloadComplete=Download Complete
bored=Sıkıldınız mı? bored=Sıkıldınız mı?
alphabet=Alfabe alphabet=Alfabe
downloadPdf=PDF İndir downloadPdf=PDF İndir
@@ -42,7 +44,7 @@ red=Kırmızı
green=Yeşil green=Yeşil
blue=Mavi blue=Mavi
custom=Özel custom=Özel
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=Hesap Ayarları
account.adminSettings=Yönetici Ayarları - Kullanıcıları Görüntüle ve Ekle account.adminSettings=Yönetici Ayarları - Kullanıcıları Görüntüle ve Ekle
account.userControlSettings=Kullanıcı Kontrol Ayarları account.userControlSettings=Kullanıcı Kontrol Ayarları
account.changeUsername=Kullanıcı Adını Değiştir account.changeUsername=Kullanıcı Adını Değiştir
account.changeUsername=Kullanıcı Adını Değiştir account.newUsername=Yeni kullanıcı adı
account.password=Onay Şifresi account.password=Onay Şifresi
account.oldPassword=Eski Şifre account.oldPassword=Eski Şifre
account.newPassword=Yeni Şifre account.newPassword=Yeni Şifre
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=tek sayfa
home.showJS.title=Javascript'i Göster home.showJS.title=Javascript'i Göster
home.showJS.desc=Bir PDF'e enjekte edilen herhangi bir JS'i araştırır ve gösterir home.showJS.desc=Bir PDF'e enjekte edilen herhangi bir JS'i araştırır ve gösterir
showJS.tags=Karart,Gizle,karartma,siyah,markör,gizli showJS.tags=JS
home.autoRedact.title=Otomatik Karartma home.autoRedact.title=Otomatik Karartma
home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte) home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte)
showJS.tags=Karart,Gizle,karartma,siyah,markör,gizli autoRedact.tags=Karart,Gizle,karartma,siyah,markör,gizli
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=PDF'i Temizle sanitizePDF.title=PDF'i Temizle
sanitizePDF.header=PDF dosyasını temizle sanitizePDF.header=PDF dosyasını temizle
@@ -866,7 +869,6 @@ changeMetadata.keywords=Anahtar Kelimeler:
changeMetadata.modDate=Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss): changeMetadata.modDate=Değişiklik Tarihi (yyyy/MM/dd HH:mm:ss):
changeMetadata.producer=Üretici: changeMetadata.producer=Üretici:
changeMetadata.subject=Konu: changeMetadata.subject=Konu:
changeMetadata.title=Başlık:
changeMetadata.trapped=Tuzak: changeMetadata.trapped=Tuzak:
changeMetadata.selectText.4=Diğer Metaveri: changeMetadata.selectText.4=Diğer Metaveri:
changeMetadata.selectText.5=Özel Metaveri Girişi Ekle changeMetadata.selectText.5=Özel Metaveri Girişi Ekle

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=选择图像
genericSubmit=提交 genericSubmit=提交
processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小 processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小
pageOrderPrompt=页面顺序(输入逗号分隔的页码列表): pageOrderPrompt=页面顺序(输入逗号分隔的页码列表):
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage= goToPage=
true= true=
false= false=
@@ -19,6 +20,7 @@ save=保存
close=关闭 close=关闭
filesSelected=选中的文件 filesSelected=选中的文件
noFavourites=没有添加收藏夹 noFavourites=没有添加收藏夹
downloadComplete=Download Complete
bored=无聊等待吗? bored=无聊等待吗?
alphabet=字母表 alphabet=字母表
downloadPdf=下载PDF downloadPdf=下载PDF
@@ -42,7 +44,7 @@ red=Red
green=Green green=Green
blue=Blue blue=Blue
custom=Custom... custom=Custom...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=帐号设定
account.adminSettings=管理员设置 - 查看和添加用户 account.adminSettings=管理员设置 - 查看和添加用户
account.userControlSettings=用户控制设置 account.userControlSettings=用户控制设置
account.changeUsername=更改用户名 account.changeUsername=更改用户名
account.changeUsername=更改用户名 account.newUsername=用户名
account.password=确认密码 account.password=确认密码
account.oldPassword=旧密码 account.oldPassword=旧密码
account.newPassword=新密码 account.newPassword=新密码
@@ -366,7 +368,7 @@ showJS.tags=JavaScript
home.autoRedact.title=自动删除 home.autoRedact.title=自动删除
home.autoRedact.desc=根据输入文本自动删除覆盖PDF中的文本 home.autoRedact.desc=根据输入文本自动删除覆盖PDF中的文本
showJS.tags=JavaScript autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF to CSV
home.tableExtraxt.desc=从PDF中提取表格并将其转换为CSV home.tableExtraxt.desc=从PDF中提取表格并将其转换为CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=清理PDF sanitizePDF.title=清理PDF
sanitizePDF.header=清理PDF文件 sanitizePDF.header=清理PDF文件
@@ -866,7 +869,6 @@ changeMetadata.keywords=关键词:
changeMetadata.modDate=修改日期yyyy/MM/dd HH:mm:ss changeMetadata.modDate=修改日期yyyy/MM/dd HH:mm:ss
changeMetadata.producer=生产者: changeMetadata.producer=生产者:
changeMetadata.subject=主题: changeMetadata.subject=主题:
changeMetadata.title=标题:
changeMetadata.trapped=被困: changeMetadata.trapped=被困:
changeMetadata.selectText.4=其他元数据: changeMetadata.selectText.4=其他元数据:
changeMetadata.selectText.5=添加自定义元数据条目 changeMetadata.selectText.5=添加自定义元数据条目

View File

@@ -1,4 +1,4 @@
########### ###########
# Generic # # Generic #
########### ###########
# the direction that the language is written (ltr=left to right, rtl = right to left) # the direction that the language is written (ltr=left to right, rtl = right to left)
@@ -11,6 +11,7 @@ imgPrompt=選擇圖片
genericSubmit=送出 genericSubmit=送出
processTimeWarning=警告:此過程可能需要長達一分鐘,具體取決於檔案大小 processTimeWarning=警告:此過程可能需要長達一分鐘,具體取決於檔案大小
pageOrderPrompt=自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1 pageOrderPrompt=自訂頁面順序(輸入以逗號分隔的頁碼或函式,如 2n+1
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
goToPage=前往 goToPage=前往
true= true=
false= false=
@@ -19,6 +20,7 @@ save=儲存
close=關閉 close=關閉
filesSelected=已選擇的檔案 filesSelected=已選擇的檔案
noFavourites=未新增收藏 noFavourites=未新增收藏
downloadComplete=Download Complete
bored=等待時覺得無聊? bored=等待時覺得無聊?
alphabet=字母表 alphabet=字母表
downloadPdf=下載 PDF downloadPdf=下載 PDF
@@ -42,7 +44,7 @@ red=紅色
green=綠色 green=綠色
blue=藍色 blue=藍色
custom=自訂... custom=自訂...
WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
poweredBy=Powered by poweredBy=Powered by
yes=Yes yes=Yes
no=No no=No
@@ -120,7 +122,7 @@ account.accountSettings=帳戶設定
account.adminSettings=管理設定 - 檢視和新增使用者 account.adminSettings=管理設定 - 檢視和新增使用者
account.userControlSettings=使用者控制設定 account.userControlSettings=使用者控制設定
account.changeUsername=修改使用者名稱 account.changeUsername=修改使用者名稱
account.changeUsername=修改使用者名稱 account.newUsername=使用者名稱
account.password=確認密碼 account.password=確認密碼
account.oldPassword=舊密碼 account.oldPassword=舊密碼
account.newPassword=新密碼 account.newPassword=新密碼
@@ -362,11 +364,11 @@ PdfToSinglePage.tags=單一頁面
home.showJS.title=顯示 JavaScript home.showJS.title=顯示 JavaScript
home.showJS.desc=搜尋並顯示嵌入 PDF 中的任何 JSJavaScript home.showJS.desc=搜尋並顯示嵌入 PDF 中的任何 JSJavaScript
showJS.tags=塗黑,隱藏,塗黑,黑色,標記,隱藏 showJS.tags=JS
home.autoRedact.title=自動塗黑 home.autoRedact.title=自動塗黑
home.autoRedact.desc=根據輸入的文字自動塗黑 PDF 中的文字 home.autoRedact.desc=根據輸入的文字自動塗黑 PDF 中的文字
showJS.tags=塗黑,隱藏,塗黑,黑色,標記,隱藏 autoRedact.tags=塗黑,隱藏,塗黑,黑色,標記,隱藏
home.tableExtraxt.title=PDF 轉 CSV home.tableExtraxt.title=PDF 轉 CSV
home.tableExtraxt.desc=從 PDF 中提取表格並將其轉換為 CSV home.tableExtraxt.desc=從 PDF 中提取表格並將其轉換為 CSV
@@ -498,6 +500,7 @@ AddStampRequest.customMargin=Custom Margin
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Custom Text Color
AddStampRequest.submit=Submit AddStampRequest.submit=Submit
#sanitizePDF #sanitizePDF
sanitizePDF.title=清理 PDF sanitizePDF.title=清理 PDF
sanitizePDF.header=清理 PDF 檔案 sanitizePDF.header=清理 PDF 檔案
@@ -866,7 +869,6 @@ changeMetadata.keywords=關鍵字:
changeMetadata.modDate=修改日期yyyy/MM/dd HH:mm:ss changeMetadata.modDate=修改日期yyyy/MM/dd HH:mm:ss
changeMetadata.producer=製作人: changeMetadata.producer=製作人:
changeMetadata.subject=主題: changeMetadata.subject=主題:
changeMetadata.title=標題:
changeMetadata.trapped=陷阱: changeMetadata.trapped=陷阱:
changeMetadata.selectText.4=其他中繼資料: changeMetadata.selectText.4=其他中繼資料:
changeMetadata.selectText.5=新增自訂中繼資料項目 changeMetadata.selectText.5=新增自訂中繼資料項目

View File

@@ -0,0 +1,4 @@
.buttons-container {
margin-top: 20px;
text-align: center;
}

View File

@@ -0,0 +1,28 @@
#box-drag-container {
position: relative;
margin: 20px 0;
}
#pdf-canvas {
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384);
width: 100%;
}
.draggable-buttons-box {
position: absolute;
top: 0;
padding: 10px;
width: 100%;
display: flex;
gap: 5px;
}
.draggable-buttons-box > button {
z-index: 10;
background-color: rgba(13, 110, 253, 0.1);
}
.draggable-canvas {
border: 1px solid red;
position: absolute;
touch-action: none;
user-select: none;
top: 0px;
left: 0;
}

View File

@@ -1,5 +1,7 @@
/* Dark Mode Styles */ /* Dark Mode Styles */
body, select, textarea { body,
select,
textarea {
--body-background-color: 51, 51, 51; --body-background-color: 51, 51, 51;
--base-font-color: 255, 255, 255; --base-font-color: 255, 255, 255;
background-color: rgb(var(--body-background-color)) !important; background-color: rgb(var(--body-background-color)) !important;
@@ -11,10 +13,10 @@ body, select, textarea {
color: rgb(var(--base-font-color)) !important; color: rgb(var(--base-font-color)) !important;
} }
a { a {
color: #add8e6; color: #add8e6;
} }
a:hover { a:hover {
color: #87ceeb; /* Slightly brighter blue on hover for accessibility */ color: #87ceeb; /* Slightly brighter blue on hover for accessibility */
} }
@@ -53,7 +55,8 @@ table thead {
background-color: #333 !important; background-color: #333 !important;
border: 1px solid #444; border: 1px solid #444;
} }
table th, table td { table th,
table td {
border: 1px solid #444 !important; border: 1px solid #444 !important;
color: white; color: white;
} }
@@ -120,16 +123,19 @@ hr {
color: #ffffff; color: #ffffff;
} }
#global-buttons-container input:disabled::-webkit-input-placeholder { /* WebKit browsers */ #global-buttons-container input:disabled::-webkit-input-placeholder {
color: #6E6865; /* WebKit browsers */
color: #6e6865;
} }
#global-buttons-container input:disabled:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ #global-buttons-container input:disabled:-moz-placeholder {
color: #6E6865; /* Mozilla Firefox 4 to 18 */
color: #6e6865;
} }
#global-buttons-container input:disabled::-moz-placeholder { /* Mozilla Firefox 19+ */ #global-buttons-container input:disabled::-moz-placeholder {
color: #6E6865; /* Mozilla Firefox 19+ */
color: #6e6865;
} }
#global-buttons-container input:disabled:-ms-input-placeholder { /* Internet Explorer 10+ */ #global-buttons-container input:disabled:-ms-input-placeholder {
color: #6E6865; /* Internet Explorer 10+ */
color: #6e6865;
} }

View File

@@ -1,6 +1,6 @@
#drag-container { #drag-container {
position: fixed; position: fixed;
display:flex; display: flex;
inset: 0; inset: 0;
pointer-events: none; pointer-events: none;
z-index: 10000; z-index: 10000;
@@ -36,12 +36,12 @@
visibility: hidden !important; visibility: hidden !important;
} }
html[lang-direction=ltr] .drag-manager_draghover img { html[lang-direction="ltr"] .drag-manager_draghover img {
left: calc(50% + 62.5px) !important; left: calc(50% + 62.5px) !important;
} }
html[lang-direction=rtl] .drag-manager_draghover img { html[lang-direction="rtl"] .drag-manager_draghover img {
left: 125px left: 125px;
} }
.drag-manager_dragging-container .hide-on-drag { .drag-manager_dragging-container .hide-on-drag {
@@ -51,9 +51,9 @@ html[lang-direction=rtl] .drag-manager_draghover img {
.drag-manager_endpoint { .drag-manager_endpoint {
width: 80px; width: 80px;
height: 100%; height: 100%;
background-color: #FFFFFF10; background-color: #ffffff10;
transition: width 0.1s; transition: width 0.1s;
animation: end-drop-expand .3s ease; animation: end-drop-expand 0.3s ease;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@@ -0,0 +1,88 @@
h1 {
text-align: center;
margin-top: 10%;
}
p {
text-align: center;
margin-top: 2em;
}
.button:hover {
background-color: #005b7f;
}
.features-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr));
gap: 25px 30px;
}
.feature-card {
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem;
padding: 1.25rem;
display: flex;
flex-direction: column;
align-items: flex-start;
}
.feature-card .card-text {
flex: 1;
}
#support-section {
background-color: #f9f9f9;
padding: 4rem;
margin-top: 1rem;
text-align: center;
}
#support-section h1 {
margin-top: 0;
}
#support-section p {
margin-top: 0;
}
#button-group {
display: flex;
justify-content: center;
flex-wrap: wrap;
}
#github-button,
#discord-button {
display: inline-block;
padding: 1rem 2rem;
margin: 1rem;
background-color: #008cba;
color: #fff;
font-size: 1.2rem;
text-align: center;
text-decoration: none;
border-radius: 3rem;
transition: all 0.3s ease-in-out;
}
#github-button:hover,
#discord-button:hover,
#home-button:hover {
background-color: #005b7f;
}
#home-button {
display: block;
width: 200px;
height: 50px;
margin: 2em auto;
background-color: #008cba;
color: white;
text-align: center;
line-height: 50px;
text-decoration: none;
font-weight: bold;
border-radius: 25px;
transition: all 0.3s ease-in-out;
}

View File

@@ -28,7 +28,7 @@
} }
#helpModal .feature-card { #helpModal .feature-card {
border: 1px solid rgba(0, 0, 0, .125); border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 1.25rem; padding: 1.25rem;
display: flex; display: flex;
@@ -61,11 +61,12 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
#github-button, #discord-button { #github-button,
#discord-button {
display: inline-block; display: inline-block;
padding: 1rem 2rem; padding: 1rem 2rem;
margin: 1rem; margin: 1rem;
background-color: #008CBA; background-color: #008cba;
color: #fff; color: #fff;
font-size: 1.2rem; font-size: 1.2rem;
text-align: center; text-align: center;
@@ -74,7 +75,9 @@
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
} }
#github-button:hover, #discord-button:hover, #home-button:hover { #github-button:hover,
#discord-button:hover,
#home-button:hover {
background-color: #005b7f; background-color: #005b7f;
} }
@@ -83,7 +86,7 @@
width: 200px; width: 200px;
height: 50px; height: 50px;
margin: 2em auto; margin: 2em auto;
background-color: #008CBA; background-color: #008cba;
color: white; color: white;
text-align: center; text-align: center;
line-height: 50px; line-height: 50px;

View File

@@ -0,0 +1,20 @@
#footer {
display: flex;
flex-direction: column; /* Stack children vertically */
justify-content: center;
align-items: center;
width: 100%;
}
.footer-center {
display: flex;
align-items: center; /* Center children horizontally */
flex-grow: 1;
}
.footer-powered-by {
margin-top: auto; /* Pushes the text to the bottom */
color: grey;
text-align: center; /* Centers the text inside the div */
width: 100%; /* Full width to center the text properly */
}

View File

@@ -9,7 +9,9 @@
border: 2px solid black; /* Add border */ border: 2px solid black; /* Add border */
} }
.pdf, .player, .projectile { .pdf,
.player,
.projectile {
position: absolute; position: absolute;
} }
.pdf { .pdf {
@@ -25,7 +27,10 @@
width: 5px; width: 5px;
height: 10px; height: 10px;
} }
#score, #level, #lives, #high-score { #score,
#level,
#lives,
#high-score {
color: black; color: black;
font-family: sans-serif; font-family: sans-serif;
position: absolute; position: absolute;
@@ -37,7 +42,7 @@
} }
#lives { #lives {
top: 10px; top: 10px;
left: calc(7vw); /* Adjusted position */ left: calc(9vw); /* Adjusted position */
} }
#high-score { #high-score {
top: 10px; top: 10px;

View File

@@ -25,10 +25,10 @@
margin-right: auto; margin-right: auto;
}*/ }*/
html[lang-direction=ltr] * { html[lang-direction="ltr"] * {
direction: ltr; direction: ltr;
} }
html[lang-direction=rtl] * { html[lang-direction="rtl"] * {
direction: rtl; direction: rtl;
text-align: right; text-align: right;
} }

View File

@@ -1,5 +1,5 @@
#searchBar { #searchBar {
background-image: url('../images/search.svg'); background-image: url("../images/search.svg");
background-position: 16px 16px; background-position: 16px 16px;
background-repeat: no-repeat; background-repeat: no-repeat;
width: 100%; width: 100%;
@@ -7,17 +7,13 @@
margin-bottom: 12px; margin-bottom: 12px;
padding: 12px 20px 12px 40px; padding: 12px 20px 12px 40px;
border: 1px solid #ddd; border: 1px solid #ddd;
} }
.dark-mode-search { .dark-mode-search {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' hei… 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z'/%3E%3C/svg%3E") !important; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' hei… 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z'/%3E%3C/svg%3E") !important;
color: #f8f9fa !important; color: #f8f9fa !important;
background-color: #212529 !important; background-color: #212529 !important;
border-color: #343a40 !important; border-color: #343a40 !important;
} }
.features-container { .features-container {
display: grid; display: grid;
@@ -26,14 +22,16 @@
} }
.feature-card { .feature-card {
border: 2px solid rgba(0, 0, 0, .25); border: 2px solid rgba(0, 0, 0, 0.25);
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 1.25rem; padding: 1.25rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
background: rgba(13, 110, 253, 0.05); background: rgba(13, 110, 253, 0.05);
transition: transform 0.3s, border 0.3s; transition:
transform 0.3s,
border 0.3s;
transform-origin: center center; transform-origin: center center;
outline: 2px solid transparent; outline: 2px solid transparent;
} }
@@ -52,7 +50,7 @@
} }
.feature-card:hover { .feature-card:hover {
outline: 1px solid rgba(0, 0, 0, .5); outline: 1px solid rgba(0, 0, 0, 0.5);
cursor: pointer; cursor: pointer;
transform: scale(1.1); transform: scale(1.1);
} }
@@ -70,7 +68,7 @@
transform: translateY(-5px); transform: translateY(-5px);
} }
.home-card-icon-colour { .home-card-icon-colour {
filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg); filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg);
} }
.favorite-icon { .favorite-icon {

View File

@@ -1,21 +1,24 @@
#image-highlighter { #image-highlighter {
position: fixed; position: fixed;
display:flex; display: flex;
inset: 0; inset: 0;
z-index: 10000; z-index: 10000;
background-color: rgba(0, 0, 0, 0); background-color: rgba(0, 0, 0, 0);
visibility: hidden; visibility: hidden;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
transition: visbility 0.1s linear, background-color 0.1s linear; transition:
visbility 0.1s linear,
background-color 0.1s linear;
} }
#image-highlighter > * { #image-highlighter > * {
max-width: 80vw; max-width: 80vw;
max-height: 80vh; max-height: 80vh;
animation: image-highlight .1s linear; animation: image-highlight 0.1s linear;
transition: transform .1s linear, opacity .1s linear; transition:
transform 0.1s linear,
opacity 0.1s linear;
} }
#image-highlighter > *.remove { #image-highlighter > *.remove {

View File

@@ -0,0 +1,9 @@
td a {
text-decoration: none;
}
td a:hover,
td a:focus {
text-decoration: underline;
/* Adds underline on hover/focus for clarity */
}

View File

@@ -4,7 +4,6 @@ body {
--base-font-color: 33, 37, 41; --base-font-color: 33, 37, 41;
} }
#global-buttons-container input { #global-buttons-container input {
background-color: #ffffff; background-color: #ffffff;
/*caret-color: #ffffff;*/ /*caret-color: #ffffff;*/

View File

@@ -0,0 +1,111 @@
html,
body {
height: 100%;
}
body {
display: flex;
align-items: center;
padding-top: 40px;
padding-bottom: 40px;
background-color: #f5f5f5;
}
.form-signin {
width: 100%;
max-width: 330px;
padding: 15px;
margin: auto;
}
.form-signin .checkbox {
font-weight: 400;
}
.form-signin .form-floating:focus-within {
z-index: 2;
}
.form-signin input[type="text"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.container-flex {
display: flex;
flex-direction: column;
min-height: 100vh;
width: 100%; /* Set width to 100% */
align-items: center; /* Center its children horizontally */
}
.footer-bottom {
margin-top: auto;
}
body.light-mode input:-webkit-autofill,
body.light-mode input:-webkit-autofill:hover,
body.light-mode input:-webkit-autofill:focus,
body.light-mode input:-webkit-autofill:active {
-webkit-text-fill-color: #212529; /* Dark font color */
-webkit-box-shadow: 0 0 0 1000px #f8f9fa inset; /* Light background color */
}
/* Dark Mode */
body.dark-mode input:-webkit-autofill,
body.dark-mode input:-webkit-autofill:hover,
body.dark-mode input:-webkit-autofill:focus,
body.dark-mode input:-webkit-autofill:active {
-webkit-text-fill-color: #f8f9fa; /* Light font color */
-webkit-box-shadow: 0 0 0 1000px #212529 inset; /* Dark background color */
}
/* Light Mode */
body.light-mode .form-floating > input:focus + label {
color: #212529 !important; /* Dark text for light background */
}
/* Dark Mode */
body.dark-mode .form-floating > input:focus + label {
color: #fff !important; /* Light text for dark background */
}
body.light-mode .form-floating > label {
color: #212529 !important; /* Dark text for light background */
}
body.dark-mode .form-floating > label {
color: #fff !important; /* Light text for dark background */
}
/* Removing default styles for ul and li */
ul {
list-style: none;
padding: 0;
margin: 0;
}
li {
list-style: none;
}
/* Positioning the container of these elements to the top right */
.your-container-class {
position: absolute;
top: 0;
right: 0;
display: flex;
}
/* Styling for the dropdown */
.dropdown-menu {
min-width: 200px; /* or whatever width you prefer */
}
.navbar-icon {
width: 40px;
height: 40px;
}

View File

@@ -1,4 +1,4 @@
.list-group-item { .list-group-item {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@@ -25,5 +25,4 @@
.move-down span { .move-down span {
font-weight: bold; font-weight: bold;
font-size: 1.2em; font-size: 1.2em;
} }

View File

@@ -0,0 +1,119 @@
.multi-tool-container {
max-width: 95vw;
margin: 0 auto;
}
#global-buttons-container {
display: flex;
gap: 10px;
align-items: start;
background-color: rgba(13, 110, 253, 0.1);
border: 1px solid rgba(0, 0, 0, 0.25);
backdrop-filter: blur(2px);
top: 10px;
z-index: 10;
padding: 10px;
border-radius: 8px;
}
#global-buttons-container > * {
padding: 0.6rem 0.75rem;
}
#global-buttons-container svg {
width: 20px;
height: 20px;
}
#export-button {
margin-left: auto;
}
#pages-container-wrapper {
--background-color: rgba(0, 0, 0, 0.025);
--scroll-bar-color: #f1f1f1;
--scroll-bar-thumb: #888;
--scroll-bar-thumb-hover: #555;
background-color: var(--background-color);
width: 100%;
display: flex;
flex-direction: column;
padding: 10px 25px;
border-radius: 10px;
overflow-y: hidden;
overflow-x: auto;
min-height: 275px;
margin: 0 0 30px 0;
}
#pages-container {
margin: auto;
gap: 0px;
display: flex;
align-items: center;
justify-content: center;
}
/* width */
#pages-container-wrapper::-webkit-scrollbar {
width: 10px;
height: 10px;
}
/* Track */
#pages-container-wrapper::-webkit-scrollbar-track {
background: var(--scroll-bar-color);
}
/* Handle */
#pages-container-wrapper::-webkit-scrollbar-thumb {
border-radius: 10px;
background: var(--scroll-bar-thumb);
}
/* Handle on hover */
#pages-container-wrapper::-webkit-scrollbar-thumb:hover {
background: var(--scroll-bar-thumb-hover);
}
.page-container {
height: 250px;
display: flex;
align-items: center;
flex-direction: column-reverse;
aspect-ratio: 1;
text-align: center;
position: relative;
user-select: none;
transition: width 1s linear;
}
.page-container img {
/* max-width: calc(100% - 15px); */
max-height: calc(100% - 15px);
max-width: 237px;
display: block;
position: absolute;
left: 50%;
top: 50%;
translate: -50% -50%;
box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384);
border-radius: 4px;
transition: rotate 0.3s;
}
#add-pdf-button {
margin: 0 auto;
}
.page-number {
position: absolute;
top: 5px;
right: 5px;
color: white;
background-color: #007bff; /* Primary blue color */
padding: 3px 6px;
border-radius: 4px;
font-size: 12px;
z-index: 2;
}

View File

@@ -1,8 +1,13 @@
#navbarSearch { #navbarSearch {
top: 100%; top: 100%;
right: 0; right: 0;
transition: all 0.3s;
max-height: 0;
overflow: hidden;
}
#navbarSearch.show {
max-height: 300px; /* Adjust this to your desired max height */
} }
#searchForm { #searchForm {
@@ -14,6 +19,8 @@
max-height: 200px; /* Adjust this value as needed */ max-height: 200px; /* Adjust this value as needed */
overflow-y: auto; overflow-y: auto;
width: 100%; width: 100%;
max-width: 300px; /* Adjust to your preferred width */
transition: height 0.3s ease; /* Smooth height transition */
} }
#searchResults .dropdown-item { #searchResults .dropdown-item {
@@ -34,7 +41,36 @@
text-overflow: ellipsis; /* Add ellipsis for long text */ text-overflow: ellipsis; /* Add ellipsis for long text */
} }
#search-icon i {
font-size: 24px; /* Adjust this to your desired size */
transition: color 0.3s;
}
#search-icon:hover i {
color: #666; /* Adjust this to your hover color */
}
.search-input {
transition:
border 0.3s,
box-shadow 0.3s;
}
.search-input:focus {
border-color: #666; /* Adjust this to your focus color */
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Adjust this to your desired shadow */
}
/* Set a fixed height and styling for each search result item */
.search-results a {
display: flex;
align-items: center;
gap: 10px; /* space between icon and text */
height: 40px; /* Adjust based on your design */
overflow: hidden; /* Prevent content from overflowing */
white-space: nowrap; /* Prevent text from wrapping to next line */
text-overflow: ellipsis; /* Truncate text if it's too long */
}
.main-icon { .main-icon {
width: 36px; width: 36px;
@@ -50,7 +86,7 @@
transform: translateY(-2px); transform: translateY(-2px);
} }
.icon+.icon { .icon + .icon {
margin-left: -4px; margin-left: -4px;
} }
@@ -64,7 +100,7 @@
} }
.nav-item-separator::before { .nav-item-separator::before {
content: ''; content: "";
position: absolute; position: absolute;
left: 0; left: 0;
top: 10%; /* Adjust the top and bottom margins as needed */ top: 10%; /* Adjust the top and bottom margins as needed */

View File

@@ -1,7 +1,6 @@
.pdf-actions_button-container { .pdf-actions_button-container {
z-index: 2; z-index: 2;
display:flex; display: flex;
opacity: 0; opacity: 0;
transition: opacity 0.1s linear; transition: opacity 0.1s linear;
} }
@@ -46,12 +45,12 @@
right: -20px; right: -20px;
} }
html[lang-direction=ltr] .pdf-actions_insert-file-button-container.right { html[lang-direction="ltr"] .pdf-actions_insert-file-button-container.right {
display:none; display: none;
} }
html[lang-direction=rtl] .pdf-actions_insert-file-button-container.left { html[lang-direction="rtl"] .pdf-actions_insert-file-button-container.left {
display:none; display: none;
} }
.pdf-actions_insert-file-button-container.left .pdf-actions_insert-file-button { .pdf-actions_insert-file-button-container.left .pdf-actions_insert-file-button {
@@ -64,12 +63,11 @@ html[lang-direction=rtl] .pdf-actions_insert-file-button-container.left {
translate: 0 -50%; translate: 0 -50%;
} }
html[lang-direction=ltr] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.right { html[lang-direction="ltr"] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.right {
display: block; display: block;
} }
html[lang-direction="rtl"] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.left {
html[lang-direction=rtl] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.left {
display: block; display: block;
} }

View File

@@ -0,0 +1,21 @@
.btn-margin {
margin-right: 2px;
}
.bordered-box {
border: 1px solid #ddd;
padding: 20px;
margin: 20px;
width: 70%;
}
.center-element {
width: 80%;
text-align: center;
margin: auto;
}
.element-margin {
margin: 10px 0;
/* Adjust this value to increase/decrease the margin as needed */
}

View File

@@ -1,37 +1,113 @@
/* Rainbow Mode Styles */ /* Rainbow Mode Styles */
body { body {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%); background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
);
color: #fff !important; color: #fff !important;
--body-background-color: 255, 255, 255; --body-background-color: 255, 255, 255;
--base-font-color: 33, 37, 41; --base-font-color: 33, 37, 41;
} }
.dark-card { .dark-card {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
) !important;
color: white !important; color: white !important;
} }
.jumbotron { .jumbotron {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%); background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
);
color: #fff !important; color: #fff !important;
} }
.list-group { .list-group {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
) !important;
color: fff !important; color: fff !important;
} }
.list-group-item { .list-group-item {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
) !important;
color: fff !important; color: fff !important;
} }
#support-section { #support-section {
background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; background: linear-gradient(
90deg,
rgba(255, 0, 0, 1) 0%,
rgba(255, 154, 0, 1) 10%,
rgba(208, 222, 33, 1) 20%,
rgba(79, 220, 74, 1) 30%,
rgba(63, 218, 216, 1) 40%,
rgba(47, 201, 226, 1) 50%,
rgba(28, 127, 238, 1) 60%,
rgba(95, 21, 242, 1) 70%,
rgba(186, 12, 248, 1) 80%,
rgba(251, 7, 217, 1) 90%,
rgba(255, 0, 0, 1) 100%
) !important;
} }
#pages-container-wrapper { #pages-container-wrapper {
--background-color: rgba(255, 255, 255, 0.046) !important; --background-color: rgba(255, 255, 255, 0.046) !important;
--scroll-bar-color: #4c4c4c !important; --scroll-bar-color: #4c4c4c !important;
--scroll-bar-thumb: #d3d3d3 !important; --scroll-bar-thumb: #d3d3d3 !important;
--scroll-bar-thumb-hover: #ffffff !important; --scroll-bar-thumb-hover: #ffffff !important;
} }

View File

@@ -0,0 +1,29 @@
#pdf-preview {
margin: 0 auto;
display: block;
max-width: calc(100% - 30px);
max-height: calc(100% - 30px);
box-shadow: 0 0 4px rgba(100, 100, 100, 0.25);
transition: rotate 0.3s;
position: absolute;
top: 50%;
left: 50%;
translate: -50% -50%;
}
.previewContainer {
aspect-ratio: 1;
width: 100%;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem;
margin: 1rem 0;
padding: 15px;
display: block;
overflow: hidden;
position: relative;
}
.buttonContainer {
display: flex;
justify-content: space-around;
}

View File

@@ -0,0 +1,39 @@
select#font-select,
select#font-select option {
height: 60px; /* Adjust as needed */
font-size: 30px; /* Adjust as needed */
}
.drawing-pad-container {
text-align: center;
}
#drawing-pad-canvas {
background: rgba(125, 125, 125, 0.2);
width: 100%;
height: 300px;
}
#box-drag-container {
position: relative;
margin: 20px 0;
}
.draggable-buttons-box {
position: absolute;
top: 0;
padding: 10px;
width: 100%;
display: flex;
gap: 5px;
}
.draggable-buttons-box > button {
z-index: 10;
background-color: rgba(13, 110, 253, 0.1);
}
.draggable-canvas {
border: 1px solid red;
position: absolute;
touch-action: none;
user-select: none;
top: 0px;
left: 0;
}

View File

@@ -0,0 +1,10 @@
.pdf-visual-aid {
width: 150px; /* Adjust as needed */
height: 200px; /* Adjust as needed */
border: 1px solid black; /* Represents the PDF page */
position: relative;
}
.line {
position: absolute;
background-color: red; /* Line color */
}

View File

@@ -0,0 +1,41 @@
.a4container {
position: relative;
width: 50%;
aspect-ratio: 0.707;
border: 1px solid #ddd;
box-sizing: border-box;
background-color: white;
}
.pageNumber {
position: absolute;
display: flex;
justify-content: center;
align-items: center;
font-size: 1em;
color: #333;
cursor: pointer;
background-color: #ccc;
width: 15%;
height: 15%;
transform: translate(-50%, -50%);
}
.pageNumber:hover {
background-color: #eee;
}
#myForm {
display: flex;
justify-content: center;
align-items: center;
margin-top: 20px;
}
.selectedPosition {
background-color: #0a0;
}
.selectedPosition.selectedHovered {
background-color: #006600;
}

View File

@@ -1,6 +1,4 @@
.tab-group { .tab-group {
} }
.tab-container { .tab-container {

View File

@@ -1,5 +1,5 @@
var toggleCount = 0 var toggleCount = 0;
var lastToggleTime = Date.now() var lastToggleTime = Date.now();
var elements = { var elements = {
lightModeStyles: null, lightModeStyles: null,
@@ -11,18 +11,18 @@ var elements = {
navbar: null, navbar: null,
navIcons: null, navIcons: null,
navDropdownMenus: null, navDropdownMenus: null,
} };
function getElements() { function getElements() {
elements.lightModeStyles = document.getElementById("light-mode-styles") elements.lightModeStyles = document.getElementById("light-mode-styles");
elements.darkModeStyles = document.getElementById("dark-mode-styles") elements.darkModeStyles = document.getElementById("dark-mode-styles");
elements.rainbowModeStyles = document.getElementById("rainbow-mode-styles") elements.rainbowModeStyles = document.getElementById("rainbow-mode-styles");
elements.darkModeIcon = document.getElementById("dark-mode-icon") elements.darkModeIcon = document.getElementById("dark-mode-icon");
elements.searchBar = document.getElementById("searchBar") elements.searchBar = document.getElementById("searchBar");
elements.formControls = document.querySelectorAll(".form-control") elements.formControls = document.querySelectorAll(".form-control");
elements.navbar = document.querySelectorAll("nav.navbar") elements.navbar = document.querySelectorAll("nav.navbar");
elements.navIcons = document.querySelectorAll("nav .icon, .navbar-icon") elements.navIcons = document.querySelectorAll("nav .icon, .navbar-icon");
elements.navDropdownMenus = document.querySelectorAll("nav .dropdown-menu") elements.navDropdownMenus = document.querySelectorAll(".dropdown-menu");
} }
function setMode(mode) { function setMode(mode) {
var event = new CustomEvent("modeChanged", { detail: mode }); var event = new CustomEvent("modeChanged", { detail: mode });
@@ -48,22 +48,22 @@ function setMode(mode) {
elements.searchBar.classList.add("dark-mode-search"); elements.searchBar.classList.add("dark-mode-search");
} }
if (elements && elements.formControls) { if (elements && elements.formControls) {
elements.formControls.forEach(input => input.classList.add("bg-dark", "text-white")); elements.formControls.forEach((input) => input.classList.add("bg-dark", "text-white"));
} }
if (elements && elements.navbar) { if (elements && elements.navbar) {
elements.navbar.forEach(navElement => { elements.navbar.forEach((navElement) => {
navElement.classList.remove("navbar-light", "bg-light"); navElement.classList.remove("navbar-light", "bg-light");
navElement.classList.add("navbar-dark", "bg-dark"); navElement.classList.add("navbar-dark", "bg-dark");
}); });
} }
if (elements && elements.navDropdownMenus) { if (elements && elements.navDropdownMenus) {
elements.navDropdownMenus.forEach(menu => menu.classList.add("dropdown-menu-dark")); elements.navDropdownMenus.forEach((menu) => menu.classList.add("dropdown-menu-dark"));
} }
if (elements && elements.navIcons) { if (elements && elements.navIcons) {
elements.navIcons.forEach(icon => (icon.style.filter = "invert(1)")); elements.navIcons.forEach((icon) => (icon.style.filter = "invert(1)"));
} }
var tables = document.querySelectorAll(".table"); var tables = document.querySelectorAll(".table");
tables.forEach(table => { tables.forEach((table) => {
table.classList.add("table-dark"); table.classList.add("table-dark");
}); });
if (jumbotron) { if (jumbotron) {
@@ -78,22 +78,22 @@ function setMode(mode) {
elements.searchBar.classList.remove("dark-mode-search"); elements.searchBar.classList.remove("dark-mode-search");
} }
if (elements && elements.formControls) { if (elements && elements.formControls) {
elements.formControls.forEach(input => input.classList.remove("bg-dark", "text-white")); elements.formControls.forEach((input) => input.classList.remove("bg-dark", "text-white"));
} }
if (elements && elements.navbar) { if (elements && elements.navbar) {
elements.navbar.forEach(navElement => { elements.navbar.forEach((navElement) => {
navElement.classList.remove("navbar-dark", "bg-dark"); navElement.classList.remove("navbar-dark", "bg-dark");
navElement.classList.add("navbar-light", "bg-light"); navElement.classList.add("navbar-light", "bg-light");
}); });
} }
if (elements && elements.navDropdownMenus) { if (elements && elements.navDropdownMenus) {
elements.navDropdownMenus.forEach(menu => menu.classList.remove("dropdown-menu-dark")); elements.navDropdownMenus.forEach((menu) => menu.classList.remove("dropdown-menu-dark"));
} }
if (elements && elements.navIcons) { if (elements && elements.navIcons) {
elements.navIcons.forEach(icon => (icon.style.filter = "none")); elements.navIcons.forEach((icon) => (icon.style.filter = "none"));
} }
var tables = document.querySelectorAll(".table-dark"); var tables = document.querySelectorAll(".table-dark");
tables.forEach(table => { tables.forEach((table) => {
table.classList.remove("table-dark"); table.classList.remove("table-dark");
}); });
if (jumbotron) { if (jumbotron) {
@@ -108,36 +108,36 @@ function setMode(mode) {
} }
function toggleDarkMode() { function toggleDarkMode() {
var currentTime = Date.now() var currentTime = Date.now();
if (currentTime - lastToggleTime < 1000) { if (currentTime - lastToggleTime < 1000) {
toggleCount++ toggleCount++;
} else { } else {
toggleCount = 1 toggleCount = 1;
} }
lastToggleTime = currentTime lastToggleTime = currentTime;
if (toggleCount >= 18) { if (toggleCount >= 18) {
localStorage.setItem("dark-mode", "rainbow") localStorage.setItem("dark-mode", "rainbow");
setMode("rainbow") setMode("rainbow");
} else if (localStorage.getItem("dark-mode") == "on") { } else if (localStorage.getItem("dark-mode") == "on") {
localStorage.setItem("dark-mode", "off") localStorage.setItem("dark-mode", "off");
setMode("off") setMode("off");
} else { } else {
localStorage.setItem("dark-mode", "on") localStorage.setItem("dark-mode", "on");
setMode("on") setMode("on");
} }
} }
document.addEventListener("DOMContentLoaded", function () { document.addEventListener("DOMContentLoaded", function () {
getElements() getElements();
var currentMode = localStorage.getItem("dark-mode") var currentMode = localStorage.getItem("dark-mode");
if (currentMode === "on" || currentMode === "off" || currentMode === "rainbow") { if (currentMode === "on" || currentMode === "off" || currentMode === "rainbow") {
setMode(currentMode) setMode(currentMode);
} else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) {
setMode("on") setMode("on");
} else { } else {
setMode("off") setMode("off");
} }
var darkModeToggle = document.getElementById("dark-mode-toggle"); var darkModeToggle = document.getElementById("dark-mode-toggle");
@@ -147,4 +147,4 @@ document.addEventListener("DOMContentLoaded", function () {
toggleDarkMode(); toggleDarkMode();
}); });
} }
}) });

View File

@@ -7,12 +7,12 @@ function showErrorBanner(message, stackTrace) {
} }
let firstErrorOccurred = false; let firstErrorOccurred = false;
$(document).ready(function() { $(document).ready(function () {
$('form').submit(async function(event) { $("form").submit(async function (event) {
event.preventDefault(); event.preventDefault();
firstErrorOccurred = false; firstErrorOccurred = false;
const url = this.action; const url = this.action;
const files = $('#fileInput-input')[0].files; const files = $("#fileInput-input")[0].files;
const formData = new FormData(this); const formData = new FormData(this);
// Remove empty file entries // Remove empty file entries
@@ -21,53 +21,81 @@ $(document).ready(function() {
formData.delete(key); formData.delete(key);
} }
} }
const override = $('#override').val() || ''; const override = $("#override").val() || "";
const originalButtonText = $('#submitBtn').text(); const originalButtonText = $("#submitBtn").text();
$('#submitBtn').text('Processing...'); $("#submitBtn").text("Processing...");
console.log(override); console.log(override);
// Set a timeout to show the game button if operation takes more than 5 seconds
const timeoutId = setTimeout(() => {
var boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
const showGameBtn = document.getElementById("show-game-btn");
if (boredWaiting === "enabled" && showGameBtn) {
showGameBtn.style.display = "block";
}
}, 5000);
try { try {
if(remoteCall === true) { if (remoteCall === true) {
if (override === 'multi' || (!multiple && files.length > 1) && override !== 'single' ) { if (override === "multi" || (!multiple && files.length > 1 && override !== "single")) {
await submitMultiPdfForm(url, files); await submitMultiPdfForm(url, files);
} else { } else {
await handleSingleDownload(url, formData); await handleSingleDownload(url, formData);
} }
} }
$('#submitBtn').text(originalButtonText); clearTimeout(timeoutId);
$("#submitBtn").text(originalButtonText);
// After process finishes, check for boredWaiting and gameDialog open status
const boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
const gameDialog = document.getElementById('game-container-wrapper');
if (boredWaiting === "enabled" && gameDialog && gameDialog.open) {
// Display a green banner at the bottom of the screen saying "Download complete"
let downloadCompleteText = "Download Complete";
if(window.downloadCompleteText){
downloadCompleteText = window.downloadCompleteText;
}
$("body").append('<div id="download-complete-banner" style="position:fixed;bottom:0;left:0;width:100%;background-color:green;color:white;text-align:center;padding:10px;font-size:16px;z-index:1000;">'+ downloadCompleteText + '</div>');
setTimeout(function() {
$("#download-complete-banner").fadeOut("slow", function() {
$(this).remove(); // Remove the banner after fading out
});
}, 5000); // Banner will fade out after 5 seconds
}
} catch (error) { } catch (error) {
clearTimeout(timeoutId);
handleDownloadError(error); handleDownloadError(error);
$('#submitBtn').text(originalButtonText); $("#submitBtn").text(originalButtonText);
console.error(error); console.error(error);
} }
}); });
}); });
async function handleSingleDownload(url, formData, isMulti = false, isZip = false) {
async function handleSingleDownload(url, formData, isMulti = false , isZip = false) {
try { try {
const response = await fetch(url, { method: 'POST', body: formData }); const response = await fetch(url, { method: "POST", body: formData });
const contentType = response.headers.get('content-type'); const contentType = response.headers.get("content-type");
if (!response.ok) { if (!response.ok) {
if (contentType && contentType.includes('application/json')) { if (contentType && contentType.includes("application/json")) {
return handleJsonResponse(response); return handleJsonResponse(response);
console.error('Throwing error banner, response was not okay'); console.error("Throwing error banner, response was not okay");
} }
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
const contentDisposition = response.headers.get('Content-Disposition'); const contentDisposition = response.headers.get("Content-Disposition");
let filename = getFilenameFromContentDisposition(contentDisposition); let filename = getFilenameFromContentDisposition(contentDisposition);
const blob = await response.blob(); const blob = await response.blob();
if (contentType.includes('application/pdf') || contentType.includes('image/')) { if (contentType.includes("application/pdf") || contentType.includes("image/")) {
return handleResponse(blob, filename, !isMulti, isZip); return handleResponse(blob, filename, !isMulti, isZip);
} else { } else {
return handleResponse(blob, filename, false, isZip); return handleResponse(blob, filename, false, isZip);
} }
} catch (error) { } catch (error) {
console.error('Error in handleSingleDownload:', error); console.error("Error in handleSingleDownload:", error);
throw error; // Re-throw the error if you want it to be handled higher up. throw error; // Re-throw the error if you want it to be handled higher up.
} }
} }
@@ -75,47 +103,48 @@ async function handleSingleDownload(url, formData, isMulti = false , isZip = fal
function getFilenameFromContentDisposition(contentDisposition) { function getFilenameFromContentDisposition(contentDisposition) {
let filename; let filename;
if (contentDisposition && contentDisposition.indexOf('attachment') !== -1) { if (contentDisposition && contentDisposition.indexOf("attachment") !== -1) {
filename = decodeURIComponent(contentDisposition.split('filename=')[1].replace(/"/g, '')).trim(); filename = decodeURIComponent(contentDisposition.split("filename=")[1].replace(/"/g, "")).trim();
} else { } else {
// If the Content-Disposition header is not present or does not contain the filename, use a default filename // If the Content-Disposition header is not present or does not contain the filename, use a default filename
filename = 'download'; filename = "download";
} }
return filename; return filename;
} }
async function handleJsonResponse(response) { async function handleJsonResponse(response) {
const json = await response.json(); const json = await response.json();
const errorMessage = JSON.stringify(json, null, 2); const errorMessage = JSON.stringify(json, null, 2);
if (errorMessage.toLowerCase().includes('the password is incorrect') || errorMessage.toLowerCase().includes('Password is not provided') || errorMessage.toLowerCase().includes('PDF contains an encryption dictionary')) { if (
errorMessage.toLowerCase().includes("the password is incorrect") ||
errorMessage.toLowerCase().includes("Password is not provided") ||
errorMessage.toLowerCase().includes("PDF contains an encryption dictionary")
) {
if (!firstErrorOccurred) { if (!firstErrorOccurred) {
firstErrorOccurred = true; firstErrorOccurred = true;
alert(pdfPasswordPrompt); alert(pdfPasswordPrompt);
} }
} else { } else {
showErrorBanner(json.error + ':' + json.message, json.trace); showErrorBanner(json.error + ":" + json.message, json.trace);
} }
} }
async function handleResponse(blob, filename, considerViewOptions = false, isZip = false) { async function handleResponse(blob, filename, considerViewOptions = false, isZip = false) {
if (!blob) return; if (!blob) return;
const downloadOption = localStorage.getItem('downloadOption'); const downloadOption = localStorage.getItem("downloadOption");
if (considerViewOptions) { if (considerViewOptions) {
if (downloadOption === 'sameWindow') { if (downloadOption === "sameWindow") {
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
window.location.href = url; window.location.href = url;
return; return;
} else if (downloadOption === 'newWindow') { } else if (downloadOption === "newWindow") {
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
window.open(url, '_blank'); window.open(url, "_blank");
return; return;
} }
} }
if(!isZip){ if (!isZip) {
downloadFile(blob, filename); downloadFile(blob, filename);
} }
return { filename, blob }; return { filename, blob };
@@ -130,11 +159,11 @@ let urls = []; // An array to hold all the URLs
function downloadFile(blob, filename) { function downloadFile(blob, filename) {
if (!(blob instanceof Blob)) { if (!(blob instanceof Blob)) {
console.error('Invalid blob passed to downloadFile function'); console.error("Invalid blob passed to downloadFile function");
return; return;
} }
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
const a = document.createElement('a'); const a = document.createElement("a");
a.href = url; a.href = url;
a.download = filename; a.download = filename;
a.click(); a.click();
@@ -143,26 +172,23 @@ function downloadFile(blob, filename) {
return { filename, blob }; return { filename, blob };
} }
async function submitMultiPdfForm(url, files) { async function submitMultiPdfForm(url, files) {
const zipThreshold = parseInt(localStorage.getItem('zipThreshold'), 10) || 4; const zipThreshold = parseInt(localStorage.getItem("zipThreshold"), 10) || 4;
const zipFiles = files.length > zipThreshold; const zipFiles = files.length > zipThreshold;
let jszip = null; let jszip = null;
// Show the progress bar // Show the progress bar
$('#progressBarContainer').show(); $("#progressBarContainer").show();
// Initialize the progress bar // Initialize the progress bar
let progressBar = $('#progressBar'); let progressBar = $("#progressBar");
progressBar.css('width', '0%'); progressBar.css("width", "0%");
progressBar.attr('aria-valuenow', 0); progressBar.attr("aria-valuenow", 0);
progressBar.attr('aria-valuemax', files.length); progressBar.attr("aria-valuemax", files.length);
if (zipFiles) { if (zipFiles) {
jszip = new JSZip(); jszip = new JSZip();
} }
// Get the form with the method attribute set to POST // Get the form with the method attribute set to POST
let postForm = document.querySelector('form[method="POST"]'); let postForm = document.querySelector('form[method="POST"]');
@@ -174,7 +200,7 @@ async function submitMultiPdfForm(url, files) {
console.log("No form with POST method found."); console.log("No form with POST method found.");
} }
//Remove file to reuse parameters for other runs //Remove file to reuse parameters for other runs
formData.delete('fileInput'); formData.delete("fileInput");
// Remove empty file entries // Remove empty file entries
for (let [key, value] of formData.entries()) { for (let [key, value] of formData.entries()) {
if (value instanceof File && !value.name) { if (value instanceof File && !value.name) {
@@ -188,14 +214,14 @@ async function submitMultiPdfForm(url, files) {
} }
for (const chunk of chunks) { for (const chunk of chunks) {
const promises = chunk.map(async file => { const promises = chunk.map(async (file) => {
let fileFormData = new FormData(); let fileFormData = new FormData();
fileFormData.append('fileInput', file); fileFormData.append("fileInput", file);
console.log(fileFormData); console.log(fileFormData);
// Add other form data // Add other form data
for (let pair of formData.entries()) { for (let pair of formData.entries()) {
fileFormData.append(pair[0], pair[1]); fileFormData.append(pair[0], pair[1]);
console.log(pair[0]+ ', ' + pair[1]); console.log(pair[0] + ", " + pair[1]);
} }
try { try {
@@ -213,7 +239,6 @@ async function submitMultiPdfForm(url, files) {
} }
}); });
await Promise.all(promises); await Promise.all(promises);
} }
if (zipFiles) { if (zipFiles) {
@@ -221,21 +246,19 @@ async function submitMultiPdfForm(url, files) {
const content = await jszip.generateAsync({ type: "blob" }); const content = await jszip.generateAsync({ type: "blob" });
downloadFile(content, "files.zip"); downloadFile(content, "files.zip");
} catch (error) { } catch (error) {
console.error('Error generating ZIP file: ' + error); console.error("Error generating ZIP file: " + error);
} }
} }
progressBar.css('width', '100%'); progressBar.css("width", "100%");
progressBar.attr('aria-valuenow', Array.from(files).length); progressBar.attr("aria-valuenow", Array.from(files).length);
} }
function updateProgressBar(progressBar, files) { function updateProgressBar(progressBar, files) {
let progress = ((progressBar.attr('aria-valuenow') / files.length) * 100) + (100 / files.length); let progress = (progressBar.attr("aria-valuenow") / files.length) * 100 + 100 / files.length;
progressBar.css('width', progress + '%'); progressBar.css("width", progress + "%");
progressBar.attr('aria-valuenow', parseInt(progressBar.attr('aria-valuenow')) + 1); progressBar.attr("aria-valuenow", parseInt(progressBar.attr("aria-valuenow")) + 1);
} }
window.addEventListener('unload', () => { window.addEventListener("unload", () => {
for (const url of urls) { for (const url of urls) {
URL.revokeObjectURL(url); URL.revokeObjectURL(url);
} }

View File

@@ -1,24 +1,23 @@
const DraggableUtils = { const DraggableUtils = {
boxDragContainer: document.getElementById("box-drag-container"),
boxDragContainer: document.getElementById('box-drag-container'), pdfCanvas: document.getElementById("pdf-canvas"),
pdfCanvas: document.getElementById('pdf-canvas'),
nextId: 0, nextId: 0,
pdfDoc: null, pdfDoc: null,
pageIndex: 0, pageIndex: 0,
documentsMap: new Map(), documentsMap: new Map(),
init() { init() {
interact('.draggable-canvas') interact(".draggable-canvas")
.draggable({ .draggable({
listeners: { listeners: {
move: (event) => { move: (event) => {
const target = event.target; const target = event.target;
const x = (parseFloat(target.getAttribute('data-bs-x')) || 0) + event.dx; const x = (parseFloat(target.getAttribute("data-bs-x")) || 0) + event.dx;
const y = (parseFloat(target.getAttribute('data-bs-y')) || 0) + event.dy; const y = (parseFloat(target.getAttribute("data-bs-y")) || 0) + event.dy;
target.style.transform = `translate(${x}px, ${y}px)`; target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-bs-x', x); target.setAttribute("data-bs-x", x);
target.setAttribute('data-bs-y', y); target.setAttribute("data-bs-y", y);
this.onInteraction(target); this.onInteraction(target);
}, },
@@ -28,9 +27,9 @@ const DraggableUtils = {
edges: { left: true, right: true, bottom: true, top: true }, edges: { left: true, right: true, bottom: true, top: true },
listeners: { listeners: {
move: (event) => { move: (event) => {
var target = event.target var target = event.target;
var x = (parseFloat(target.getAttribute('data-bs-x')) || 0) var x = parseFloat(target.getAttribute("data-bs-x")) || 0;
var y = (parseFloat(target.getAttribute('data-bs-y')) || 0) var y = parseFloat(target.getAttribute("data-bs-y")) || 0;
// check if control key is pressed // check if control key is pressed
if (event.ctrlKey) { if (event.ctrlKey) {
@@ -49,18 +48,18 @@ const DraggableUtils = {
event.rect.height = height; event.rect.height = height;
} }
target.style.width = event.rect.width + 'px' target.style.width = event.rect.width + "px";
target.style.height = event.rect.height + 'px' target.style.height = event.rect.height + "px";
// translate when resizing from top or left edges // translate when resizing from top or left edges
x += event.deltaRect.left x += event.deltaRect.left;
y += event.deltaRect.top y += event.deltaRect.top;
target.style.transform = 'translate(' + x + 'px,' + y + 'px)' target.style.transform = "translate(" + x + "px," + y + "px)";
target.setAttribute('data-bs-x', x) target.setAttribute("data-bs-x", x);
target.setAttribute('data-bs-y', y) target.setAttribute("data-bs-y", y);
target.textContent = Math.round(event.rect.width) + '\u00D7' + Math.round(event.rect.height) target.textContent = Math.round(event.rect.width) + "\u00D7" + Math.round(event.rect.height);
this.onInteraction(target); this.onInteraction(target);
}, },
@@ -79,17 +78,17 @@ const DraggableUtils = {
}, },
createDraggableCanvas() { createDraggableCanvas() {
const createdCanvas = document.createElement('canvas'); const createdCanvas = document.createElement("canvas");
createdCanvas.id = `draggable-canvas-${this.nextId++}`; createdCanvas.id = `draggable-canvas-${this.nextId++}`;
createdCanvas.classList.add("draggable-canvas"); createdCanvas.classList.add("draggable-canvas");
const x = 0; const x = 0;
const y = 20; const y = 20;
createdCanvas.style.transform = `translate(${x}px, ${y}px)`; createdCanvas.style.transform = `translate(${x}px, ${y}px)`;
createdCanvas.setAttribute('data-bs-x', x); createdCanvas.setAttribute("data-bs-x", x);
createdCanvas.setAttribute('data-bs-y', y); createdCanvas.setAttribute("data-bs-y", y);
createdCanvas.onclick = e => this.onInteraction(e.target); createdCanvas.onclick = (e) => this.onInteraction(e.target);
this.boxDragContainer.appendChild(createdCanvas); this.boxDragContainer.appendChild(createdCanvas);
return createdCanvas; return createdCanvas;
@@ -121,17 +120,17 @@ const DraggableUtils = {
newHeight = newHeight * scaleMultiplier; newHeight = newHeight * scaleMultiplier;
} }
createdCanvas.style.width = newWidth+"px"; createdCanvas.style.width = newWidth + "px";
createdCanvas.style.height = newHeight+"px"; createdCanvas.style.height = newHeight + "px";
var myContext = createdCanvas.getContext("2d"); var myContext = createdCanvas.getContext("2d");
myContext.drawImage(myImage,0,0); myContext.drawImage(myImage, 0, 0);
resolve(createdCanvas); resolve(createdCanvas);
} };
}) });
}, },
deleteAllDraggableCanvases() { deleteAllDraggableCanvases() {
this.boxDragContainer.querySelectorAll(".draggable-canvas").forEach(el => el.remove()); this.boxDragContainer.querySelectorAll(".draggable-canvas").forEach((el) => el.remove());
}, },
deleteDraggableCanvas(element) { deleteDraggableCanvas(element) {
if (element) { if (element) {
@@ -149,12 +148,18 @@ const DraggableUtils = {
} }
const elements = [...this.boxDragContainer.querySelectorAll(".draggable-canvas")]; const elements = [...this.boxDragContainer.querySelectorAll(".draggable-canvas")];
const draggablesData = elements.map(el => {return{element:el, offsetWidth:el.offsetWidth, offsetHeight:el.offsetHeight}}); const draggablesData = elements.map((el) => {
elements.forEach(el => this.boxDragContainer.removeChild(el)); return {
element: el,
offsetWidth: el.offsetWidth,
offsetHeight: el.offsetHeight,
};
});
elements.forEach((el) => this.boxDragContainer.removeChild(el));
pagesMap[this.pageIndex] = draggablesData; pagesMap[this.pageIndex] = draggablesData;
pagesMap[this.pageIndex+"-offsetWidth"] = this.pdfCanvas.offsetWidth; pagesMap[this.pageIndex + "-offsetWidth"] = this.pdfCanvas.offsetWidth;
pagesMap[this.pageIndex+"-offsetHeight"] = this.pdfCanvas.offsetHeight; pagesMap[this.pageIndex + "-offsetHeight"] = this.pdfCanvas.offsetHeight;
this.documentsMap.set(this.pdfDoc, pagesMap); this.documentsMap.set(this.pdfDoc, pagesMap);
}, },
@@ -167,7 +172,7 @@ const DraggableUtils = {
const draggablesData = pagesMap[this.pageIndex]; const draggablesData = pagesMap[this.pageIndex];
if (draggablesData) { if (draggablesData) {
draggablesData.forEach(draggableData => this.boxDragContainer.appendChild(draggableData.element)); draggablesData.forEach((draggableData) => this.boxDragContainer.appendChild(draggableData.element));
} }
this.documentsMap.set(this.pdfDoc, pagesMap); this.documentsMap.set(this.pdfDoc, pagesMap);
@@ -178,7 +183,7 @@ const DraggableUtils = {
this.pageIndex = pageIdx; this.pageIndex = pageIdx;
// persist // persist
const page = await this.pdfDoc.getPage(this.pageIndex+1); const page = await this.pdfDoc.getPage(this.pageIndex + 1);
// set the canvas size to the size of the page // set the canvas size to the size of the page
if (page.rotate == 90 || page.rotate == 270) { if (page.rotate == 90 || page.rotate == 270) {
@@ -192,33 +197,33 @@ const DraggableUtils = {
// render the page onto the canvas // render the page onto the canvas
var renderContext = { var renderContext = {
canvasContext: this.pdfCanvas.getContext("2d"), canvasContext: this.pdfCanvas.getContext("2d"),
viewport: page.getViewport({ scale: 1 }) viewport: page.getViewport({ scale: 1 }),
}; };
await page.render(renderContext).promise; await page.render(renderContext).promise;
//return pdfCanvas.toDataURL(); //return pdfCanvas.toDataURL();
}, },
async incrementPage() { async incrementPage() {
if (this.pageIndex < this.pdfDoc.numPages-1) { if (this.pageIndex < this.pdfDoc.numPages - 1) {
this.storePageContents(); this.storePageContents();
await this.renderPage(this.pdfDoc, this.pageIndex+1); await this.renderPage(this.pdfDoc, this.pageIndex + 1);
this.loadPageContents(); this.loadPageContents();
} }
}, },
async decrementPage() { async decrementPage() {
if (this.pageIndex > 0) { if (this.pageIndex > 0) {
this.storePageContents(); this.storePageContents();
await this.renderPage(this.pdfDoc, this.pageIndex-1); await this.renderPage(this.pdfDoc, this.pageIndex - 1);
this.loadPageContents(); this.loadPageContents();
} }
}, },
parseTransform(element) { parseTransform(element) {},
},
async getOverlayedPdfDocument() { async getOverlayedPdfDocument() {
const pdfBytes = await this.pdfDoc.getData(); const pdfBytes = await this.pdfDoc.getData();
const pdfDocModified = await PDFLib.PDFDocument.load(pdfBytes, { ignoreEncryption: true }); const pdfDocModified = await PDFLib.PDFDocument.load(pdfBytes, {
ignoreEncryption: true,
});
this.storePageContents(); this.storePageContents();
const pagesMap = this.documentsMap.get(this.pdfDoc); const pagesMap = this.documentsMap.get(this.pdfDoc);
@@ -230,8 +235,8 @@ const DraggableUtils = {
const page = pdfDocModified.getPage(parseInt(pageIdx)); const page = pdfDocModified.getPage(parseInt(pageIdx));
const draggablesData = pagesMap[pageIdx]; const draggablesData = pagesMap[pageIdx];
const offsetWidth = pagesMap[pageIdx+"-offsetWidth"]; const offsetWidth = pagesMap[pageIdx + "-offsetWidth"];
const offsetHeight = pagesMap[pageIdx+"-offsetHeight"]; const offsetHeight = pagesMap[pageIdx + "-offsetHeight"];
for (const draggableData of draggablesData) { for (const draggableData of draggablesData) {
// embed the draggable canvas // embed the draggable canvas
@@ -241,7 +246,7 @@ const DraggableUtils = {
const pdfImageObject = await pdfDocModified.embedPng(draggableImgBytes); const pdfImageObject = await pdfDocModified.embedPng(draggableImgBytes);
// calculate the position in the pdf document // calculate the position in the pdf document
const tansform = draggableElement.style.transform.replace(/[^.,-\d]/g, ''); const tansform = draggableElement.style.transform.replace(/[^.,-\d]/g, "");
const transformComponents = tansform.split(","); const transformComponents = tansform.split(",");
const draggablePositionPixels = { const draggablePositionPixels = {
x: parseFloat(transformComponents[0]), x: parseFloat(transformComponents[0]),
@@ -254,13 +259,13 @@ const DraggableUtils = {
y: draggablePositionPixels.y / offsetHeight, y: draggablePositionPixels.y / offsetHeight,
width: draggablePositionPixels.width / offsetWidth, width: draggablePositionPixels.width / offsetWidth,
height: draggablePositionPixels.height / offsetHeight, height: draggablePositionPixels.height / offsetHeight,
} };
const draggablePositionPdf = { const draggablePositionPdf = {
x: draggablePositionRelative.x * page.getWidth(), x: draggablePositionRelative.x * page.getWidth(),
y: draggablePositionRelative.y * page.getHeight(), y: draggablePositionRelative.y * page.getHeight(),
width: draggablePositionRelative.width * page.getWidth(), width: draggablePositionRelative.width * page.getWidth(),
height: draggablePositionRelative.height * page.getHeight(), height: draggablePositionRelative.height * page.getHeight(),
} };
// draw the image // draw the image
page.drawImage(pdfImageObject, { page.drawImage(pdfImageObject, {
@@ -275,7 +280,7 @@ const DraggableUtils = {
this.loadPageContents(); this.loadPageContents();
return pdfDocModified; return pdfDocModified;
}, },
} };
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
DraggableUtils.init(); DraggableUtils.init();

View File

@@ -13,10 +13,10 @@ function toggletrace() {
} }
function copytrace() { function copytrace() {
var flip = false var flip = false;
if (!traceVisible) { if (!traceVisible) {
toggletrace() toggletrace();
flip = true flip = true;
} }
var traceContent = document.getElementById("traceContent"); var traceContent = document.getElementById("traceContent");
var range = document.createRange(); var range = document.createRange();
@@ -26,7 +26,7 @@ function copytrace() {
document.execCommand("copy"); document.execCommand("copy");
window.getSelection().removeAllRanges(); window.getSelection().removeAllRanges();
if (flip) { if (flip) {
toggletrace() toggletrace();
} }
} }
@@ -46,5 +46,5 @@ function adjustContainerHeight() {
} }
} }
function showHelp() { function showHelp() {
$('#helpModal').modal('show'); $("#helpModal").modal("show");
} }

View File

@@ -1,24 +1,24 @@
function updateFavoritesDropdown() { function updateFavoritesDropdown() {
var dropdown = document.querySelector('#favoritesDropdown'); var dropdown = document.querySelector("#favoritesDropdown");
// Check if dropdown exists // Check if dropdown exists
if (!dropdown) { if (!dropdown) {
console.error('Dropdown element with ID "favoritesDropdown" not found!'); console.error('Dropdown element with ID "favoritesDropdown" not found!');
return; // Exit the function return; // Exit the function
} }
dropdown.innerHTML = ''; // Clear the current favorites dropdown.innerHTML = ""; // Clear the current favorites
var hasFavorites = false; var hasFavorites = false;
for (var i = 0; i < localStorage.length; i++) { for (var i = 0; i < localStorage.length; i++) {
var key = localStorage.key(i); var key = localStorage.key(i);
if (localStorage.getItem(key) === 'favorite') { if (localStorage.getItem(key) === "favorite") {
// Find the corresponding navbar entry // Find the corresponding navbar entry
var navbarEntry = document.querySelector(`a[href='${key}']`); var navbarEntry = document.querySelector(`a[href='${key}']`);
if (navbarEntry) { if (navbarEntry) {
// Create a new dropdown entry // Create a new dropdown entry
var dropdownItem = document.createElement('a'); var dropdownItem = document.createElement("a");
dropdownItem.className = 'dropdown-item'; dropdownItem.className = "dropdown-item";
dropdownItem.href = navbarEntry.href; dropdownItem.href = navbarEntry.href;
dropdownItem.innerHTML = navbarEntry.innerHTML; dropdownItem.innerHTML = navbarEntry.innerHTML;
dropdown.appendChild(dropdownItem); dropdown.appendChild(dropdownItem);
@@ -31,15 +31,15 @@ function updateFavoritesDropdown() {
// Show or hide the default item based on whether there are any favorites // Show or hide the default item based on whether there are any favorites
if (!hasFavorites) { if (!hasFavorites) {
var defaultItem = document.createElement('a'); var defaultItem = document.createElement("a");
defaultItem.className = 'dropdown-item'; defaultItem.className = "dropdown-item";
defaultItem.textContent = noFavourites; defaultItem.textContent = noFavourites;
dropdown.appendChild(defaultItem); dropdown.appendChild(defaultItem);
} }
} }
// Ensure that the DOM content has been fully loaded before calling the function // Ensure that the DOM content has been fully loaded before calling the function
document.addEventListener('DOMContentLoaded', function() { document.addEventListener("DOMContentLoaded", function () {
console.log('DOMContentLoaded event fired'); console.log("DOMContentLoaded event fired");
updateFavoritesDropdown(); updateFavoritesDropdown();
}); });

View File

@@ -1,38 +1,38 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('.custom-file-chooser').forEach(setupFileInput); document.querySelectorAll(".custom-file-chooser").forEach(setupFileInput);
}); });
function setupFileInput(chooser) { function setupFileInput(chooser) {
const elementId = chooser.getAttribute('data-bs-element-id'); const elementId = chooser.getAttribute("data-bs-element-id");
const filesSelected = chooser.getAttribute('data-bs-files-selected'); const filesSelected = chooser.getAttribute("data-bs-files-selected");
const pdfPrompt = chooser.getAttribute('data-bs-pdf-prompt'); const pdfPrompt = chooser.getAttribute("data-bs-pdf-prompt");
let allFiles = []; let allFiles = [];
let overlay; let overlay;
let dragCounter = 0; let dragCounter = 0;
const dragenterListener = function() { const dragenterListener = function () {
dragCounter++; dragCounter++;
if (!overlay) { if (!overlay) {
overlay = document.createElement('div'); overlay = document.createElement("div");
overlay.style.position = 'fixed'; overlay.style.position = "fixed";
overlay.style.top = 0; overlay.style.top = 0;
overlay.style.left = 0; overlay.style.left = 0;
overlay.style.width = '100%'; overlay.style.width = "100%";
overlay.style.height = '100%'; overlay.style.height = "100%";
overlay.style.background = 'rgba(0, 0, 0, 0.5)'; overlay.style.background = "rgba(0, 0, 0, 0.5)";
overlay.style.color = '#fff'; overlay.style.color = "#fff";
overlay.style.zIndex = '1000'; overlay.style.zIndex = "1000";
overlay.style.display = 'flex'; overlay.style.display = "flex";
overlay.style.alignItems = 'center'; overlay.style.alignItems = "center";
overlay.style.justifyContent = 'center'; overlay.style.justifyContent = "center";
overlay.style.pointerEvents = 'none'; overlay.style.pointerEvents = "none";
overlay.innerHTML = '<p>Drop files anywhere to upload</p>'; overlay.innerHTML = "<p>Drop files anywhere to upload</p>";
document.getElementById('content-wrap').appendChild(overlay); document.getElementById("content-wrap").appendChild(overlay);
} }
}; };
const dragleaveListener = function() { const dragleaveListener = function () {
dragCounter--; dragCounter--;
if (dragCounter === 0) { if (dragCounter === 0) {
if (overlay) { if (overlay) {
@@ -42,7 +42,7 @@ function setupFileInput(chooser) {
} }
}; };
const dropListener = function(e) { const dropListener = function (e) {
e.preventDefault(); e.preventDefault();
const dt = e.dataTransfer; const dt = e.dataTransfer;
const files = dt.files; const files = dt.files;
@@ -52,7 +52,7 @@ function setupFileInput(chooser) {
} }
const dataTransfer = new DataTransfer(); const dataTransfer = new DataTransfer();
allFiles.forEach(file => dataTransfer.items.add(file)); allFiles.forEach((file) => dataTransfer.items.add(file));
const fileInput = document.getElementById(elementId); const fileInput = document.getElementById(elementId);
fileInput.files = dataTransfer.files; fileInput.files = dataTransfer.files;
@@ -64,10 +64,10 @@ function setupFileInput(chooser) {
dragCounter = 0; dragCounter = 0;
fileInput.dispatchEvent(new Event('change', { bubbles: true })); fileInput.dispatchEvent(new Event("change", { bubbles: true }));
}; };
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { ["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => {
document.body.addEventListener(eventName, preventDefaults, false); document.body.addEventListener(eventName, preventDefaults, false);
}); });
@@ -76,27 +76,30 @@ function setupFileInput(chooser) {
e.stopPropagation(); e.stopPropagation();
} }
document.body.addEventListener('dragenter', dragenterListener); document.body.addEventListener("dragenter", dragenterListener);
document.body.addEventListener('dragleave', dragleaveListener); document.body.addEventListener("dragleave", dragleaveListener);
document.body.addEventListener('drop', dropListener); document.body.addEventListener("drop", dropListener);
$("#" + elementId).on("change", function(e) { $("#" + elementId).on("change", function (e) {
allFiles = Array.from(e.target.files); allFiles = Array.from(e.target.files);
handleFileInputChange(this); handleFileInputChange(this);
}); });
function handleFileInputChange(inputElement) { function handleFileInputChange(inputElement) {
const files = allFiles; const files = allFiles;
const fileNames = files.map(f => f.name); const fileNames = files.map((f) => f.name);
const selectedFilesContainer = $(inputElement).siblings(".selected-files"); const selectedFilesContainer = $(inputElement).siblings(".selected-files");
selectedFilesContainer.empty(); selectedFilesContainer.empty();
fileNames.forEach(fileName => { fileNames.forEach((fileName) => {
selectedFilesContainer.append("<div>" + fileName + "</div>"); selectedFilesContainer.append("<div>" + fileName + "</div>");
}); });
if (fileNames.length === 1) { if (fileNames.length === 1) {
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames[0]); $(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames[0]);
} else if (fileNames.length > 1) { } else if (fileNames.length > 1) {
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames.length + " " + filesSelected); $(inputElement)
.siblings(".custom-file-label")
.addClass("selected")
.html(fileNames.length + " " + filesSelected);
} else { } else {
$(inputElement).siblings(".custom-file-label").addClass("selected").html(pdfPrompt); $(inputElement).siblings(".custom-file-label").addClass("selected").html(pdfPrompt);
} }

View File

@@ -1,20 +1,20 @@
function initializeGame() { function initializeGame() {
const gameContainer = document.getElementById('game-container'); const gameContainer = document.getElementById("game-container");
const player = document.getElementById('player'); const player = document.getElementById("player");
let playerSize = gameContainer.clientWidth * 0.0625; // 5% of container width let playerSize = gameContainer.clientWidth * 0.0625; // 5% of container width
player.style.width = playerSize + 'px'; player.style.width = playerSize + "px";
player.style.height = playerSize + 'px'; player.style.height = playerSize + "px";
let playerX = gameContainer.clientWidth / 2 - playerSize / 2; let playerX = gameContainer.clientWidth / 2 - playerSize / 2;
let playerY = gameContainer.clientHeight * 0.1; let playerY = gameContainer.clientHeight * 0.1;
const scoreElement = document.getElementById('score'); const scoreElement = document.getElementById("score");
const levelElement = document.getElementById('level'); const levelElement = document.getElementById("level");
const livesElement = document.getElementById('lives'); const livesElement = document.getElementById("lives");
const highScoreElement = document.getElementById('high-score'); const highScoreElement = document.getElementById("high-score");
let pdfSize = gameContainer.clientWidth * 0.0625; // 5% of container width let pdfSize = gameContainer.clientWidth * 0.0625; // 5% of container width
let projectileWidth = gameContainer.clientWidth * 0.00625;// 0.00625; // 0.5% of container width let projectileWidth = gameContainer.clientWidth * 0.00625; // 0.00625; // 0.5% of container width
let projectileHeight = gameContainer.clientHeight * 0.01667; // 1% of container height let projectileHeight = gameContainer.clientHeight * 0.01667; // 1% of container height
let paused = false; let paused = false;
@@ -23,28 +23,36 @@ function initializeGame() {
let lastProjectileTime = 0; let lastProjectileTime = 0;
let lives = 3; let lives = 3;
let highScore = localStorage.getItem("highScore") ? parseInt(localStorage.getItem("highScore")) : 0;
let highScore = localStorage.getItem('highScore') ? parseInt(localStorage.getItem('highScore')) : 0;
updateHighScore(); updateHighScore();
const PLAYER_MOVE_SPEED = 5;
const BASE_PDF_SPEED = 1;
const LEVEL_INCREASE_PDF_SPEED = 0.2;
const BASE_SPAWN_INTERVAL_MS = 1250; // milliseconds before a new enemy spawns
const LEVEL_INCREASE_FACTOR_MS = 25; // milliseconds to decrease the spawn interval per level
const MAX_SPAWN_RATE_REDUCTION_MS = 800; // Max milliseconds from the base spawn interval
const keysPressed = {}; let keysPressed = {};
const pdfs = []; const pdfs = [];
const projectiles = []; const projectiles = [];
let score = 0; let score = 0;
let level = 1; let level = 1;
let pdfSpeed = 0.5; let pdfSpeed = BASE_PDF_SPEED;
let gameOver = false; let gameOver = false;
function handleKeys() { function handleKeys() {
if (keysPressed['ArrowLeft']) { if (keysPressed["ArrowLeft"]) {
playerX -= 10; playerX -= PLAYER_MOVE_SPEED;
playerX = Math.max(0, playerX)
} }
if (keysPressed['ArrowRight']) { if (keysPressed["ArrowRight"]) {
playerX += 10; playerX += PLAYER_MOVE_SPEED;
playerX = Math.min(gameContainer.clientWidth - playerSize, playerX);
} }
if (keysPressed[' '] && !gameOver) { if (keysPressed[" "] && !gameOver) {
const currentTime = new Date().getTime(); const currentTime = new Date().getTime();
if (currentTime - lastProjectileTime >= fireRate) { if (currentTime - lastProjectileTime >= fireRate) {
shootProjectile(); shootProjectile();
@@ -54,72 +62,68 @@ function initializeGame() {
updatePlayerPosition(); updatePlayerPosition();
} }
function onKeydown(event) {
if (event.key === " ") {
document.addEventListener('keydown', (event) => {
if (event.key === ' ') {
event.preventDefault(); event.preventDefault();
} }
keysPressed[event.key] = true; keysPressed[event.key] = true;
handleKeys(); handleKeys();
}); }
function onKeyUp(event) {
document.addEventListener('keyup', (event) => {
keysPressed[event.key] = false; keysPressed[event.key] = false;
}); }
document.removeEventListener("keydown", onKeydown);
document.removeEventListener("keyup", onKeyUp);
document.addEventListener("keydown", onKeydown);
document.addEventListener("keyup", onKeyUp);
function updatePlayerPosition() { function updatePlayerPosition() {
player.style.left = playerX + 'px'; player.style.left = playerX + "px";
player.style.bottom = playerY + 'px'; player.style.bottom = playerY + "px";
} }
function updateLives() { function updateLives() {
livesElement.textContent = 'Lives: ' + lives; livesElement.textContent = "Lives: " + lives;
} }
function updateHighScore() { function updateHighScore() {
highScoreElement.textContent = 'High Score: ' + highScore; highScoreElement.textContent = "High Score: " + highScore;
} }
function shootProjectile() { function shootProjectile() {
const projectile = document.createElement('div'); const projectile = document.createElement("div");
projectile.classList.add('projectile'); projectile.classList.add("projectile");
projectile.style.backgroundColor = 'black'; projectile.style.backgroundColor = "black";
projectile.style.width = projectileWidth + 'px'; projectile.style.width = projectileWidth + "px";
projectile.style.height = projectileHeight + 'px'; projectile.style.height = projectileHeight + "px";
projectile.style.left = (playerX + playerSize / 2 - projectileWidth / 2) + 'px'; projectile.style.left = playerX + playerSize / 2 - projectileWidth / 2 + "px";
projectile.style.top = (gameContainer.clientHeight - playerY - playerSize) + 'px'; projectile.style.top = gameContainer.clientHeight - playerY - playerSize + "px";
gameContainer.appendChild(projectile); gameContainer.appendChild(projectile);
projectiles.push(projectile); projectiles.push(projectile);
} }
function spawnPdf() { function spawnPdf() {
const pdf = document.createElement('img'); const pdf = document.createElement("img");
pdf.src = 'images/file-earmark-pdf.svg'; pdf.src = "images/file-earmark-pdf.svg";
pdf.classList.add('pdf'); pdf.classList.add("pdf");
pdf.style.width = pdfSize + 'px'; pdf.style.width = pdfSize + "px";
pdf.style.height = pdfSize + 'px'; pdf.style.height = pdfSize + "px";
pdf.style.left = Math.floor(Math.random() * (gameContainer.clientWidth - pdfSize)) + 'px'; pdf.style.left = Math.floor(Math.random() * (gameContainer.clientWidth - (2*pdfSize))) + pdfSize + "px";
pdf.style.top = '0px'; pdf.style.top = "0px";
gameContainer.appendChild(pdf); gameContainer.appendChild(pdf);
pdfs.push(pdf); pdfs.push(pdf);
} }
function resetEnemies() { function resetEnemies() {
pdfs.forEach((pdf) => gameContainer.removeChild(pdf)); pdfs.forEach((pdf) => gameContainer.removeChild(pdf));
pdfs.length = 0; pdfs.length = 0;
} }
function updateGame() { function updateGame() {
if (gameOver || paused) return; if (gameOver || paused) return;
handleKeys();
for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) { for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) {
const pdf = pdfs[pdfIndex]; const pdf = pdfs[pdfIndex];
const pdfY = parseFloat(pdf.style.top) + pdfSpeed; const pdfY = parseFloat(pdf.style.top) + pdfSpeed;
@@ -138,9 +142,8 @@ function initializeGame() {
endGame(); endGame();
return; return;
} }
} else { } else {
pdf.style.top = pdfY + 'px'; pdf.style.top = pdfY + "px";
// Check for collision with player // Check for collision with player
if (collisionDetected(player, pdf)) { if (collisionDetected(player, pdf)) {
@@ -153,7 +156,7 @@ function initializeGame() {
} }
} }
} }
}; }
projectiles.forEach((projectile, projectileIndex) => { projectiles.forEach((projectile, projectileIndex) => {
const projectileY = parseInt(projectile.style.top) - 10; const projectileY = parseInt(projectile.style.top) - 10;
@@ -161,7 +164,7 @@ function initializeGame() {
gameContainer.removeChild(projectile); gameContainer.removeChild(projectile);
projectiles.splice(projectileIndex, 1); projectiles.splice(projectileIndex, 1);
} else { } else {
projectile.style.top = projectileY + 'px'; projectile.style.top = projectileY + "px";
} }
for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) { for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) {
@@ -200,70 +203,53 @@ function initializeGame() {
updateScore(); updateScore();
updateLives(); updateLives();
levelElement.textContent = 'Level: ' + level; levelElement.textContent = "Level: " + level;
pdfSpeed = 1; pdfSpeed = BASE_PDF_SPEED;
clearTimeout(spawnPdfTimeout); // Clear the existing spawnPdfTimeout clearTimeout(spawnPdfTimeout); // Clear the existing spawnPdfTimeout
setTimeout(updateGame, 1000 / 60); setTimeout(updateGame, 1000 / 60);
spawnPdfInterval(); spawnPdfInterval();
} }
function updateScore() { function updateScore() {
scoreElement.textContent = 'Score: ' + score; scoreElement.textContent = "Score: " + score;
checkLevelUp(); checkLevelUp();
} }
function checkLevelUp() { function checkLevelUp() {
const newLevel = Math.floor(score / 100) + 1; const newLevel = Math.floor(score / 100) + 1;
if (newLevel > level) { if (newLevel > level) {
level = newLevel; level = newLevel;
levelElement.textContent = 'Level: ' + level; levelElement.textContent = "Level: " + level;
pdfSpeed += 0.2; pdfSpeed += LEVEL_INCREASE_PDF_SPEED;
} }
} }
function collisionDetected(a, b) { function collisionDetected(a, b) {
const rectA = a.getBoundingClientRect(); const rectA = a.getBoundingClientRect();
const rectB = b.getBoundingClientRect(); const rectB = b.getBoundingClientRect();
return ( return rectA.left < rectB.right && rectA.right > rectB.left && rectA.top < rectB.bottom && rectA.bottom > rectB.top;
rectA.left < rectB.right &&
rectA.right > rectB.left &&
rectA.top < rectB.bottom &&
rectA.bottom > rectB.top
);
} }
function endGame() { function endGame() {
gameOver = true; gameOver = true;
if (score > highScore) { if (score > highScore) {
highScore = score; highScore = score;
localStorage.setItem('highScore', highScore); localStorage.setItem("highScore", highScore);
updateHighScore(); updateHighScore();
} }
alert('Game Over! Your final score is: ' + score); alert("Game Over! Your final score is: " + score);
document.getElementById('game-container-wrapper').close(); document.getElementById("game-container-wrapper").close();
} }
let spawnPdfTimeout; let spawnPdfTimeout;
const BASE_SPAWN_INTERVAL_MS = 1250; // milliseconds before a new enemy spawns
const LEVEL_INCREASE_FACTOR_MS = 0; // milliseconds to decrease the spawn interval per level
const MAX_SPAWN_RATE_REDUCTION_MS = 800; // Max milliseconds from the base spawn interval
function spawnPdfInterval() { function spawnPdfInterval() {
console.log("spawnPdfInterval");
if (gameOver || paused) { if (gameOver || paused) {
console.log("spawnPdfInterval 2");
clearTimeout(spawnPdfTimeout); clearTimeout(spawnPdfTimeout);
return; return;
} }
console.log("spawnPdfInterval 3");
spawnPdf(); spawnPdf();
let spawnRateReduction = Math.min(level * LEVEL_INCREASE_FACTOR_MS, MAX_SPAWN_RATE_REDUCTION_MS); let spawnRateReduction = Math.min(level * LEVEL_INCREASE_FACTOR_MS, MAX_SPAWN_RATE_REDUCTION_MS);
let spawnRate = BASE_SPAWN_INTERVAL_MS - spawnRateReduction; let spawnRate = BASE_SPAWN_INTERVAL_MS - spawnRateReduction;
@@ -274,8 +260,7 @@ function initializeGame() {
updateGame(); updateGame();
spawnPdfInterval(); spawnPdfInterval();
document.addEventListener("visibilitychange", function () {
document.addEventListener('visibilitychange', function() {
if (document.hidden) { if (document.hidden) {
paused = true; paused = true;
} else { } else {
@@ -283,7 +268,6 @@ function initializeGame() {
updateGame(); updateGame();
spawnPdfInterval(); spawnPdfInterval();
} }
}); });
window.resetGame = resetGame; window.resetGame = resetGame;

View File

@@ -1,6 +1,6 @@
function compareVersions(version1, version2) { function compareVersions(version1, version2) {
const v1 = version1.split('.'); const v1 = version1.split(".");
const v2 = version2.split('.'); const v2 = version2.split(".");
for (let i = 0; i < v1.length || i < v2.length; i++) { for (let i = 0; i < v1.length || i < v2.length; i++) {
const n1 = parseInt(v1[i]) || 0; const n1 = parseInt(v1[i]) || 0;
@@ -16,7 +16,6 @@ function compareVersions(version1, version2) {
return 0; return 0;
} }
async function getLatestReleaseVersion() { async function getLatestReleaseVersion() {
const url = "https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest"; const url = "https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest";
try { try {
@@ -36,20 +35,18 @@ async function checkForUpdate() {
updateBtn.style.display = "none"; updateBtn.style.display = "none";
} }
const latestVersion = await getLatestReleaseVersion(); const latestVersion = await getLatestReleaseVersion();
console.log("latestVersion=" + latestVersion) console.log("latestVersion=" + latestVersion);
console.log("currentVersion=" + currentVersion) console.log("currentVersion=" + currentVersion);
console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)) console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion));
if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) { if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
document.getElementById("update-btn").style.display = "block"; document.getElementById("update-btn").style.display = "block";
console.log("visible") console.log("visible");
} else { } else {
console.log("hidden") console.log("hidden");
} }
} }
document.addEventListener("DOMContentLoaded", (event) => {
document.addEventListener('DOMContentLoaded', (event) => {
checkForUpdate(); checkForUpdate();
}); });

View File

@@ -1,18 +1,18 @@
function filterCards() { function filterCards() {
var input = document.getElementById('searchBar'); var input = document.getElementById("searchBar");
var filter = input.value.toUpperCase(); var filter = input.value.toUpperCase();
var cards = document.querySelectorAll('.feature-card'); var cards = document.querySelectorAll(".feature-card");
for (var i = 0; i < cards.length; i++) { for (var i = 0; i < cards.length; i++) {
var card = cards[i]; var card = cards[i];
var title = card.querySelector('h5.card-title').innerText; var title = card.querySelector("h5.card-title").innerText;
var text = card.querySelector('p.card-text').innerText; var text = card.querySelector("p.card-text").innerText;
// Get the navbar tags associated with the card // Get the navbar tags associated with the card
var navbarItem = document.querySelector(`a.dropdown-item[href="${card.id}"]`); var navbarItem = document.querySelector(`a.dropdown-item[href="${card.id}"]`);
var navbarTags = navbarItem ? navbarItem.getAttribute('data-bs-tags') : ''; var navbarTags = navbarItem ? navbarItem.getAttribute("data-bs-tags") : "";
var content = title + ' ' + text + ' ' + navbarTags; var content = title + " " + text + " " + navbarTags;
if (content.toUpperCase().indexOf(filter) > -1) { if (content.toUpperCase().indexOf(filter) > -1) {
card.style.display = ""; card.style.display = "";
@@ -22,19 +22,17 @@ function filterCards() {
} }
} }
function toggleFavorite(element) { function toggleFavorite(element) {
var img = element.querySelector('img'); var img = element.querySelector("img");
var card = element.closest('.feature-card'); var card = element.closest(".feature-card");
var cardId = card.id; var cardId = card.id;
if (img.src.endsWith('star.svg')) { if (img.src.endsWith("star.svg")) {
img.src = 'images/star-fill.svg'; img.src = "images/star-fill.svg";
card.classList.add('favorite'); card.classList.add("favorite");
localStorage.setItem(cardId, 'favorite'); localStorage.setItem(cardId, "favorite");
} else { } else {
img.src = 'images/star.svg'; img.src = "images/star.svg";
card.classList.remove('favorite'); card.classList.remove("favorite");
localStorage.removeItem(cardId); localStorage.removeItem(cardId);
} }
reorderCards(); reorderCards();
@@ -43,11 +41,11 @@ function toggleFavorite(element) {
} }
function reorderCards() { function reorderCards() {
var container = document.querySelector('.features-container'); var container = document.querySelector(".features-container");
var cards = Array.from(container.getElementsByClassName('feature-card')); var cards = Array.from(container.getElementsByClassName("feature-card"));
cards.sort(function(a, b) { cards.sort(function (a, b) {
var aIsFavorite = localStorage.getItem(a.id) === 'favorite'; var aIsFavorite = localStorage.getItem(a.id) === "favorite";
var bIsFavorite = localStorage.getItem(b.id) === 'favorite'; var bIsFavorite = localStorage.getItem(b.id) === "favorite";
if (aIsFavorite && !bIsFavorite) { if (aIsFavorite && !bIsFavorite) {
return -1; return -1;
} }
@@ -56,18 +54,18 @@ function reorderCards() {
} }
return 0; return 0;
}); });
cards.forEach(function(card) { cards.forEach(function (card) {
container.appendChild(card); container.appendChild(card);
}); });
} }
function initializeCards() { function initializeCards() {
var cards = document.querySelectorAll('.feature-card'); var cards = document.querySelectorAll(".feature-card");
cards.forEach(function(card) { cards.forEach(function (card) {
var cardId = card.id; var cardId = card.id;
var img = card.querySelector('.favorite-icon img'); var img = card.querySelector(".favorite-icon img");
if (localStorage.getItem(cardId) === 'favorite') { if (localStorage.getItem(cardId) === "favorite") {
img.src = 'images/star-fill.svg'; img.src = "images/star-fill.svg";
card.classList.add('favorite'); card.classList.add("favorite");
} }
}); });
reorderCards(); reorderCards();

View File

@@ -1,44 +1,42 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener("DOMContentLoaded", function () {
setLanguageForDropdown('.lang_dropdown-item'); setLanguageForDropdown(".lang_dropdown-item");
// Detect the browser's preferred language // Detect the browser's preferred language
let browserLang = navigator.language || navigator.userLanguage; let browserLang = navigator.language || navigator.userLanguage;
// Convert to a format consistent with your language codes (e.g., en-GB, fr-FR) // Convert to a format consistent with your language codes (e.g., en-GB, fr-FR)
browserLang = browserLang.replace('-', '_'); browserLang = browserLang.replace("-", "_");
// Check if the dropdown contains the browser's language // Check if the dropdown contains the browser's language
const dropdownLangExists = document.querySelector(`.lang_dropdown-item[data-language-code="${browserLang}"]`); const dropdownLangExists = document.querySelector(`.lang_dropdown-item[data-language-code="${browserLang}"]`);
// Set the default language to browser's language or 'en_GB' if not found in the dropdown // Set the default language to browser's language or 'en_GB' if not found in the dropdown
const defaultLocale = dropdownLangExists ? browserLang : 'en_GB'; const defaultLocale = dropdownLangExists ? browserLang : "en_GB";
const storedLocale = localStorage.getItem('languageCode') || defaultLocale; const storedLocale = localStorage.getItem("languageCode") || defaultLocale;
const dropdownItems = document.querySelectorAll(".lang_dropdown-item");
const dropdownItems = document.querySelectorAll('.lang_dropdown-item');
for (let i = 0; i < dropdownItems.length; i++) { for (let i = 0; i < dropdownItems.length; i++) {
const item = dropdownItems[i]; const item = dropdownItems[i];
item.classList.remove('active'); item.classList.remove("active");
if (item.dataset.languageCode === storedLocale) { if (item.dataset.languageCode === storedLocale) {
item.classList.add('active'); item.classList.add("active");
} }
item.addEventListener('click', handleDropdownItemClick); item.addEventListener("click", handleDropdownItemClick);
} }
}); });
function setLanguageForDropdown(dropdownClass) { function setLanguageForDropdown(dropdownClass) {
const defaultLocale = document.documentElement.lang || 'en_GB'; const defaultLocale = document.documentElement.language || "en_GB";
const storedLocale = localStorage.getItem('languageCode') || defaultLocale; const storedLocale = localStorage.getItem("languageCode") || defaultLocale;
const dropdownItems = document.querySelectorAll(dropdownClass); const dropdownItems = document.querySelectorAll(dropdownClass);
for (let i = 0; i < dropdownItems.length; i++) { for (let i = 0; i < dropdownItems.length; i++) {
const item = dropdownItems[i]; const item = dropdownItems[i];
item.classList.remove('active'); item.classList.remove("active");
if (item.dataset.languageCode === storedLocale) { if (item.dataset.languageCode === storedLocale) {
item.classList.add('active'); item.classList.add("active");
} }
item.addEventListener('click', handleDropdownItemClick); item.addEventListener("click", handleDropdownItemClick);
} }
} }
@@ -46,25 +44,32 @@ function handleDropdownItemClick(event) {
event.preventDefault(); event.preventDefault();
const languageCode = event.currentTarget.dataset.bsLanguageCode; // change this to event.currentTarget const languageCode = event.currentTarget.dataset.bsLanguageCode; // change this to event.currentTarget
if (languageCode) { if (languageCode) {
localStorage.setItem('languageCode', languageCode); localStorage.setItem("languageCode", languageCode);
const currentUrl = window.location.href; const currentUrl = window.location.href;
if (currentUrl.indexOf('?lang=') === -1) { if (currentUrl.indexOf("?lang=") === -1) {
window.location.href = currentUrl + '?lang=' + languageCode; window.location.href = currentUrl + "?lang=" + languageCode;
} else { } else {
window.location.href = currentUrl.replace(/\?lang=\w{2,}/, '?lang=' + languageCode); window.location.href = currentUrl.replace(/\?lang=\w{2,}/, "?lang=" + languageCode);
} }
} else { } else {
console.error("Language code is not set for this item."); // for debugging console.error("Language code is not set for this item."); // for debugging
} }
} }
document.addEventListener("DOMContentLoaded", function () {
document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll(".nav-item.dropdown").forEach((element) => {
document.querySelectorAll('.nav-item.dropdown').forEach((element) => {
const dropdownMenu = element.querySelector(".dropdown-menu"); const dropdownMenu = element.querySelector(".dropdown-menu");
if (dropdownMenu.id !== 'favoritesDropdown' && dropdownMenu.children.length <= 2 && dropdownMenu.querySelectorAll("hr.dropdown-divider").length === dropdownMenu.children.length) { if (
if (element.previousElementSibling && element.previousElementSibling.classList.contains('nav-item') && element.previousElementSibling.classList.contains('nav-item-separator')) { dropdownMenu.id !== "favoritesDropdown" &&
dropdownMenu.children.length <= 2 &&
dropdownMenu.querySelectorAll("hr.dropdown-divider").length === dropdownMenu.children.length
) {
if (
element.previousElementSibling &&
element.previousElementSibling.classList.contains("nav-item") &&
element.previousElementSibling.classList.contains("nav-item-separator")
) {
element.previousElementSibling.remove(); element.previousElementSibling.remove();
} }
element.remove(); element.remove();
@@ -72,9 +77,12 @@ document.addEventListener('DOMContentLoaded', function() {
}); });
//Sort languages by alphabet //Sort languages by alphabet
const list = Array.from(document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').children).filter(child => child.matches('a')); const list = Array.from(document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').children).filter(
list.sort(function(a, b) { (child) => child.matches("a"),
);
list
.sort(function (a, b) {
return a.textContent.toUpperCase().localeCompare(b.textContent.toUpperCase()); return a.textContent.toUpperCase().localeCompare(b.textContent.toUpperCase());
}).forEach(node => document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').appendChild(node)); })
.forEach((node) => document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').appendChild(node));
}); });

View File

@@ -10,21 +10,21 @@ async function downloadFilesWithCallback(processFileCallback) {
jszip = new JSZip(); jszip = new JSZip();
} }
const promises = Array.from(files).map(async file => { const promises = Array.from(files).map(async (file) => {
const { processedData, fileName } = await processFileCallback(file); const { processedData, fileName } = await processFileCallback(file);
if (zipFiles) { if (zipFiles) {
jszip.file(fileName, processedData); jszip.file(fileName, processedData);
} else { } else {
const url = URL.createObjectURL(processedData); const url = URL.createObjectURL(processedData);
const downloadOption = localStorage.getItem('downloadOption'); const downloadOption = localStorage.getItem("downloadOption");
if (downloadOption === 'sameWindow') { if (downloadOption === "sameWindow") {
window.location.href = url; window.location.href = url;
} else if (downloadOption === 'newWindow') { } else if (downloadOption === "newWindow") {
window.open(url, '_blank'); window.open(url, "_blank");
} else { } else {
const downloadLink = document.createElement('a'); const downloadLink = document.createElement("a");
downloadLink.href = url; downloadLink.href = url;
downloadLink.download = fileName; downloadLink.download = fileName;
downloadLink.click(); downloadLink.click();
@@ -37,7 +37,7 @@ async function downloadFilesWithCallback(processFileCallback) {
if (zipFiles) { if (zipFiles) {
const content = await jszip.generateAsync({ type: "blob" }); const content = await jszip.generateAsync({ type: "blob" });
const url = URL.createObjectURL(content); const url = URL.createObjectURL(content);
const a = document.createElement('a'); const a = document.createElement("a");
a.href = url; a.href = url;
a.download = "files.zip"; a.download = "files.zip";
document.body.appendChild(a); document.body.appendChild(a);

View File

@@ -1,9 +1,9 @@
let currentSort = { let currentSort = {
field: null, field: null,
descending: false descending: false,
}; };
document.getElementById("fileInput-input").addEventListener("change", function() { document.getElementById("fileInput-input").addEventListener("change", function () {
var files = this.files; var files = this.files;
displayFiles(files); displayFiles(files);
}); });
@@ -40,7 +40,7 @@ function displayFiles(files) {
function attachMoveButtons() { function attachMoveButtons() {
var moveUpButtons = document.querySelectorAll(".move-up"); var moveUpButtons = document.querySelectorAll(".move-up");
for (var i = 0; i < moveUpButtons.length; i++) { for (var i = 0; i < moveUpButtons.length; i++) {
moveUpButtons[i].addEventListener("click", function(event) { moveUpButtons[i].addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
var parent = this.closest(".list-group-item"); var parent = this.closest(".list-group-item");
var grandParent = parent.parentNode; var grandParent = parent.parentNode;
@@ -53,7 +53,7 @@ function attachMoveButtons() {
var moveDownButtons = document.querySelectorAll(".move-down"); var moveDownButtons = document.querySelectorAll(".move-down");
for (var i = 0; i < moveDownButtons.length; i++) { for (var i = 0; i < moveDownButtons.length; i++) {
moveDownButtons[i].addEventListener("click", function(event) { moveDownButtons[i].addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
var parent = this.closest(".list-group-item"); var parent = this.closest(".list-group-item");
var grandParent = parent.parentNode; var grandParent = parent.parentNode;
@@ -75,7 +75,7 @@ function attachMoveButtons() {
} }
} }
document.getElementById("sortByNameBtn").addEventListener("click", function() { document.getElementById("sortByNameBtn").addEventListener("click", function () {
if (currentSort.field === "name" && !currentSort.descending) { if (currentSort.field === "name" && !currentSort.descending) {
currentSort.descending = true; currentSort.descending = true;
sortFiles((a, b) => b.name.localeCompare(a.name)); sortFiles((a, b) => b.name.localeCompare(a.name));
@@ -86,7 +86,7 @@ document.getElementById("sortByNameBtn").addEventListener("click", function() {
} }
}); });
document.getElementById("sortByDateBtn").addEventListener("click", function() { document.getElementById("sortByDateBtn").addEventListener("click", function () {
if (currentSort.field === "lastModified" && !currentSort.descending) { if (currentSort.field === "lastModified" && !currentSort.descending) {
currentSort.descending = true; currentSort.descending = true;
sortFiles((a, b) => b.lastModified - a.lastModified); sortFiles((a, b) => b.lastModified - a.lastModified);
@@ -106,7 +106,7 @@ function sortFiles(comparator) {
// Update the files property // Update the files property
const dataTransfer = new DataTransfer(); const dataTransfer = new DataTransfer();
sortedFilesArray.forEach(file => dataTransfer.items.add(file)); sortedFilesArray.forEach((file) => dataTransfer.items.add(file));
document.getElementById("fileInput-input").files = dataTransfer.files; document.getElementById("fileInput-input").files = dataTransfer.files;
} }

View File

@@ -15,21 +15,21 @@ class DragDropManager {
this.wrapper = document.getElementById(wrapperId); this.wrapper = document.getElementById(wrapperId);
this.pageDragging = false; this.pageDragging = false;
this.hoveredEl = undefined; this.hoveredEl = undefined;
this.draggelEl = undefined this.draggelEl = undefined;
this.draggedImageEl = undefined; this.draggedImageEl = undefined;
var styleElement = document.createElement('link'); var styleElement = document.createElement("link");
styleElement.rel = 'stylesheet'; styleElement.rel = "stylesheet";
styleElement.href = 'css/dragdrop.css' styleElement.href = "css/dragdrop.css";
document.head.appendChild(styleElement); document.head.appendChild(styleElement);
const div = document.createElement('div'); const div = document.createElement("div");
div.classList.add('drag-manager_endpoint'); div.classList.add("drag-manager_endpoint");
div.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-arrow-down" viewBox="0 0 16 16"> div.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-arrow-down" viewBox="0 0 16 16">
<path d="M8.5 6.5a.5.5 0 0 0-1 0v3.793L6.354 9.146a.5.5 0 1 0-.708.708l2 2a.5.5 0 0 0 .708 0l2-2a.5.5 0 0 0-.708-.708L8.5 10.293V6.5z"/> <path d="M8.5 6.5a.5.5 0 0 0-1 0v3.793L6.354 9.146a.5.5 0 1 0-.708.708l2 2a.5.5 0 0 0 .708 0l2-2a.5.5 0 0 0-.708-.708L8.5 10.293V6.5z"/>
<path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/> <path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/>
</svg>` </svg>`;
this.endInsertionElement = div; this.endInsertionElement = div;
this.startDraggingPage = this.startDraggingPage.bind(this); this.startDraggingPage = this.startDraggingPage.bind(this);
@@ -39,53 +39,52 @@ class DragDropManager {
this.adapt(div); this.adapt(div);
} }
startDraggingPage(div,) { startDraggingPage(div) {
this.pageDragging = true; this.pageDragging = true;
this.draggedEl = div; this.draggedEl = div;
const img = div.querySelector('img'); const img = div.querySelector("img");
div.classList.add('drag-manager_dragging'); div.classList.add("drag-manager_dragging");
const imageSrc = img.src; const imageSrc = img.src;
const imgEl = document.createElement('img'); const imgEl = document.createElement("img");
imgEl.classList.add('dragged-img'); imgEl.classList.add("dragged-img");
imgEl.src = imageSrc; imgEl.src = imageSrc;
this.draggedImageEl = imgEl; this.draggedImageEl = imgEl;
imgEl.style.visibility = 'hidden'; imgEl.style.visibility = "hidden";
imgEl.style.transform = `rotate(${img.style.rotate === '' ? '0deg' : img.style.rotate}) translate(-50%, -50%)`; imgEl.style.transform = `rotate(${img.style.rotate === "" ? "0deg" : img.style.rotate}) translate(-50%, -50%)`;
this.dragContainer.appendChild(imgEl); this.dragContainer.appendChild(imgEl);
window.addEventListener('mouseup', this.stopDraggingPage) window.addEventListener("mouseup", this.stopDraggingPage);
window.addEventListener('mousemove', this.onDragEl) window.addEventListener("mousemove", this.onDragEl);
this.wrapper.classList.add('drag-manager_dragging-container'); this.wrapper.classList.add("drag-manager_dragging-container");
this.wrapper.appendChild(this.endInsertionElement); this.wrapper.appendChild(this.endInsertionElement);
} }
onDragEl(mouseEvent) { onDragEl(mouseEvent) {
const { clientX, clientY } = mouseEvent; const { clientX, clientY } = mouseEvent;
if(this.draggedImageEl) { if (this.draggedImageEl) {
this.draggedImageEl.style.visibility = 'visible'; this.draggedImageEl.style.visibility = "visible";
this.draggedImageEl.style.left = `${clientX}px`; this.draggedImageEl.style.left = `${clientX}px`;
this.draggedImageEl.style.top = `${clientY}px`; this.draggedImageEl.style.top = `${clientY}px`;
} }
} }
stopDraggingPage() { stopDraggingPage() {
window.removeEventListener('mousemove', this.onDragEl); window.removeEventListener("mousemove", this.onDragEl);
this.wrapper.classList.remove('drag-manager_dragging-container'); this.wrapper.classList.remove("drag-manager_dragging-container");
this.wrapper.removeChild(this.endInsertionElement); this.wrapper.removeChild(this.endInsertionElement);
window.removeEventListener('mouseup', this.stopDraggingPage) window.removeEventListener("mouseup", this.stopDraggingPage);
this.draggedImageEl = undefined; this.draggedImageEl = undefined;
this.pageDragging = false; this.pageDragging = false;
this.draggedEl.classList.remove('drag-manager_dragging'); this.draggedEl.classList.remove("drag-manager_dragging");
this.hoveredEl?.classList.remove('drag-manager_draghover'); this.hoveredEl?.classList.remove("drag-manager_draghover");
this.dragContainer.childNodes.forEach((dragChild) => { this.dragContainer.childNodes.forEach((dragChild) => {
this.dragContainer.removeChild(dragChild); this.dragContainer.removeChild(dragChild);
}) });
if(!this.hoveredEl) { if (!this.hoveredEl) {
return; return;
} }
if(this.hoveredEl === this.endInsertionElement) { if (this.hoveredEl === this.endInsertionElement) {
this.movePageTo(this.draggedEl); this.movePageTo(this.draggedEl);
return; return;
} }
@@ -96,27 +95,26 @@ class DragDropManager {
this.movePageTo = movePageTo; this.movePageTo = movePageTo;
} }
adapt(div) { adapt(div) {
const onDragStart = () => { const onDragStart = () => {
this.startDraggingPage(div); this.startDraggingPage(div);
} };
const onMouseEnter = () => { const onMouseEnter = () => {
if (this.pageDragging) { if (this.pageDragging) {
this.hoveredEl = div; this.hoveredEl = div;
div.classList.add('drag-manager_draghover'); div.classList.add("drag-manager_draghover");
}
} }
};
const onMouseLeave = () => { const onMouseLeave = () => {
this.hoveredEl = undefined this.hoveredEl = undefined;
div.classList.remove('drag-manager_draghover'); div.classList.remove("drag-manager_draghover");
} };
div.addEventListener('dragstart', onDragStart); div.addEventListener("dragstart", onDragStart);
div.addEventListener('mouseenter', onMouseEnter); div.addEventListener("mouseenter", onMouseEnter);
div.addEventListener('mouseleave', onMouseLeave); div.addEventListener("mouseleave", onMouseLeave);
return div; return div;
} }

View File

@@ -4,24 +4,24 @@ class ImageHiglighter {
this.imageHighlighter = document.getElementById(id); this.imageHighlighter = document.getElementById(id);
this.imageHighlightCallback = this.imageHighlightCallback.bind(this); this.imageHighlightCallback = this.imageHighlightCallback.bind(this);
var styleElement = document.createElement('link'); var styleElement = document.createElement("link");
styleElement.rel = 'stylesheet'; styleElement.rel = "stylesheet";
styleElement.href = 'css/imageHighlighter.css' styleElement.href = "css/imageHighlighter.css";
document.head.appendChild(styleElement); document.head.appendChild(styleElement);
this.imageHighlighter.onclick = () => { this.imageHighlighter.onclick = () => {
this.imageHighlighter.childNodes.forEach((child) => { this.imageHighlighter.childNodes.forEach((child) => {
child.classList.add('remove'); child.classList.add("remove");
setTimeout(() => { setTimeout(() => {
this.imageHighlighter.removeChild(child); this.imageHighlighter.removeChild(child);
}, 100) }, 100);
}) });
} };
} }
imageHighlightCallback(highlightEvent) { imageHighlightCallback(highlightEvent) {
var bigImg = document.createElement('img'); var bigImg = document.createElement("img");
bigImg.onclick = (imageClickEvent) => { bigImg.onclick = (imageClickEvent) => {
// This prevents the highlighter's onClick from closing the image when clicking // This prevents the highlighter's onClick from closing the image when clicking
// on the image instead of next to it. // on the image instead of next to it.
@@ -30,15 +30,15 @@ class ImageHiglighter {
}; };
bigImg.src = highlightEvent.target.src; bigImg.src = highlightEvent.target.src;
this.imageHighlighter.appendChild(bigImg); this.imageHighlighter.appendChild(bigImg);
}; }
setActions() { setActions() {
// not needed in this case // not needed in this case
} }
adapt(div) { adapt(div) {
const img = div.querySelector('.page-image'); const img = div.querySelector(".page-image");
img.addEventListener('click', this.imageHighlightCallback) img.addEventListener("click", this.imageHighlightCallback);
return div; return div;
} }
} }

View File

@@ -6,16 +6,16 @@ class PdfActionsManager {
this.pagesContainer = document.getElementById(id); this.pagesContainer = document.getElementById(id);
this.pageDirection = document.documentElement.getAttribute("lang-direction"); this.pageDirection = document.documentElement.getAttribute("lang-direction");
var styleElement = document.createElement('link'); var styleElement = document.createElement("link");
styleElement.rel = 'stylesheet'; styleElement.rel = "stylesheet";
styleElement.href = 'css/pdfActions.css' styleElement.href = "css/pdfActions.css";
document.head.appendChild(styleElement); document.head.appendChild(styleElement);
} }
getPageContainer(element) { getPageContainer(element) {
var container = element var container = element;
while (!container.classList.contains('page-container')) { while (!container.classList.contains("page-container")) {
container = container.parentNode; container = container.parentNode;
} }
return container; return container;
@@ -36,29 +36,29 @@ class PdfActionsManager {
if (sibling) { if (sibling) {
this.movePageTo(imgContainer, sibling.nextSibling, true); this.movePageTo(imgContainer, sibling.nextSibling, true);
} }
}; }
rotateCCWButtonCallback(e) { rotateCCWButtonCallback(e) {
var imgContainer = this.getPageContainer(e.target); var imgContainer = this.getPageContainer(e.target);
const img = imgContainer.querySelector("img"); const img = imgContainer.querySelector("img");
this.rotateElement(img, -90) this.rotateElement(img, -90);
}; }
rotateCWButtonCallback(e) { rotateCWButtonCallback(e) {
var imgContainer = this.getPageContainer(e.target); var imgContainer = this.getPageContainer(e.target);
const img = imgContainer.querySelector("img"); const img = imgContainer.querySelector("img");
this.rotateElement(img, 90) this.rotateElement(img, 90);
}; }
deletePageButtonCallback(e) { deletePageButtonCallback(e) {
var imgContainer = this.getPageContainer(e.target); var imgContainer = this.getPageContainer(e.target);
this.pagesContainer.removeChild(imgContainer); this.pagesContainer.removeChild(imgContainer);
if (this.pagesContainer.childElementCount === 0) { if (this.pagesContainer.childElementCount === 0) {
const filenameInput = document.getElementById('filename-input'); const filenameInput = document.getElementById("filename-input");
const filenameParagraph = document.getElementById('filename'); const filenameParagraph = document.getElementById("filename");
const downloadBtn = document.getElementById('export-button'); const downloadBtn = document.getElementById("export-button");
filenameInput.disabled = true; filenameInput.disabled = true;
filenameInput.value = ""; filenameInput.value = "";
@@ -66,12 +66,12 @@ class PdfActionsManager {
downloadBtn.disabled = true; downloadBtn.disabled = true;
} }
}; }
insertFileButtonCallback(e) { insertFileButtonCallback(e) {
var imgContainer = this.getPageContainer(e.target); var imgContainer = this.getPageContainer(e.target);
this.addPdfs(imgContainer) this.addPdfs(imgContainer);
}; }
setActions({ movePageTo, addPdfs, rotateElement }) { setActions({ movePageTo, addPdfs, rotateElement }) {
this.movePageTo = movePageTo; this.movePageTo = movePageTo;
@@ -87,26 +87,26 @@ class PdfActionsManager {
} }
adapt(div) { adapt(div) {
div.classList.add('pdf-actions_container'); div.classList.add("pdf-actions_container");
const leftDirection = this.pageDirection === 'rtl' ? 'right' : 'left' const leftDirection = this.pageDirection === "rtl" ? "right" : "left";
const rightDirection = this.pageDirection === 'rtl' ? 'left' : 'right' const rightDirection = this.pageDirection === "rtl" ? "left" : "right";
const buttonContainer = document.createElement('div'); const buttonContainer = document.createElement("div");
buttonContainer.classList.add("pdf-actions_button-container", "hide-on-drag"); buttonContainer.classList.add("pdf-actions_button-container", "hide-on-drag");
const moveUp = document.createElement('button'); const moveUp = document.createElement("button");
moveUp.classList.add("pdf-actions_move-left-button","btn", "btn-secondary"); moveUp.classList.add("pdf-actions_move-left-button", "btn", "btn-secondary");
moveUp.innerHTML = `<i class="bi bi-arrow-${leftDirection}-short"></i>`; moveUp.innerHTML = `<i class="bi bi-arrow-${leftDirection}-short"></i>`;
moveUp.onclick = this.moveUpButtonCallback; moveUp.onclick = this.moveUpButtonCallback;
buttonContainer.appendChild(moveUp); buttonContainer.appendChild(moveUp);
const moveDown = document.createElement('button'); const moveDown = document.createElement("button");
moveDown.classList.add("pdf-actions_move-right-button","btn", "btn-secondary"); moveDown.classList.add("pdf-actions_move-right-button", "btn", "btn-secondary");
moveDown.innerHTML = `<i class="bi bi-arrow-${rightDirection}-short"></i>`; moveDown.innerHTML = `<i class="bi bi-arrow-${rightDirection}-short"></i>`;
moveDown.onclick = this.moveDownButtonCallback; moveDown.onclick = this.moveDownButtonCallback;
buttonContainer.appendChild(moveDown); buttonContainer.appendChild(moveDown);
const rotateCCW = document.createElement('button'); const rotateCCW = document.createElement("button");
rotateCCW.classList.add("btn", "btn-secondary"); rotateCCW.classList.add("btn", "btn-secondary");
rotateCCW.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-counterclockwise" viewBox="0 0 16 16"> rotateCCW.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-counterclockwise" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z" /> <path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z" />
@@ -115,7 +115,7 @@ class PdfActionsManager {
rotateCCW.onclick = this.rotateCCWButtonCallback; rotateCCW.onclick = this.rotateCCWButtonCallback;
buttonContainer.appendChild(rotateCCW); buttonContainer.appendChild(rotateCCW);
const rotateCW = document.createElement('button'); const rotateCW = document.createElement("button");
rotateCW.classList.add("btn", "btn-secondary"); rotateCW.classList.add("btn", "btn-secondary");
rotateCW.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 16 16"> rotateCW.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z" /> <path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z" />
@@ -124,7 +124,7 @@ class PdfActionsManager {
rotateCW.onclick = this.rotateCWButtonCallback; rotateCW.onclick = this.rotateCWButtonCallback;
buttonContainer.appendChild(rotateCW); buttonContainer.appendChild(rotateCW);
const deletePage = document.createElement('button'); const deletePage = document.createElement("button");
deletePage.classList.add("btn", "btn-danger"); deletePage.classList.add("btn", "btn-danger");
deletePage.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash" viewBox="0 0 16 16"> deletePage.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash" viewBox="0 0 16 16">
<path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z"/> <path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5Zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6Z"/>
@@ -135,14 +135,15 @@ class PdfActionsManager {
div.appendChild(buttonContainer); div.appendChild(buttonContainer);
const insertFileButtonContainer = document.createElement('div'); const insertFileButtonContainer = document.createElement("div");
insertFileButtonContainer.classList.add( insertFileButtonContainer.classList.add(
"pdf-actions_insert-file-button-container", "pdf-actions_insert-file-button-container",
leftDirection, leftDirection,
`align-center-${leftDirection}`); `align-center-${leftDirection}`,
);
const insertFileButton = document.createElement('button'); const insertFileButton = document.createElement("button");
insertFileButton.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button"); insertFileButton.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button");
insertFileButton.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-plus" viewBox="0 0 16 16"> insertFileButton.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-plus" viewBox="0 0 16 16">
<path d="M8 6.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V11a.5.5 0 0 1-1 0V9.5H6a.5.5 0 0 1 0-1h1.5V7a.5.5 0 0 1 .5-.5z"/> <path d="M8 6.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V11a.5.5 0 0 1-1 0V9.5H6a.5.5 0 0 1 0-1h1.5V7a.5.5 0 0 1 .5-.5z"/>
@@ -154,13 +155,14 @@ class PdfActionsManager {
div.appendChild(insertFileButtonContainer); div.appendChild(insertFileButtonContainer);
// add this button to every element, but only show it on the last one :D // add this button to every element, but only show it on the last one :D
const insertFileButtonRightContainer = document.createElement('div'); const insertFileButtonRightContainer = document.createElement("div");
insertFileButtonRightContainer.classList.add( insertFileButtonRightContainer.classList.add(
"pdf-actions_insert-file-button-container", "pdf-actions_insert-file-button-container",
rightDirection, rightDirection,
`align-center-${rightDirection}`); `align-center-${rightDirection}`,
);
const insertFileButtonRight = document.createElement('button'); const insertFileButtonRight = document.createElement("button");
insertFileButtonRight.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button"); insertFileButtonRight.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button");
insertFileButtonRight.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-plus" viewBox="0 0 16 16"> insertFileButtonRight.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-plus" viewBox="0 0 16 16">
<path d="M8 6.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V11a.5.5 0 0 1-1 0V9.5H6a.5.5 0 0 1 0-1h1.5V7a.5.5 0 0 1 .5-.5z"/> <path d="M8 6.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V11a.5.5 0 0 1-1 0V9.5H6a.5.5 0 0 1 0-1h1.5V7a.5.5 0 0 1 .5-.5z"/>
@@ -172,20 +174,20 @@ class PdfActionsManager {
div.appendChild(insertFileButtonRightContainer); div.appendChild(insertFileButtonRightContainer);
const adaptPageNumber = (pageNumber, div) => { const adaptPageNumber = (pageNumber, div) => {
const pageNumberElement = document.createElement('span'); const pageNumberElement = document.createElement("span");
pageNumberElement.classList.add('page-number'); pageNumberElement.classList.add("page-number");
pageNumberElement.textContent = pageNumber; pageNumberElement.textContent = pageNumber;
div.insertBefore(pageNumberElement, div.firstChild); div.insertBefore(pageNumberElement, div.firstChild);
}; };
div.addEventListener('mouseenter', () => { div.addEventListener("mouseenter", () => {
const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1; const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1;
adaptPageNumber(pageNumber, div); adaptPageNumber(pageNumber, div);
}); });
div.addEventListener('mouseleave', () => { div.addEventListener("mouseleave", () => {
const pageNumberElement = div.querySelector('.page-number'); const pageNumberElement = div.querySelector(".page-number");
if (pageNumberElement) { if (pageNumberElement) {
div.removeChild(pageNumberElement); div.removeChild(pageNumberElement);
} }

View File

@@ -6,7 +6,7 @@ class PdfContainer {
downloadLink; downloadLink;
constructor(id, wrapperId, pdfAdapters) { constructor(id, wrapperId, pdfAdapters) {
this.pagesContainer = document.getElementById(id) this.pagesContainer = document.getElementById(id);
this.pagesContainerWrapper = document.getElementById(wrapperId); this.pagesContainerWrapper = document.getElementById(wrapperId);
this.downloadLink = null; this.downloadLink = null;
this.movePageTo = this.movePageTo.bind(this); this.movePageTo = this.movePageTo.bind(this);
@@ -21,21 +21,21 @@ class PdfContainer {
this.pdfAdapters = pdfAdapters; this.pdfAdapters = pdfAdapters;
this.pdfAdapters.forEach(adapter => { this.pdfAdapters.forEach((adapter) => {
adapter.setActions({ adapter.setActions({
movePageTo: this.movePageTo, movePageTo: this.movePageTo,
addPdfs: this.addPdfs, addPdfs: this.addPdfs,
rotateElement: this.rotateElement, rotateElement: this.rotateElement,
updateFilename: this.updateFilename updateFilename: this.updateFilename,
}) });
}) });
window.addPdfs = this.addPdfs; window.addPdfs = this.addPdfs;
window.exportPdf = this.exportPdf; window.exportPdf = this.exportPdf;
window.rotateAll = this.rotateAll; window.rotateAll = this.rotateAll;
const filenameInput = document.getElementById('filename-input'); const filenameInput = document.getElementById("filename-input");
const downloadBtn = document.getElementById('export-button'); const downloadBtn = document.getElementById("export-button");
filenameInput.onkeyup = this.updateFilename; filenameInput.onkeyup = this.updateFilename;
filenameInput.onkeydown = this.preventIllegalChars; filenameInput.onkeydown = this.preventIllegalChars;
@@ -49,46 +49,44 @@ class PdfContainer {
const startIndex = childArray.indexOf(startElement); const startIndex = childArray.indexOf(startElement);
const endIndex = childArray.indexOf(endElement); const endIndex = childArray.indexOf(endElement);
this.pagesContainer.removeChild(startElement); this.pagesContainer.removeChild(startElement);
if(!endElement) { if (!endElement) {
this.pagesContainer.append(startElement); this.pagesContainer.append(startElement);
} else { } else {
this.pagesContainer.insertBefore(startElement, endElement); this.pagesContainer.insertBefore(startElement, endElement);
} }
if(scrollTo) { if (scrollTo) {
const { width } = startElement.getBoundingClientRect(); const { width } = startElement.getBoundingClientRect();
const vector = (endIndex !== -1 && startIndex > endIndex) const vector = endIndex !== -1 && startIndex > endIndex ? 0 - width : width;
? 0-width
: width;
this.pagesContainerWrapper.scroll({ this.pagesContainerWrapper.scroll({
left: this.pagesContainerWrapper.scrollLeft + vector, left: this.pagesContainerWrapper.scrollLeft + vector,
}) });
} }
} }
addPdfs(nextSiblingElement) { addPdfs(nextSiblingElement) {
var input = document.createElement('input'); var input = document.createElement("input");
input.type = 'file'; input.type = "file";
input.multiple = true; input.multiple = true;
input.setAttribute("accept", "application/pdf"); input.setAttribute("accept", "application/pdf");
input.onchange = async(e) => { input.onchange = async (e) => {
const files = e.target.files; const files = e.target.files;
this.addPdfsFromFiles(files, nextSiblingElement); this.addPdfsFromFiles(files, nextSiblingElement);
this.updateFilename(files ? files[0].name : ""); this.updateFilename(files ? files[0].name : "");
} };
input.click(); input.click();
} }
async addPdfsFromFiles(files, nextSiblingElement) { async addPdfsFromFiles(files, nextSiblingElement) {
this.fileName = files[0].name; this.fileName = files[0].name;
for (var i=0; i < files.length; i++) { for (var i = 0; i < files.length; i++) {
await this.addPdfFile(files[i], nextSiblingElement); await this.addPdfFile(files[i], nextSiblingElement);
} }
document.querySelectorAll(".enable-on-file").forEach(element => { document.querySelectorAll(".enable-on-file").forEach((element) => {
element.disabled = false; element.disabled = false;
}); });
} }
@@ -98,7 +96,7 @@ class PdfContainer {
if (!lastTransform) { if (!lastTransform) {
lastTransform = "0"; lastTransform = "0";
} }
const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, '')); const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
const newAngle = lastAngle + deg; const newAngle = lastAngle + deg;
element.style.rotate = newAngle + "deg"; element.style.rotate = newAngle + "deg";
@@ -107,14 +105,14 @@ class PdfContainer {
async addPdfFile(file, nextSiblingElement) { async addPdfFile(file, nextSiblingElement) {
const { renderer, pdfDocument } = await this.loadFile(file); const { renderer, pdfDocument } = await this.loadFile(file);
for (var i=0; i < renderer.pageCount; i++) { for (var i = 0; i < renderer.pageCount; i++) {
const div = document.createElement('div'); const div = document.createElement("div");
div.classList.add("page-container"); div.classList.add("page-container");
var img = document.createElement('img'); var img = document.createElement("img");
img.classList.add('page-image') img.classList.add("page-image");
const imageSrc = await renderer.renderPage(i) const imageSrc = await renderer.renderPage(i);
img.src = imageSrc; img.src = imageSrc;
img.pageIdx = i; img.pageIdx = i;
img.rend = renderer; img.rend = renderer;
@@ -122,8 +120,8 @@ class PdfContainer {
div.appendChild(img); div.appendChild(img);
this.pdfAdapters.forEach((adapter) => { this.pdfAdapters.forEach((adapter) => {
adapter.adapt?.(div) adapter.adapt?.(div);
}) });
if (nextSiblingElement) { if (nextSiblingElement) {
this.pagesContainer.insertBefore(div, nextSiblingElement); this.pagesContainer.insertBefore(div, nextSiblingElement);
} else { } else {
@@ -140,13 +138,13 @@ class PdfContainer {
} }
async toRenderer(objectUrl) { async toRenderer(objectUrl) {
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js' pdfjsLib.GlobalWorkerOptions.workerSrc = "pdfjs/pdf.worker.js";
const pdf = await pdfjsLib.getDocument(objectUrl).promise; const pdf = await pdfjsLib.getDocument(objectUrl).promise;
return { return {
document: pdf, document: pdf,
pageCount: pdf.numPages, pageCount: pdf.numPages,
renderPage: async function(pageIdx) { renderPage: async function (pageIdx) {
const page = await this.document.getPage(pageIdx+1); const page = await this.document.getPage(pageIdx + 1);
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
@@ -162,104 +160,103 @@ class PdfContainer {
// render the page onto the canvas // render the page onto the canvas
var renderContext = { var renderContext = {
canvasContext: canvas.getContext("2d"), canvasContext: canvas.getContext("2d"),
viewport: page.getViewport({ scale: 1 }) viewport: page.getViewport({ scale: 1 }),
}; };
await page.render(renderContext).promise; await page.render(renderContext).promise;
return canvas.toDataURL(); return canvas.toDataURL();
} },
}; };
} }
async toPdfLib(objectUrl) { async toPdfLib(objectUrl) {
const existingPdfBytes = await fetch(objectUrl).then(res => res.arrayBuffer()); const existingPdfBytes = await fetch(objectUrl).then((res) => res.arrayBuffer());
const pdfDoc = await PDFLib.PDFDocument.load(existingPdfBytes, { ignoreEncryption: true }); const pdfDoc = await PDFLib.PDFDocument.load(existingPdfBytes, {
ignoreEncryption: true,
});
return pdfDoc; return pdfDoc;
} }
rotateAll(deg) { rotateAll(deg) {
for (var i=0; i<this.pagesContainer.childNodes.length; i++) { for (var i = 0; i < this.pagesContainer.childNodes.length; i++) {
const img = this.pagesContainer.childNodes[i].querySelector("img"); const img = this.pagesContainer.childNodes[i].querySelector("img");
if (!img) continue; if (!img) continue;
this.rotateElement(img, deg) this.rotateElement(img, deg);
} }
} }
async exportPdf() { async exportPdf() {
const pdfDoc = await PDFLib.PDFDocument.create(); const pdfDoc = await PDFLib.PDFDocument.create();
const pageContainers = this.pagesContainer.querySelectorAll('.page-container'); // Select all .page-container elements const pageContainers = this.pagesContainer.querySelectorAll(".page-container"); // Select all .page-container elements
for (var i = 0; i < pageContainers.length; i++) { for (var i = 0; i < pageContainers.length; i++) {
const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container const img = pageContainers[i].querySelector("img"); // Find the img element within each .page-container
if (!img) continue; if (!img) continue;
const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]) const pages = await pdfDoc.copyPages(img.doc, [img.pageIdx]);
const page = pages[0]; const page = pages[0];
const rotation = img.style.rotate; const rotation = img.style.rotate;
if (rotation) { if (rotation) {
const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, '')); const rotationAngle = parseInt(rotation.replace(/[^\d-]/g, ""));
page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle)) page.setRotation(PDFLib.degrees(page.getRotation().angle + rotationAngle));
} }
pdfDoc.addPage(page); pdfDoc.addPage(page);
} }
const pdfBytes = await pdfDoc.save(); const pdfBytes = await pdfDoc.save();
const pdfBlob = new Blob([pdfBytes], { type: 'application/pdf' }); const pdfBlob = new Blob([pdfBytes], { type: "application/pdf" });
const url = URL.createObjectURL(pdfBlob); const url = URL.createObjectURL(pdfBlob);
const downloadOption = localStorage.getItem('downloadOption'); const downloadOption = localStorage.getItem("downloadOption");
const filenameInput = document.getElementById('filename-input'); const filenameInput = document.getElementById("filename-input");
let inputArr = filenameInput.value.split('.'); let inputArr = filenameInput.value.split(".");
if (inputArr !== null && inputArr !== undefined && inputArr.length > 0) { if (inputArr !== null && inputArr !== undefined && inputArr.length > 0) {
inputArr = inputArr.filter((n) => n); // remove all empty strings, nulls or undefined
inputArr = inputArr.filter(n => n); // remove all empty strings, nulls or undefined
if (inputArr.length > 1) { if (inputArr.length > 1) {
inputArr.pop(); // remove right part after last dot inputArr.pop(); // remove right part after last dot
} }
filenameInput.value = inputArr.join(''); filenameInput.value = inputArr.join("");
this.fileName = filenameInput.value; this.fileName = filenameInput.value;
} }
if (!filenameInput.value.includes('.pdf')) { if (!filenameInput.value.includes(".pdf")) {
filenameInput.value = filenameInput.value + '.pdf'; filenameInput.value = filenameInput.value + ".pdf";
this.fileName = filenameInput.value; this.fileName = filenameInput.value;
} }
if (downloadOption === 'sameWindow') { if (downloadOption === "sameWindow") {
// Open the file in the same window // Open the file in the same window
window.location.href = url; window.location.href = url;
} else if (downloadOption === 'newWindow') { } else if (downloadOption === "newWindow") {
// Open the file in a new window // Open the file in a new window
window.open(url, '_blank'); window.open(url, "_blank");
} else { } else {
// Download the file // Download the file
this.downloadLink = document.createElement('a'); this.downloadLink = document.createElement("a");
this.downloadLink.id = 'download-link'; this.downloadLink.id = "download-link";
this.downloadLink.href = url; this.downloadLink.href = url;
// downloadLink.download = this.fileName ? this.fileName : 'managed.pdf'; // downloadLink.download = this.fileName ? this.fileName : 'managed.pdf';
// downloadLink.download = this.fileName; // downloadLink.download = this.fileName;
this.downloadLink.setAttribute('download', this.fileName ? this.fileName : 'managed.pdf'); this.downloadLink.setAttribute("download", this.fileName ? this.fileName : "managed.pdf");
this.downloadLink.setAttribute('target', '_blank'); this.downloadLink.setAttribute("target", "_blank");
this.downloadLink.onclick = this.setDownloadAttribute; this.downloadLink.onclick = this.setDownloadAttribute;
this.downloadLink.click(); this.downloadLink.click();
} }
} }
setDownloadAttribute() { setDownloadAttribute() {
this.downloadLink.setAttribute("download", this.fileName ? this.fileName : 'managed.pdf'); this.downloadLink.setAttribute("download", this.fileName ? this.fileName : "managed.pdf");
} }
updateFilename(fileName = "") { updateFilename(fileName = "") {
const filenameInput = document.getElementById('filename-input'); const filenameInput = document.getElementById("filename-input");
const pagesContainer = document.getElementById('pages-container'); const pagesContainer = document.getElementById("pages-container");
const downloadBtn = document.getElementById('export-button'); const downloadBtn = document.getElementById("export-button");
downloadBtn.disabled = pagesContainer.childElementCount === 0 downloadBtn.disabled = pagesContainer.childElementCount === 0;
if (!this.fileName) { if (!this.fileName) {
this.fileName = fileName; this.fileName = fileName;

View File

@@ -8,7 +8,7 @@ class FileDragManager {
this.setCallback(cb); this.setCallback(cb);
// Prevent default behavior for drag events // Prevent default behavior for drag events
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { ["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => {
document.body.addEventListener(eventName, preventDefaults, false); document.body.addEventListener(eventName, preventDefaults, false);
}); });
@@ -21,10 +21,10 @@ class FileDragManager {
this.dragleaveListener = this.dragleaveListener.bind(this); this.dragleaveListener = this.dragleaveListener.bind(this);
this.dropListener = this.dropListener.bind(this); this.dropListener = this.dropListener.bind(this);
document.body.addEventListener('dragenter', this.dragenterListener); document.body.addEventListener("dragenter", this.dragenterListener);
document.body.addEventListener('dragleave', this.dragleaveListener); document.body.addEventListener("dragleave", this.dragleaveListener);
// Add drop event listener // Add drop event listener
document.body.addEventListener('drop', this.dropListener); document.body.addEventListener("drop", this.dropListener);
} }
setActions({ updateFilename }) { setActions({ updateFilename }) {
@@ -43,23 +43,23 @@ class FileDragManager {
this.dragCounter++; this.dragCounter++;
if (!this.overlay) { if (!this.overlay) {
// Create and show the overlay // Create and show the overlay
this.overlay = document.createElement('div'); this.overlay = document.createElement("div");
this.overlay.style.position = 'fixed'; this.overlay.style.position = "fixed";
this.overlay.style.top = 0; this.overlay.style.top = 0;
this.overlay.style.left = 0; this.overlay.style.left = 0;
this.overlay.style.width = '100%'; this.overlay.style.width = "100%";
this.overlay.style.height = '100%'; this.overlay.style.height = "100%";
this.overlay.style.background = 'rgba(0, 0, 0, 0.5)'; this.overlay.style.background = "rgba(0, 0, 0, 0.5)";
this.overlay.style.color = '#fff'; this.overlay.style.color = "#fff";
this.overlay.style.zIndex = '1000'; this.overlay.style.zIndex = "1000";
this.overlay.style.display = 'flex'; this.overlay.style.display = "flex";
this.overlay.style.alignItems = 'center'; this.overlay.style.alignItems = "center";
this.overlay.style.justifyContent = 'center'; this.overlay.style.justifyContent = "center";
this.overlay.style.pointerEvents = 'none'; this.overlay.style.pointerEvents = "none";
this.overlay.innerHTML = '<p>Drop files anywhere to upload</p>'; this.overlay.innerHTML = "<p>Drop files anywhere to upload</p>";
document.getElementById('content-wrap').appendChild(this.overlay); document.getElementById("content-wrap").appendChild(this.overlay);
}
} }
};
dragleaveListener() { dragleaveListener() {
this.dragCounter--; this.dragCounter--;
@@ -70,16 +70,17 @@ class FileDragManager {
this.overlay = null; this.overlay = null;
} }
} }
}; }
dropListener(e) { dropListener(e) {
const dt = e.dataTransfer; const dt = e.dataTransfer;
const files = dt.files; const files = dt.files;
this.callback(files).catch((err) => { this.callback(files)
.catch((err) => {
console.error(err); console.error(err);
//maybe //maybe
}).finally(() => { })
.finally(() => {
// Hide and remove the overlay // Hide and remove the overlay
if (this.overlay) { if (this.overlay) {
this.overlay.remove(); this.overlay.remove();
@@ -88,7 +89,7 @@ class FileDragManager {
this.updateFilename(files ? files[0].name : ""); this.updateFilename(files ? files[0].name : "");
}); });
}; }
} }
export default FileDragManager; export default FileDragManager;

View File

@@ -1,7 +1,7 @@
const scrollDivHorizontally = (id) => { const scrollDivHorizontally = (id) => {
var scrollDelta = 0; // variable to store the accumulated scroll delta var scrollDelta = 0; // variable to store the accumulated scroll delta
var isScrolling = false; // variable to track if scroll is already in progress var isScrolling = false; // variable to track if scroll is already in progress
const divToScrollHorizontally = document.getElementById(id) const divToScrollHorizontally = document.getElementById(id);
function scrollLoop() { function scrollLoop() {
// Scroll the div horizontally by a fraction of the accumulated scroll delta // Scroll the div horizontally by a fraction of the accumulated scroll delta
divToScrollHorizontally.scrollLeft += scrollDelta * 0.1; divToScrollHorizontally.scrollLeft += scrollDelta * 0.1;
@@ -17,8 +17,7 @@ const scrollDivHorizontally = (id) => {
} }
} }
divToScrollHorizontally.addEventListener("wheel", function (e) {
divToScrollHorizontally.addEventListener("wheel", function(e) {
e.preventDefault(); // prevent default mousewheel behavior e.preventDefault(); // prevent default mousewheel behavior
// Accumulate the horizontal scroll delta // Accumulate the horizontal scroll delta
@@ -30,6 +29,6 @@ const scrollDivHorizontally = (id) => {
requestAnimationFrame(scrollLoop); requestAnimationFrame(scrollLoop);
} }
}); });
} };
export default scrollDivHorizontally; export default scrollDivHorizontally;

View File

@@ -1,15 +1,15 @@
document.getElementById('validateButton').addEventListener('click', function(event) { document.getElementById("validateButton").addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
validatePipeline(); validatePipeline();
}); });
function validatePipeline() { function validatePipeline() {
let pipelineListItems = document.getElementById('pipelineList').children; let pipelineListItems = document.getElementById("pipelineList").children;
let isValid = true; let isValid = true;
let containsAddPassword = false; let containsAddPassword = false;
for (let i = 0; i < pipelineListItems.length - 1; i++) { for (let i = 0; i < pipelineListItems.length - 1; i++) {
let currentOperation = pipelineListItems[i].querySelector('.operationName').textContent; let currentOperation = pipelineListItems[i].querySelector(".operationName").textContent;
let nextOperation = pipelineListItems[i + 1].querySelector('.operationName').textContent; let nextOperation = pipelineListItems[i + 1].querySelector(".operationName").textContent;
if (currentOperation === '/add-password') { if (currentOperation === "/add-password") {
containsAddPassword = true; containsAddPassword = true;
} }
@@ -17,39 +17,46 @@ function validatePipeline() {
let nextOperationDescription = apiDocs[nextOperation]?.post?.description || ""; let nextOperationDescription = apiDocs[nextOperation]?.post?.description || "";
// Strip off 'ZIP-' prefix // Strip off 'ZIP-' prefix
currentOperationDescription = currentOperationDescription.replace("ZIP-", ''); currentOperationDescription = currentOperationDescription.replace("ZIP-", "");
nextOperationDescription = nextOperationDescription.replace("ZIP-", ''); nextOperationDescription = nextOperationDescription.replace("ZIP-", "");
let currentOperationOutput = currentOperationDescription.match(/Output:([A-Z\/]*)/)?.[1] || ""; let currentOperationOutput = currentOperationDescription.match(/Output:([A-Z\/]*)/)?.[1] || "";
let nextOperationInput = nextOperationDescription.match(/Input:([A-Z\/]*)/)?.[1] || ""; let nextOperationInput = nextOperationDescription.match(/Input:([A-Z\/]*)/)?.[1] || "";
// Splitting in case of multiple possible output/input // Splitting in case of multiple possible output/input
let currentOperationOutputArr = currentOperationOutput.split('/'); let currentOperationOutputArr = currentOperationOutput.split("/");
let nextOperationInputArr = nextOperationInput.split('/'); let nextOperationInputArr = nextOperationInput.split("/");
if (currentOperationOutput !== 'ANY' && nextOperationInput !== 'ANY') { if (currentOperationOutput !== "ANY" && nextOperationInput !== "ANY") {
let intersection = currentOperationOutputArr.filter(value => nextOperationInputArr.includes(value)); let intersection = currentOperationOutputArr.filter((value) => nextOperationInputArr.includes(value));
console.log(`Intersection: ${intersection}`); console.log(`Intersection: ${intersection}`);
if (intersection.length === 0) { if (intersection.length === 0) {
updateValidateButton(false); updateValidateButton(false);
isValid = false; isValid = false;
console.log(`Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`); console.log(
alert(`Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`); `Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`,
);
alert(
`Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`,
);
break; break;
} }
} }
} }
if (containsAddPassword && pipelineListItems[pipelineListItems.length - 1].querySelector('.operationName').textContent !== '/add-password') { if (
containsAddPassword &&
pipelineListItems[pipelineListItems.length - 1].querySelector(".operationName").textContent !== "/add-password"
) {
updateValidateButton(false); updateValidateButton(false);
alert('The "add-password" operation should be at the end of the operations sequence. Please adjust the operations order.'); alert('The "add-password" operation should be at the end of the operations sequence. Please adjust the operations order.');
return false; return false;
} }
if (isValid) { if (isValid) {
console.log('Pipeline is valid'); console.log("Pipeline is valid");
// Continue with the pipeline operation // Continue with the pipeline operation
} else { } else {
console.error('Pipeline is not valid'); console.error("Pipeline is not valid");
// Stop operation, maybe display an error to the user // Stop operation, maybe display an error to the user
} }
updateValidateButton(isValid); updateValidateButton(isValid);
@@ -57,97 +64,79 @@ function validatePipeline() {
} }
function updateValidateButton(isValid) { function updateValidateButton(isValid) {
var validateButton = document.getElementById('validateButton'); var validateButton = document.getElementById("validateButton");
if (isValid) { if (isValid) {
validateButton.classList.remove('btn-danger'); validateButton.classList.remove("btn-danger");
validateButton.classList.add('btn-success'); validateButton.classList.add("btn-success");
} else { } else {
validateButton.classList.remove('btn-success'); validateButton.classList.remove("btn-success");
validateButton.classList.add('btn-danger'); validateButton.classList.add("btn-danger");
} }
} }
document.getElementById("submitConfigBtn").addEventListener("click", function () {
document.getElementById('submitConfigBtn').addEventListener('click', function() {
if (validatePipeline() === false) { if (validatePipeline() === false) {
return; return;
} }
let selectedOperation = document.getElementById('operationsDropdown').value; let selectedOperation = document.getElementById("operationsDropdown").value;
var pipelineName = document.getElementById("pipelineName").value;
let pipelineList = document.getElementById("pipelineList").children;
var pipelineName = document.getElementById('pipelineName').value;
let pipelineList = document.getElementById('pipelineList').children;
let pipelineConfig = { let pipelineConfig = {
"name": pipelineName, name: pipelineName,
"pipeline": [], pipeline: [],
"_examples": { _examples: {
"outputDir": "{outputFolder}/{folderName}", outputDir: "{outputFolder}/{folderName}",
"outputFileName": "{filename}-{pipelineName}-{date}-{time}" outputFileName: "{filename}-{pipelineName}-{date}-{time}",
}, },
"outputDir": "httpWebRequest", outputDir: "httpWebRequest",
"outputFileName": "{filename}" outputFileName: "{filename}",
}; };
for (let i = 0; i < pipelineList.length; i++) { for (let i = 0; i < pipelineList.length; i++) {
let operationName = pipelineList[i].querySelector('.operationName').textContent; let operationName = pipelineList[i].querySelector(".operationName").textContent;
let parameters = operationSettings[operationName] || {}; let parameters = operationSettings[operationName] || {};
pipelineConfig.pipeline.push({ pipelineConfig.pipeline.push({
"operation": operationName, operation: operationName,
"parameters": parameters parameters: parameters,
}); });
} }
let pipelineConfigJson = JSON.stringify(pipelineConfig, null, 2); let pipelineConfigJson = JSON.stringify(pipelineConfig, null, 2);
let formData = new FormData(); let formData = new FormData();
let fileInput = document.getElementById('fileInput-input'); let fileInput = document.getElementById("fileInput-input");
let files = fileInput.files; let files = fileInput.files;
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
console.log("files[i]", files[i].name); console.log("files[i]", files[i].name);
formData.append('fileInput', files[i], files[i].name); formData.append("fileInput", files[i], files[i].name);
} }
console.log("pipelineConfigJson", pipelineConfigJson); console.log("pipelineConfigJson", pipelineConfigJson);
formData.append('json', pipelineConfigJson); formData.append("json", pipelineConfigJson);
console.log("formData", formData); console.log("formData", formData);
fetch('api/v1/pipeline/handleData', { fetch("api/v1/pipeline/handleData", {
method: 'POST', method: "POST",
body: formData body: formData,
}) })
.then(response => { .then((response) => {
// Save the response to use it later // Save the response to use it later
const responseToUseLater = response; const responseToUseLater = response;
return response.blob().then(blob => { return response.blob().then((blob) => {
let url = window.URL.createObjectURL(blob); let url = window.URL.createObjectURL(blob);
let a = document.createElement('a'); let a = document.createElement("a");
a.href = url; a.href = url;
// Use responseToUseLater instead of response // Use responseToUseLater instead of response
const contentDisposition = responseToUseLater.headers.get('Content-Disposition'); const contentDisposition = responseToUseLater.headers.get("Content-Disposition");
let filename = 'download'; let filename = "download";
if (contentDisposition && contentDisposition.indexOf('attachment') !== -1) { if (contentDisposition && contentDisposition.indexOf("attachment") !== -1) {
filename = decodeURIComponent(contentDisposition.split('filename=')[1].replace(/"/g, '')).trim(); filename = decodeURIComponent(contentDisposition.split("filename=")[1].replace(/"/g, "")).trim();
} }
a.download = filename; a.download = filename;
@@ -157,30 +146,28 @@ document.getElementById('submitConfigBtn').addEventListener('click', function()
}); });
}) })
.catch((error) => { .catch((error) => {
console.error('Error:', error); console.error("Error:", error);
}); });
}); });
let apiDocs = {}; let apiDocs = {};
let apiSchemas = {}; let apiSchemas = {};
let operationSettings = {}; let operationSettings = {};
fetch('v1/api-docs') fetch("v1/api-docs")
.then(response => response.json()) .then((response) => response.json())
.then(data => { .then((data) => {
apiDocs = data.paths; apiDocs = data.paths;
apiSchemas = data.components.schemas; apiSchemas = data.components.schemas;
let operationsDropdown = document.getElementById('operationsDropdown'); let operationsDropdown = document.getElementById("operationsDropdown");
const ignoreOperations = ["/api/v1/pipeline/handleData", "/api/v1/pipeline/operationToIgnore"]; // Add the operations you want to ignore here const ignoreOperations = ["/api/v1/pipeline/handleData", "/api/v1/pipeline/operationToIgnore"]; // Add the operations you want to ignore here
operationsDropdown.innerHTML = ''; operationsDropdown.innerHTML = "";
let operationsByTag = {}; let operationsByTag = {};
// Group operations by tags // Group operations by tags
Object.keys(data.paths).forEach(operationPath => { Object.keys(data.paths).forEach((operationPath) => {
let operation = data.paths[operationPath].post; let operation = data.paths[operationPath].post;
if (!operation || !operation.description) { if (!operation || !operation.description) {
console.log(operationPath); console.log(operationPath);
@@ -196,7 +183,7 @@ fetch('v1/api-docs')
}); });
// Sort operations within each tag alphabetically // Sort operations within each tag alphabetically
Object.keys(operationsByTag).forEach(tag => { Object.keys(operationsByTag).forEach((tag) => {
operationsByTag[tag].sort(); operationsByTag[tag].sort();
}); });
@@ -204,22 +191,21 @@ fetch('v1/api-docs')
let tagOrder = ["General", "Security", "Convert", "Misc", "Filter"]; let tagOrder = ["General", "Security", "Convert", "Misc", "Filter"];
// Create dropdown options // Create dropdown options
tagOrder.forEach(tag => { tagOrder.forEach((tag) => {
if (operationsByTag[tag]) { if (operationsByTag[tag]) {
let group = document.createElement('optgroup'); let group = document.createElement("optgroup");
group.label = tag; group.label = tag;
operationsByTag[tag].forEach(operationPath => { operationsByTag[tag].forEach((operationPath) => {
let option = document.createElement('option'); let option = document.createElement("option");
let operationPathDisplay = operationPath
operationPathDisplay = operationPath.replace(new RegExp("api/v1/" + tag.toLowerCase() + "/", 'i'), "");
let operationPathDisplay = operationPath;
operationPathDisplay = operationPath.replace(new RegExp("api/v1/" + tag.toLowerCase() + "/", "i"), "");
if (operationPath.includes("/convert")) { if (operationPath.includes("/convert")) {
operationPathDisplay = operationPathDisplay.replace(/^\//, '').replaceAll("/", " to "); operationPathDisplay = operationPathDisplay.replace(/^\//, "").replaceAll("/", " to ");
} else { } else {
operationPathDisplay = operationPathDisplay.replace(/\//g, ''); // Remove slashes operationPathDisplay = operationPathDisplay.replace(/\//g, ""); // Remove slashes
} }
operationPathDisplay = operationPathDisplay.replaceAll(" ", "-"); operationPathDisplay = operationPathDisplay.replaceAll(" ", "-");
option.textContent = operationPathDisplay; option.textContent = operationPathDisplay;
@@ -232,12 +218,11 @@ fetch('v1/api-docs')
}); });
}); });
document.getElementById("addOperationBtn").addEventListener("click", function () {
let selectedOperation = document.getElementById("operationsDropdown").value;
let pipelineList = document.getElementById("pipelineList");
document.getElementById('addOperationBtn').addEventListener('click', function() { let listItem = document.createElement("li");
let selectedOperation = document.getElementById('operationsDropdown').value;
let pipelineList = document.getElementById('pipelineList');
let listItem = document.createElement('li');
listItem.className = "list-group-item"; listItem.className = "list-group-item";
let hasSettings = false; let hasSettings = false;
if (apiDocs[selectedOperation] && apiDocs[selectedOperation].post) { if (apiDocs[selectedOperation] && apiDocs[selectedOperation].post) {
@@ -246,32 +231,31 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
// Check if parameters exist // Check if parameters exist
if (postMethod.parameters && postMethod.parameters.length > 0) { if (postMethod.parameters && postMethod.parameters.length > 0) {
hasSettings = true; hasSettings = true;
} else if (postMethod.requestBody && postMethod.requestBody.content['multipart/form-data']) { } else if (postMethod.requestBody && postMethod.requestBody.content["multipart/form-data"]) {
// Extract the reference key // Extract the reference key
const refKey = postMethod.requestBody.content['multipart/form-data'].schema['$ref'].split('/').pop(); const refKey = postMethod.requestBody.content["multipart/form-data"].schema["$ref"].split("/").pop();
// Check if the referenced schema exists and has properties more than just its input file // Check if the referenced schema exists and has properties more than just its input file
if (apiSchemas[refKey]) { if (apiSchemas[refKey]) {
const properties = apiSchemas[refKey].properties; const properties = apiSchemas[refKey].properties;
const propertyKeys = Object.keys(properties); const propertyKeys = Object.keys(properties);
// Check if there's more than one property or if there's exactly one property and its format is not 'binary' // Check if there's more than one property or if there's exactly one property and its format is not 'binary'
if (propertyKeys.length > 1 || (propertyKeys.length === 1 && properties[propertyKeys[0]].format !== 'binary')) { if (propertyKeys.length > 1 || (propertyKeys.length === 1 && properties[propertyKeys[0]].format !== "binary")) {
hasSettings = true; hasSettings = true;
} }
} }
} }
} }
listItem.innerHTML = ` listItem.innerHTML = `
<div class="d-flex justify-content-between align-items-center w-100"> <div class="d-flex justify-content-between align-items-center w-100">
<div class="operationName">${selectedOperation}</div> <div class="operationName">${selectedOperation}</div>
<div class="arrows d-flex"> <div class="arrows d-flex">
<button class="btn btn-secondary move-up ms-1"><span>&uarr;</span></button> <button class="btn btn-secondary move-up ms-1"><span>&uarr;</span></button>
<button class="btn btn-secondary move-down ms-1"><span>&darr;</span></button> <button class="btn btn-secondary move-down ms-1"><span>&darr;</span></button>
<button class="btn ${hasSettings ? 'btn-warning' : 'btn-secondary'} pipelineSettings ms-1" ${hasSettings ? "" : "disabled"}> <button class="btn ${hasSettings ? "btn-warning" : "btn-secondary"} pipelineSettings ms-1" ${
hasSettings ? "" : "disabled"
}>
<span style="color: ${hasSettings ? "white" : "grey"};">⚙️</span> <span style="color: ${hasSettings ? "white" : "grey"};">⚙️</span>
</button> </button>
<button class="btn btn-danger remove ms-1"><span>X</span></button> <button class="btn btn-danger remove ms-1"><span>X</span></button>
@@ -279,10 +263,9 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
</div> </div>
`; `;
pipelineList.appendChild(listItem); pipelineList.appendChild(listItem);
listItem.querySelector('.move-up').addEventListener('click', function(event) { listItem.querySelector(".move-up").addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
if (listItem.previousElementSibling) { if (listItem.previousElementSibling) {
pipelineList.insertBefore(listItem, listItem.previousElementSibling); pipelineList.insertBefore(listItem, listItem.previousElementSibling);
@@ -290,56 +273,57 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
} }
}); });
listItem.querySelector('.move-down').addEventListener('click', function(event) { listItem.querySelector(".move-down").addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
if (listItem.nextElementSibling) { if (listItem.nextElementSibling) {
pipelineList.insertBefore(listItem.nextElementSibling, listItem); pipelineList.insertBefore(listItem.nextElementSibling, listItem);
updateConfigInDropdown(); updateConfigInDropdown();
} }
}); });
listItem.querySelector('.remove').addEventListener('click', function(event) { listItem.querySelector(".remove").addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
pipelineList.removeChild(listItem); pipelineList.removeChild(listItem);
hideOrShowPipelineHeader(); hideOrShowPipelineHeader();
updateConfigInDropdown(); updateConfigInDropdown();
}); });
listItem.querySelector('.pipelineSettings').addEventListener('click', function(event) { listItem.querySelector(".pipelineSettings").addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
showpipelineSettingsModal(selectedOperation); showpipelineSettingsModal(selectedOperation);
hideOrShowPipelineHeader(); hideOrShowPipelineHeader();
}); });
function showpipelineSettingsModal(operation) { function showpipelineSettingsModal(operation) {
let pipelineSettingsModal = document.getElementById('pipelineSettingsModal'); let pipelineSettingsModal = document.getElementById("pipelineSettingsModal");
let pipelineSettingsContent = document.getElementById('pipelineSettingsContent'); let pipelineSettingsContent = document.getElementById("pipelineSettingsContent");
let operationData = apiDocs[operation].post.parameters || []; let operationData = apiDocs[operation].post.parameters || [];
// Resolve the $ref reference to get actual schema properties // Resolve the $ref reference to get actual schema properties
let refKey = apiDocs[operation].post.requestBody.content['multipart/form-data'].schema['$ref'].split('/').pop(); let refKey = apiDocs[operation].post.requestBody.content["multipart/form-data"].schema["$ref"].split("/").pop();
let requestBodyData = apiSchemas[refKey].properties || {}; let requestBodyData = apiSchemas[refKey].properties || {};
// Combine operationData and requestBodyData into a single array // Combine operationData and requestBodyData into a single array
operationData = operationData.concat(Object.keys(requestBodyData).map(key => ({ operationData = operationData.concat(
Object.keys(requestBodyData).map((key) => ({
name: key, name: key,
schema: requestBodyData[key] schema: requestBodyData[key],
}))); })),
);
pipelineSettingsContent.innerHTML = ''; pipelineSettingsContent.innerHTML = "";
operationData.forEach(parameter => { operationData.forEach((parameter) => {
// If the parameter name is 'fileInput', return early to skip the rest of this iteration // If the parameter name is 'fileInput', return early to skip the rest of this iteration
if (parameter.name === 'fileInput') return; if (parameter.name === "fileInput") return;
let parameterDiv = document.createElement('div'); let parameterDiv = document.createElement("div");
parameterDiv.className = "mb-3"; parameterDiv.className = "mb-3";
let parameterLabel = document.createElement('label'); let parameterLabel = document.createElement("label");
parameterLabel.textContent = `${parameter.name} (${parameter.schema.type}): `; parameterLabel.textContent = `${parameter.name} (${parameter.schema.type}): `;
parameterLabel.title = parameter.schema.description; parameterLabel.title = parameter.schema.description;
parameterLabel.setAttribute('for', parameter.name); parameterLabel.setAttribute("for", parameter.name);
parameterDiv.appendChild(parameterLabel); parameterDiv.appendChild(parameterLabel);
let defaultValue = parameter.schema.example; let defaultValue = parameter.schema.example;
@@ -350,12 +334,12 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
// check if enum exists in schema // check if enum exists in schema
if (parameter.schema.enum) { if (parameter.schema.enum) {
// if enum exists, create a select element // if enum exists, create a select element
parameterInput = document.createElement('select'); parameterInput = document.createElement("select");
parameterInput.className = "form-control"; parameterInput.className = "form-control";
// iterate over each enum value and create an option for it // iterate over each enum value and create an option for it
parameter.schema.enum.forEach(value => { parameter.schema.enum.forEach((value) => {
let option = document.createElement('option'); let option = document.createElement("option");
option.value = value; option.value = value;
option.text = value; option.text = value;
parameterInput.appendChild(option); parameterInput.appendChild(option);
@@ -363,47 +347,47 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
} else { } else {
// switch-case statement for handling non-enum types // switch-case statement for handling non-enum types
switch (parameter.schema.type) { switch (parameter.schema.type) {
case 'string': case "string":
if (parameter.schema.format === 'binary') { if (parameter.schema.format === "binary") {
// This is a file input // This is a file input
//parameterInput = document.createElement('input'); //parameterInput = document.createElement('input');
//parameterInput.type = 'file'; //parameterInput.type = 'file';
//parameterInput.className = "form-control"; //parameterInput.className = "form-control";
parameterInput = document.createElement('input'); parameterInput = document.createElement("input");
parameterInput.type = 'text'; parameterInput.type = "text";
parameterInput.className = "form-control"; parameterInput.className = "form-control";
parameterInput.value = "FileInputPathToBeInputtedManuallyForOffline"; parameterInput.value = "FileInputPathToBeInputtedManuallyForOffline";
} else { } else {
parameterInput = document.createElement('input'); parameterInput = document.createElement("input");
parameterInput.type = 'text'; parameterInput.type = "text";
parameterInput.className = "form-control"; parameterInput.className = "form-control";
if (defaultValue !== undefined) parameterInput.value = defaultValue; if (defaultValue !== undefined) parameterInput.value = defaultValue;
} }
break; break;
case 'number': case "number":
case 'integer': case "integer":
parameterInput = document.createElement('input'); parameterInput = document.createElement("input");
parameterInput.type = 'number'; parameterInput.type = "number";
parameterInput.className = "form-control"; parameterInput.className = "form-control";
if (defaultValue !== undefined) parameterInput.value = defaultValue; if (defaultValue !== undefined) parameterInput.value = defaultValue;
break; break;
case 'boolean': case "boolean":
parameterInput = document.createElement('input'); parameterInput = document.createElement("input");
parameterInput.type = 'checkbox'; parameterInput.type = "checkbox";
if (defaultValue === true) parameterInput.checked = true; if (defaultValue === true) parameterInput.checked = true;
break; break;
case 'array': case "array":
case 'object': case "object":
//TODO compare to doc and check if fileInput array? parameter.schema.format === 'binary' //TODO compare to doc and check if fileInput array? parameter.schema.format === 'binary'
parameterInput = document.createElement('textarea'); parameterInput = document.createElement("textarea");
parameterInput.placeholder = `Enter a JSON formatted ${parameter.schema.type}, If this is a fileInput, it is not currently supported`; parameterInput.placeholder = `Enter a JSON formatted ${parameter.schema.type}, If this is a fileInput, it is not currently supported`;
parameterInput.className = "form-control"; parameterInput.className = "form-control";
break; break;
default: default:
parameterInput = document.createElement('input'); parameterInput = document.createElement("input");
parameterInput.type = 'text'; parameterInput.type = "text";
parameterInput.className = "form-control"; parameterInput.className = "form-control";
if (defaultValue !== undefined) parameterInput.value = defaultValue; if (defaultValue !== undefined) parameterInput.value = defaultValue;
} }
@@ -416,15 +400,15 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
let savedValue = operationSettings[operation][parameter.name]; let savedValue = operationSettings[operation][parameter.name];
switch (parameter.schema.type) { switch (parameter.schema.type) {
case 'number': case "number":
case 'integer': case "integer":
parameterInput.value = savedValue.toString(); parameterInput.value = savedValue.toString();
break; break;
case 'boolean': case "boolean":
parameterInput.checked = savedValue; parameterInput.checked = savedValue;
break; break;
case 'array': case "array":
case 'object': case "object":
parameterInput.value = JSON.stringify(savedValue); parameterInput.value = JSON.stringify(savedValue);
break; break;
default: default:
@@ -437,28 +421,28 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
pipelineSettingsContent.appendChild(parameterDiv); pipelineSettingsContent.appendChild(parameterDiv);
}); });
if(hasSettings) { if (hasSettings) {
let saveButton = document.createElement('button'); let saveButton = document.createElement("button");
saveButton.textContent = saveSettings; saveButton.textContent = saveSettings;
saveButton.className = "btn btn-primary"; saveButton.className = "btn btn-primary";
saveButton.addEventListener('click', function(event) { saveButton.addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
let settings = {}; let settings = {};
operationData.forEach(parameter => { operationData.forEach((parameter) => {
if (parameter.name !== "fileInput") { if (parameter.name !== "fileInput") {
let value = document.getElementById(parameter.name).value; let value = document.getElementById(parameter.name).value;
switch (parameter.schema.type) { switch (parameter.schema.type) {
case 'number': case "number":
case 'integer': case "integer":
settings[parameter.name] = Number(value); settings[parameter.name] = Number(value);
break; break;
case 'boolean': case "boolean":
settings[parameter.name] = document.getElementById(parameter.name).checked; settings[parameter.name] = document.getElementById(parameter.name).checked;
break; break;
case 'array': case "array":
case 'object': case "object":
if (value === null || value === '') { if (value === null || value === "") {
settings[parameter.name] = ''; settings[parameter.name] = "";
} else { } else {
try { try {
settings[parameter.name] = JSON.parse(value); settings[parameter.name] = JSON.parse(value);
@@ -493,17 +477,10 @@ document.getElementById('addOperationBtn').addEventListener('click', function()
showpipelineSettingsModal(selectedOperation); showpipelineSettingsModal(selectedOperation);
updateConfigInDropdown(); updateConfigInDropdown();
hideOrShowPipelineHeader(); hideOrShowPipelineHeader();
}); });
function updateConfigInDropdown() { function updateConfigInDropdown() {
let pipelineSelect = document.getElementById('pipelineSelect'); let pipelineSelect = document.getElementById("pipelineSelect");
let selectedOption = pipelineSelect.options[pipelineSelect.selectedIndex]; let selectedOption = pipelineSelect.options[pipelineSelect.selectedIndex];
// Get the current configuration as JSON // Get the current configuration as JSON
@@ -516,53 +493,50 @@ function updateConfigInDropdown() {
// Update the value of the selected option with the new configuration // Update the value of the selected option with the new configuration
selectedOption.value = pipelineConfigJson; selectedOption.value = pipelineConfigJson;
} }
var saveBtn = document.getElementById('savePipelineBtn'); var saveBtn = document.getElementById("savePipelineBtn");
// Remove any existing event listeners // Remove any existing event listeners
saveBtn.removeEventListener('click', savePipeline); saveBtn.removeEventListener("click", savePipeline);
// Add the event listener // Add the event listener
saveBtn.addEventListener('click', savePipeline); saveBtn.addEventListener("click", savePipeline);
console.log("saveBtn", saveBtn) console.log("saveBtn", saveBtn);
function configToJson() { function configToJson() {
if (!validatePipeline()) { if (!validatePipeline()) {
return null; // Return null if validation fails return null; // Return null if validation fails
} }
var pipelineName = document.getElementById('pipelineName').value; var pipelineName = document.getElementById("pipelineName").value;
let pipelineList = document.getElementById('pipelineList').children; let pipelineList = document.getElementById("pipelineList").children;
let pipelineConfig = { let pipelineConfig = {
"name": pipelineName, name: pipelineName,
"pipeline": [], pipeline: [],
"_examples": { _examples: {
"outputDir": "{outputFolder}/{folderName}", outputDir: "{outputFolder}/{folderName}",
"outputFileName": "{filename}-{pipelineName}-{date}-{time}" outputFileName: "{filename}-{pipelineName}-{date}-{time}",
}, },
"outputDir": "{outputFolder}", outputDir: "{outputFolder}",
"outputFileName": "{filename}" outputFileName: "{filename}",
}; };
for (let i = 0; i < pipelineList.length; i++) { for (let i = 0; i < pipelineList.length; i++) {
let operationName = pipelineList[i].querySelector('.operationName').textContent; let operationName = pipelineList[i].querySelector(".operationName").textContent;
let parameters = operationSettings[operationName] || {}; let parameters = operationSettings[operationName] || {};
parameters['fileInput'] = 'automated'; parameters["fileInput"] = "automated";
pipelineConfig.pipeline.push({ pipelineConfig.pipeline.push({
"operation": operationName, operation: operationName,
"parameters": parameters parameters: parameters,
}); });
} }
return JSON.stringify(pipelineConfig, null, 2); return JSON.stringify(pipelineConfig, null, 2);
} }
function savePipeline() { function savePipeline() {
let pipelineConfigJson = configToJson(); let pipelineConfigJson = configToJson();
if (!pipelineConfigJson) { if (!pipelineConfigJson) {
@@ -570,102 +544,98 @@ function savePipeline() {
return; return;
} }
let pipelineName = document.getElementById('pipelineName').value; let pipelineName = document.getElementById("pipelineName").value;
console.log("Downloading..."); console.log("Downloading...");
let a = document.createElement('a'); let a = document.createElement("a");
a.href = URL.createObjectURL(new Blob([pipelineConfigJson], { type: 'application/json' })); a.href = URL.createObjectURL(new Blob([pipelineConfigJson], { type: "application/json" }));
a.download = pipelineName + '.json'; a.download = pipelineName + ".json";
a.style.display = 'none'; a.style.display = "none";
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();
document.body.removeChild(a); document.body.removeChild(a);
} }
async function processPipelineConfig(configString) { async function processPipelineConfig(configString) {
console.log("configString", configString); console.log("configString", configString);
let pipelineConfig = JSON.parse(configString); let pipelineConfig = JSON.parse(configString);
let pipelineList = document.getElementById('pipelineList'); let pipelineList = document.getElementById("pipelineList");
while (pipelineList.firstChild) { while (pipelineList.firstChild) {
pipelineList.removeChild(pipelineList.firstChild); pipelineList.removeChild(pipelineList.firstChild);
} }
document.getElementById('pipelineName').value = pipelineConfig.name document.getElementById("pipelineName").value = pipelineConfig.name;
for (const operationConfig of pipelineConfig.pipeline) { for (const operationConfig of pipelineConfig.pipeline) {
let operationsDropdown = document.getElementById('operationsDropdown'); let operationsDropdown = document.getElementById("operationsDropdown");
operationsDropdown.value = operationConfig.operation; operationsDropdown.value = operationConfig.operation;
operationSettings[operationConfig.operation] = operationConfig.parameters; operationSettings[operationConfig.operation] = operationConfig.parameters;
// assuming addOperation is async // assuming addOperation is async
await new Promise((resolve) => { await new Promise((resolve) => {
document.getElementById('addOperationBtn').addEventListener('click', resolve, { once: true }); document.getElementById("addOperationBtn").addEventListener("click", resolve, { once: true });
document.getElementById('addOperationBtn').click(); document.getElementById("addOperationBtn").click();
}); });
let lastOperation = pipelineList.lastChild; let lastOperation = pipelineList.lastChild;
Object.keys(operationConfig.parameters).forEach(parameterName => { Object.keys(operationConfig.parameters).forEach((parameterName) => {
let input = document.getElementById(parameterName); let input = document.getElementById(parameterName);
if (input) { if (input) {
switch (input.type) { switch (input.type) {
case 'checkbox': case "checkbox":
input.checked = operationConfig.parameters[parameterName]; input.checked = operationConfig.parameters[parameterName];
break; break;
case 'number': case "number":
input.value = operationConfig.parameters[parameterName].toString(); input.value = operationConfig.parameters[parameterName].toString();
break; break;
case 'file': case "file":
if (parameterName !== 'fileInput') { if (parameterName !== "fileInput") {
// Create a new file input element // Create a new file input element
let newInput = document.createElement('input'); let newInput = document.createElement("input");
newInput.type = 'file'; newInput.type = "file";
newInput.id = parameterName; newInput.id = parameterName;
// Add the new file input to the main page (change the selector according to your needs) // Add the new file input to the main page (change the selector according to your needs)
document.querySelector('#main').appendChild(newInput); document.querySelector("#main").appendChild(newInput);
} }
break; break;
case 'text': case "text":
case 'textarea': case "textarea":
default: default:
input.value = JSON.stringify(operationConfig.parameters[parameterName]); input.value = JSON.stringify(operationConfig.parameters[parameterName]);
} }
} }
}); });
} }
} }
document.getElementById("uploadPipelineBtn").addEventListener("click", function () {
document.getElementById('uploadPipelineBtn').addEventListener('click', function() { document.getElementById("uploadPipelineInput").click();
document.getElementById('uploadPipelineInput').click();
}); });
document.getElementById('uploadPipelineInput').addEventListener('change', function(e) { document.getElementById("uploadPipelineInput").addEventListener("change", function (e) {
let reader = new FileReader(); let reader = new FileReader();
reader.onload = function(event) { reader.onload = function (event) {
processPipelineConfig(event.target.result); processPipelineConfig(event.target.result);
}; };
reader.readAsText(e.target.files[0]); reader.readAsText(e.target.files[0]);
hideOrShowPipelineHeader(); hideOrShowPipelineHeader();
}); });
document.getElementById('pipelineSelect').addEventListener('change', function(e) { document.getElementById("pipelineSelect").addEventListener("change", function (e) {
let selectedPipelineJson = e.target.value; // assuming the selected value is the JSON string of the pipeline config let selectedPipelineJson = e.target.value; // assuming the selected value is the JSON string of the pipeline config
processPipelineConfig(selectedPipelineJson); processPipelineConfig(selectedPipelineJson);
}); });
function hideOrShowPipelineHeader() { function hideOrShowPipelineHeader() {
var pipelineHeader = document.getElementById('pipelineHeader'); var pipelineHeader = document.getElementById("pipelineHeader");
var pipelineList = document.getElementById('pipelineList'); var pipelineList = document.getElementById("pipelineList");
if (pipelineList.children.length === 0) { if (pipelineList.children.length === 0) {
// Hide the pipeline header if there are no items in the pipeline list // Hide the pipeline header if there are no items in the pipeline list
pipelineHeader.style.display = 'none'; pipelineHeader.style.display = "none";
} else { } else {
// Show the pipeline header if there are items in the pipeline list // Show the pipeline header if there are items in the pipeline list
pipelineHeader.style.display = 'block'; pipelineHeader.style.display = "block";
} }
} }

View File

@@ -1,20 +1,20 @@
// Toggle search bar when the search icon is clicked // Toggle search bar when the search icon is clicked
document.querySelector('#search-icon').addEventListener('click', function(e) { document.querySelector("#search-icon").addEventListener("click", function (e) {
e.preventDefault(); e.preventDefault();
var searchBar = document.querySelector('#navbarSearch'); var searchBar = document.querySelector("#navbarSearch");
searchBar.classList.toggle('show'); searchBar.classList.toggle("show");
}); });
window.onload = function() { window.onload = function () {
var items = document.querySelectorAll('.dropdown-item, .nav-link'); var items = document.querySelectorAll(".dropdown-item, .nav-link");
var dummyContainer = document.createElement('div'); var dummyContainer = document.createElement("div");
dummyContainer.style.position = 'absolute'; dummyContainer.style.position = "absolute";
dummyContainer.style.visibility = 'hidden'; dummyContainer.style.visibility = "hidden";
dummyContainer.style.whiteSpace = 'nowrap'; // Ensure we measure full width dummyContainer.style.whiteSpace = "nowrap"; // Ensure we measure full width
document.body.appendChild(dummyContainer); document.body.appendChild(dummyContainer);
var maxWidth = 0; var maxWidth = 0;
items.forEach(function(item) { items.forEach(function (item) {
var clone = item.cloneNode(true); var clone = item.cloneNode(true);
dummyContainer.appendChild(clone); dummyContainer.appendChild(clone);
var width = clone.offsetWidth; var width = clone.offsetWidth;
@@ -31,36 +31,39 @@ window.onload = function() {
}; };
// Show search results as user types in search box // Show search results as user types in search box
document.querySelector('#navbarSearchInput').addEventListener('input', function(e) { document.querySelector("#navbarSearchInput").addEventListener("input", function (e) {
var searchText = e.target.value.toLowerCase(); var searchText = e.target.value.toLowerCase();
var items = document.querySelectorAll('.dropdown-item, .nav-link'); var items = document.querySelectorAll(".dropdown-item, .nav-link");
var resultsBox = document.querySelector('#searchResults'); var resultsBox = document.querySelector("#searchResults");
// Clear any previous results // Clear any previous results
resultsBox.innerHTML = ''; resultsBox.innerHTML = "";
items.forEach(function(item) { items.forEach(function (item) {
var titleElement = item.querySelector('.icon-text'); var titleElement = item.querySelector(".icon-text");
var iconElement = item.querySelector('.icon'); var iconElement = item.querySelector(".icon");
var itemHref = item.getAttribute('href'); var itemHref = item.getAttribute("href");
var tags = item.getAttribute('data-bs-tags') || ""; // If no tags, default to empty string var tags = item.getAttribute("data-bs-tags") || ""; // If no tags, default to empty string
if (titleElement && iconElement && itemHref !== '#') { if (titleElement && iconElement && itemHref !== "#") {
var title = titleElement.innerText; var title = titleElement.innerText;
if ((title.toLowerCase().indexOf(searchText) !== -1 || tags.toLowerCase().indexOf(searchText) !== -1) && !resultsBox.querySelector(`a[href="${item.getAttribute('href')}"]`)) { if (
var result = document.createElement('a'); (title.toLowerCase().indexOf(searchText) !== -1 || tags.toLowerCase().indexOf(searchText) !== -1) &&
!resultsBox.querySelector(`a[href="${item.getAttribute("href")}"]`)
) {
var result = document.createElement("a");
result.href = itemHref; result.href = itemHref;
result.classList.add('dropdown-item'); result.classList.add("dropdown-item");
var resultIcon = document.createElement('img'); var resultIcon = document.createElement("img");
resultIcon.src = iconElement.src; resultIcon.src = iconElement.src;
resultIcon.alt = 'icon'; resultIcon.alt = "icon";
resultIcon.classList.add('icon'); resultIcon.classList.add("icon");
result.appendChild(resultIcon); result.appendChild(resultIcon);
var resultText = document.createElement('span'); var resultText = document.createElement("span");
resultText.textContent = title; resultText.textContent = title;
resultText.classList.add('icon-text'); resultText.classList.add("icon-text");
result.appendChild(resultText); result.appendChild(resultText);
resultsBox.appendChild(result); resultsBox.appendChild(result);
@@ -69,7 +72,5 @@ document.querySelector('#navbarSearchInput').addEventListener('input', function(
}); });
// Set the width of the search results box to the maximum width // Set the width of the search results box to the maximum width
resultsBox.style.width = window.navItemMaxWidth + 'px'; resultsBox.style.width = window.navItemMaxWidth + "px";
}); });

View File

@@ -1,42 +1,33 @@
// Get the download option from local storage, or set it to 'sameWindow' if it doesn't exist // Get the download option from local storage, or set it to 'sameWindow' if it doesn't exist
var downloadOption = localStorage.getItem('downloadOption') var downloadOption = localStorage.getItem("downloadOption") || "sameWindow";
|| 'sameWindow';
// Set the selected option in the dropdown // Set the selected option in the dropdown
document.getElementById('downloadOption').value = downloadOption; document.getElementById("downloadOption").value = downloadOption;
// Save the selected option to local storage when the dropdown value changes // Save the selected option to local storage when the dropdown value changes
document.getElementById('downloadOption').addEventListener( document.getElementById("downloadOption").addEventListener("change", function () {
'change',
function() {
downloadOption = this.value; downloadOption = this.value;
localStorage.setItem('downloadOption', localStorage.setItem("downloadOption", downloadOption);
downloadOption); });
});
// Get the zipThreshold value from local storage, or set it to 0 if it doesn't exist // Get the zipThreshold value from local storage, or set it to 0 if it doesn't exist
var zipThreshold = parseInt(localStorage.getItem('zipThreshold'), 10) || 4; var zipThreshold = parseInt(localStorage.getItem("zipThreshold"), 10) || 4;
// Set the value of the slider and the display span // Set the value of the slider and the display span
document.getElementById('zipThreshold').value = zipThreshold; document.getElementById("zipThreshold").value = zipThreshold;
document.getElementById('zipThresholdValue').textContent = zipThreshold; document.getElementById("zipThresholdValue").textContent = zipThreshold;
// Save the selected value to local storage when the slider value changes // Save the selected value to local storage when the slider value changes
document.getElementById('zipThreshold').addEventListener('input', function() { document.getElementById("zipThreshold").addEventListener("input", function () {
zipThreshold = this.value; zipThreshold = this.value;
document.getElementById('zipThresholdValue').textContent = zipThreshold; document.getElementById("zipThresholdValue").textContent = zipThreshold;
localStorage.setItem('zipThreshold', zipThreshold); localStorage.setItem("zipThreshold", zipThreshold);
}); });
var boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
document.getElementById("boredWaiting").checked = boredWaiting === "enabled";
var boredWaiting = localStorage.getItem('boredWaiting') || 'disabled'; document.getElementById("boredWaiting").addEventListener("change", function () {
document.getElementById('boredWaiting').checked = boredWaiting === 'enabled'; boredWaiting = this.checked ? "enabled" : "disabled";
localStorage.setItem("boredWaiting", boredWaiting);
document.getElementById('boredWaiting').addEventListener('change', function() {
boredWaiting = this.checked ? 'enabled' : 'disabled';
localStorage.setItem('boredWaiting', boredWaiting);
}); });

View File

@@ -1,20 +1,19 @@
TabContainer = { TabContainer = {
initTabGroups() { initTabGroups() {
const groups = document.querySelectorAll(".tab-group"); const groups = document.querySelectorAll(".tab-group");
const unloadedGroups = [...groups].filter(g => !g.initialised); const unloadedGroups = [...groups].filter((g) => !g.initialised);
unloadedGroups.forEach(group => { unloadedGroups.forEach((group) => {
const containers = group.querySelectorAll(".tab-container"); const containers = group.querySelectorAll(".tab-container");
const tabTitles = [...containers].map(c => c.getAttribute("title")); const tabTitles = [...containers].map((c) => c.getAttribute("title"));
const tabList = document.createElement("div"); const tabList = document.createElement("div");
tabList.classList.add("tab-buttons"); tabList.classList.add("tab-buttons");
tabTitles.forEach(title => { tabTitles.forEach((title) => {
const tabButton = document.createElement("button"); const tabButton = document.createElement("button");
tabButton.innerHTML = title; tabButton.innerHTML = title;
tabButton.onclick = e => { tabButton.onclick = (e) => {
this.setActiveTab(e.target); this.setActiveTab(e.target);
} };
tabList.appendChild(tabButton); tabList.appendChild(tabButton);
}); });
group.prepend(tabList); group.prepend(tabList);
@@ -25,15 +24,15 @@ TabContainer = {
}); });
}, },
setActiveTab(tabButton) { setActiveTab(tabButton) {
const group = tabButton.closest(".tab-group") const group = tabButton.closest(".tab-group");
group.querySelectorAll(".active").forEach(el => el.classList.remove("active")); group.querySelectorAll(".active").forEach((el) => el.classList.remove("active"));
tabButton.classList.add("active"); tabButton.classList.add("active");
group.querySelector(`[title="${tabButton.innerHTML}"]`).classList.add("active"); group.querySelector(`[title="${tabButton.innerHTML}"]`).classList.add("active");
}, },
} };
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
TabContainer.initTabGroups(); TabContainer.initTabGroups();
}) });

View File

@@ -116,7 +116,6 @@
top: 0; top: 0;
} }
:root { :root {
--annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>"); --annotation-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");
--input-focus-border-color: Highlight; --input-focus-border-color: Highlight;
@@ -139,9 +138,7 @@
.annotationLayer .textWidgetAnnotation :is(input, textarea):required, .annotationLayer .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required, .annotationLayer .choiceWidgetAnnotation select:required,
.annotationLayer .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:required {
outline: 1.5px solid selectedItem; outline: 1.5px solid selectedItem;
} }
@@ -228,9 +225,7 @@
height: 100%; height: 100%;
} }
.annotationLayer .annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a:hover {
:is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder)
> a:hover {
opacity: 0.2; opacity: 0.2;
background-color: rgba(255, 255, 0, 1); background-color: rgba(255, 255, 0, 1);
box-shadow: 0 2px 10px rgba(255, 255, 0, 1); box-shadow: 0 2px 10px rgba(255, 255, 0, 1);
@@ -268,9 +263,7 @@
.annotationLayer .textWidgetAnnotation :is(input, textarea):required, .annotationLayer .textWidgetAnnotation :is(input, textarea):required,
.annotationLayer .choiceWidgetAnnotation select:required, .annotationLayer .choiceWidgetAnnotation select:required,
.annotationLayer .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required {
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:required {
outline: 1.5px solid red; outline: 1.5px solid red;
} }
@@ -288,9 +281,7 @@ input:required {
.annotationLayer .textWidgetAnnotation :is(input, textarea)[disabled], .annotationLayer .textWidgetAnnotation :is(input, textarea)[disabled],
.annotationLayer .choiceWidgetAnnotation select[disabled], .annotationLayer .choiceWidgetAnnotation select[disabled],
.annotationLayer .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled] {
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input[disabled] {
background: none; background: none;
border: 2px solid var(--input-disabled-border-color); border: 2px solid var(--input-disabled-border-color);
cursor: not-allowed; cursor: not-allowed;
@@ -298,9 +289,7 @@ input[disabled] {
.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, .annotationLayer .textWidgetAnnotation :is(input, textarea):hover,
.annotationLayer .choiceWidgetAnnotation select:hover, .annotationLayer .choiceWidgetAnnotation select:hover,
.annotationLayer .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover {
.buttonWidgetAnnotation:is(.checkBox, .radioButton)
input:hover {
border: 2px solid var(--input-hover-border-color); border: 2px solid var(--input-hover-border-color);
} }
@@ -489,7 +478,6 @@ input:hover {
z-index: -1; z-index: -1;
} }
:root { :root {
--xfa-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>"); --xfa-unfocused-field-background: url("data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>");
--xfa-focus-outline: auto; --xfa-focus-outline: auto;
@@ -827,10 +815,7 @@ input:hover {
--freetext-padding: 2px; --freetext-padding: 2px;
--resizer-bg-color: var(--outline-color); --resizer-bg-color: var(--outline-color);
--resizer-size: 6px; --resizer-size: 6px;
--resizer-shift: calc( --resizer-shift: calc(0px - (var(--outline-width) + var(--resizer-size)) / 2 - var(--outline-around-width));
0px - (var(--outline-width) + var(--resizer-size)) / 2 -
var(--outline-around-width)
);
--editorFreeText-editing-cursor: text; --editorFreeText-editing-cursor: text;
--editorInk-editing-cursor: url(../images/cursor-editorInk.svg) 0 16, pointer; --editorInk-editing-cursor: url(../images/cursor-editorInk.svg) 0 16, pointer;
@@ -853,8 +838,7 @@ input:hover {
@media (-webkit-min-device-pixel-ratio: 1.1), (min-resolution: 1.1dppx) { @media (-webkit-min-device-pixel-ratio: 1.1), (min-resolution: 1.1dppx) {
:root { :root {
--editorFreeText-editing-cursor: url(../images/cursor-editorFreeText.svg) 0 16, --editorFreeText-editing-cursor: url(../images/cursor-editorFreeText.svg) 0 16, text;
text;
} }
} }
@@ -1109,216 +1093,354 @@ input:hover {
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight { :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomRight {
cursor: nwse-resize; cursor: nwse-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle { :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomMiddle {
cursor: ns-resize; cursor: ns-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft { :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomLeft {
cursor: nesw-resize; cursor: nesw-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft { :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.middleLeft {
cursor: ew-resize; cursor: ew-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topLeft,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight { :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomRight {
cursor: nesw-resize; cursor: nesw-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topMiddle,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomMiddle,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle { :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomMiddle {
cursor: ew-resize; cursor: ew-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.topRight,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.bottomLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft { :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.bottomLeft {
cursor: nwse-resize; cursor: nwse-resize;
} }
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.middleRight,
.annotationEditorLayer[data-main-rotation="0"] .annotationEditorLayer[data-main-rotation="0"]
:is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="90"], [data-editor-rotation="270"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="90"] .annotationEditorLayer[data-main-rotation="90"]
:is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="0"], [data-editor-rotation="180"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="180"] .annotationEditorLayer[data-main-rotation="180"]
:is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, :is([data-editor-rotation="270"], [data-editor-rotation="90"])
> .resizers
> .resizer.middleLeft,
.annotationEditorLayer[data-main-rotation="270"] .annotationEditorLayer[data-main-rotation="270"]
:is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft { :is([data-editor-rotation="180"], [data-editor-rotation="0"])
> .resizers
> .resizer.middleLeft {
cursor: ns-resize; cursor: ns-resize;
} }
.annotationEditorLayer .annotationEditorLayer
:is( :is(
[data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="0"] [data-editor-rotation="90"],
[data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="90"] [data-editor-rotation="0"],
[data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="180"] [data-editor-rotation="270"],
[data-main-rotation="270"] [data-editor-rotation="180"] [data-main-rotation="270"] [data-editor-rotation="180"]
) .altText { )
.altText {
rotate: 270deg; rotate: 270deg;
} }
[dir="ltr"] .annotationEditorLayer [dir="ltr"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="0"] [data-editor-rotation="90"],
[data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="90"] [data-editor-rotation="0"],
[data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="180"] [data-editor-rotation="270"],
[data-main-rotation="270"] [data-editor-rotation="180"] [data-main-rotation="270"] [data-editor-rotation="180"]
) .altText { )
.altText {
inset-inline-start: calc(100% - 8px); inset-inline-start: calc(100% - 8px);
} }
[dir="ltr"] .annotationEditorLayer [dir="ltr"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="0"] [data-editor-rotation="90"],
[data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="90"] [data-editor-rotation="0"],
[data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="180"] [data-editor-rotation="270"],
[data-main-rotation="270"] [data-editor-rotation="180"] [data-main-rotation="270"] [data-editor-rotation="180"]
) .altText.small { )
.altText.small {
inset-inline-start: calc(100% + 8px); inset-inline-start: calc(100% + 8px);
inset-block-start: 100%; inset-block-start: 100%;
} }
[dir="rtl"] .annotationEditorLayer [dir="rtl"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="0"] [data-editor-rotation="90"],
[data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="90"] [data-editor-rotation="0"],
[data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="180"] [data-editor-rotation="270"],
[data-main-rotation="270"] [data-editor-rotation="180"] [data-main-rotation="270"] [data-editor-rotation="180"]
) .altText { )
.altText {
inset-block-end: calc(100% - 8px); inset-block-end: calc(100% - 8px);
} }
[dir="rtl"] .annotationEditorLayer [dir="rtl"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="0"] [data-editor-rotation="90"],
[data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="90"] [data-editor-rotation="0"],
[data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="180"] [data-editor-rotation="270"],
[data-main-rotation="270"] [data-editor-rotation="180"] [data-main-rotation="270"] [data-editor-rotation="180"]
) .altText.small { )
.altText.small {
inset-inline-start: -8px; inset-inline-start: -8px;
inset-block-start: 0; inset-block-start: 0;
} }
.annotationEditorLayer .annotationEditorLayer
:is( :is(
[data-main-rotation="0"] [data-editor-rotation="180"], [data-main-rotation="0"] [data-editor-rotation="180"],
[data-main-rotation="90"] [data-editor-rotation="90"], [data-main-rotation="90"] [data-editor-rotation="90"],
[data-main-rotation="180"] [data-editor-rotation="0"], [data-main-rotation="180"] [data-editor-rotation="0"],
[data-main-rotation="270"] [data-editor-rotation="270"] [data-main-rotation="270"] [data-editor-rotation="270"]
) .altText { )
.altText {
rotate: 180deg; rotate: 180deg;
inset-block-end: calc(100% - 8px); inset-block-end: calc(100% - 8px);
@@ -1326,64 +1448,74 @@ input:hover {
} }
.annotationEditorLayer .annotationEditorLayer
:is( :is(
[data-main-rotation="0"] [data-editor-rotation="180"], [data-main-rotation="0"] [data-editor-rotation="180"],
[data-main-rotation="90"] [data-editor-rotation="90"], [data-main-rotation="90"] [data-editor-rotation="90"],
[data-main-rotation="180"] [data-editor-rotation="0"], [data-main-rotation="180"] [data-editor-rotation="0"],
[data-main-rotation="270"] [data-editor-rotation="270"] [data-main-rotation="270"] [data-editor-rotation="270"]
) .altText.small { )
.altText.small {
inset-inline-start: 100%; inset-inline-start: 100%;
inset-block-start: -8px; inset-block-start: -8px;
} }
.annotationEditorLayer .annotationEditorLayer
:is( :is(
[data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="0"] [data-editor-rotation="270"],
[data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="180"],
[data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="90"],
[data-main-rotation="270"] [data-editor-rotation="0"] [data-main-rotation="270"] [data-editor-rotation="0"]
) .altText { )
.altText {
rotate: 90deg; rotate: 90deg;
} }
[dir="ltr"] .annotationEditorLayer [dir="ltr"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="0"] [data-editor-rotation="270"],
[data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="180"],
[data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="90"],
[data-main-rotation="270"] [data-editor-rotation="0"] [data-main-rotation="270"] [data-editor-rotation="0"]
) .altText { )
.altText {
inset-block-end: calc(100% - 8px); inset-block-end: calc(100% - 8px);
} }
[dir="ltr"] .annotationEditorLayer [dir="ltr"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="0"] [data-editor-rotation="270"],
[data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="180"],
[data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="90"],
[data-main-rotation="270"] [data-editor-rotation="0"] [data-main-rotation="270"] [data-editor-rotation="0"]
) .altText.small { )
.altText.small {
inset-inline-start: -8px; inset-inline-start: -8px;
inset-block-start: 0; inset-block-start: 0;
} }
[dir="rtl"] .annotationEditorLayer [dir="rtl"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="0"] [data-editor-rotation="270"],
[data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="180"],
[data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="90"],
[data-main-rotation="270"] [data-editor-rotation="0"] [data-main-rotation="270"] [data-editor-rotation="0"]
) .altText { )
.altText {
inset-inline-start: calc(100% - 8px); inset-inline-start: calc(100% - 8px);
} }
[dir="rtl"] .annotationEditorLayer [dir="rtl"]
:is( .annotationEditorLayer
:is(
[data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="0"] [data-editor-rotation="270"],
[data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="180"],
[data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="90"],
[data-main-rotation="270"] [data-editor-rotation="0"] [data-main-rotation="270"] [data-editor-rotation="0"]
) .altText.small { )
.altText.small {
inset-inline-start: calc(100% + 8px); inset-inline-start: calc(100% + 8px);
inset-block-start: 100%; inset-block-start: 100%;
} }
@@ -1421,7 +1553,6 @@ input:hover {
} }
.altText.small { .altText.small {
inset-block-end: unset; inset-block-end: unset;
inset-inline-start: 0; inset-inline-start: 0;
inset-block-start: calc(100% + 8px); inset-block-start: calc(100% + 8px);
@@ -1515,7 +1646,6 @@ input:hover {
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.altText .tooltip.show { .altText .tooltip.show {
--alt-text-tooltip-bg: #1c1b22; --alt-text-tooltip-bg: #1c1b22;
--alt-text-tooltip-fg: #fbfbfe; --alt-text-tooltip-fg: #fbfbfe;
@@ -1524,7 +1654,6 @@ input:hover {
} }
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
.altText .tooltip.show { .altText .tooltip.show {
--alt-text-tooltip-bg: Canvas; --alt-text-tooltip-bg: Canvas;
--alt-text-tooltip-fg: CanvasText; --alt-text-tooltip-fg: CanvasText;
@@ -1581,7 +1710,6 @@ input:hover {
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
#altTextDialog { #altTextDialog {
--dialog-bg-color: #1c1b22; --dialog-bg-color: #1c1b22;
--dialog-border-color: #1c1b22; --dialog-border-color: #1c1b22;
@@ -1604,7 +1732,6 @@ input:hover {
} }
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
#altTextDialog { #altTextDialog {
--dialog-bg-color: Canvas; --dialog-bg-color: Canvas;
--dialog-border-color: CanvasText; --dialog-border-color: CanvasText;
@@ -2022,8 +2149,8 @@ input:hover {
--toolbar-border-color: rgba(184, 184, 184, 1); --toolbar-border-color: rgba(184, 184, 184, 1);
--toolbar-box-shadow: 0 1px 0 var(--toolbar-border-color); --toolbar-box-shadow: 0 1px 0 var(--toolbar-border-color);
--toolbar-border-bottom: none; --toolbar-border-bottom: none;
--toolbarSidebar-box-shadow: inset calc(-1px * var(--dir-factor)) 0 0 rgba(0, 0, 0, 0.25), --toolbarSidebar-box-shadow: inset calc(-1px * var(--dir-factor)) 0 0 rgba(0, 0, 0, 0.25), 0 1px 0 rgba(0, 0, 0, 0.15),
0 1px 0 rgba(0, 0, 0, 0.15), 0 0 1px rgba(0, 0, 0, 0.1); 0 0 1px rgba(0, 0, 0, 0.1);
--toolbarSidebar-border-bottom: none; --toolbarSidebar-border-bottom: none;
--button-hover-color: rgba(221, 222, 223, 1); --button-hover-color: rgba(221, 222, 223, 1);
--toggled-btn-color: rgba(0, 0, 0, 1); --toggled-btn-color: rgba(0, 0, 0, 1);
@@ -2319,8 +2446,7 @@ body {
font: message-box; font: message-box;
} }
:is(.toolbar, .editorParamsToolbar, .findbar, #sidebarContainer) :is(.toolbar, .editorParamsToolbar, .findbar, #sidebarContainer) :is(input, button, select),
:is(input, button, select),
.secondaryToolbar :is(input, button, a, select) { .secondaryToolbar :is(input, button, a, select) {
outline: none; outline: none;
font: message-box; font: message-box;
@@ -2428,8 +2554,7 @@ body {
animation: progressIndeterminate 1s linear infinite; animation: progressIndeterminate 1s linear infinite;
} }
#outerContainer.sidebarResizing #outerContainer.sidebarResizing :is(#sidebarContainer, #viewerContainer, #loadingBar) {
:is(#sidebarContainer, #viewerContainer, #loadingBar) {
/* Improve responsiveness and avoid visual glitches when the sidebar is resized. */ /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
transition-duration: 0s; transition-duration: 0s;
} }
@@ -2600,7 +2725,8 @@ body {
.doorHanger, .doorHanger,
.doorHangerRight { .doorHangerRight {
border-radius: 2px; border-radius: 2px;
box-shadow: 0 1px 5px var(--doorhanger-border-color), box-shadow:
0 1px 5px var(--doorhanger-border-color),
0 0 0 1px var(--doorhanger-border-color); 0 0 0 1px var(--doorhanger-border-color);
border: var(--doorhanger-border-color-whcm); border: var(--doorhanger-border-color-whcm);
} }
@@ -3455,8 +3581,7 @@ dialog :link {
cursor: grab !important; cursor: grab !important;
} }
.grab-to-pan-grab .grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
*:not(input):not(textarea):not(button):not(select):not(:link) {
cursor: inherit !important; cursor: inherit !important;
} }

View File

@@ -3323,13 +3323,13 @@
kind: OptionKind.WORKER kind: OptionKind.WORKER
}, },
workerSrc: { workerSrc: {
value: "/pdfjs/pdf.worker.js", value: "./pdfjs/pdf.worker.js",
kind: OptionKind.WORKER kind: OptionKind.WORKER
} }
}; };
{ {
defaultOptions.defaultUrl = { defaultOptions.defaultUrl = {
value: "/pdfjs/example/Welcome.pdf", value: "./pdfjs/example/Welcome.pdf",
kind: OptionKind.VIEWER kind: OptionKind.VIEWER
}; };
defaultOptions.disablePreferences = { defaultOptions.disablePreferences = {

View File

@@ -244,3 +244,19 @@ editor_stamp_add_image.title=Grafik hinzufügen
editor_free_text2_aria_label=Texteditor editor_free_text2_aria_label=Texteditor
editor_ink2_aria_label=Zeichnungseditor editor_ink2_aria_label=Zeichnungseditor
editor_ink_canvas_aria_label=Vom Benutzer erstelltes Bild editor_ink_canvas_aria_label=Vom Benutzer erstelltes Bild
# Alt-text dialog
# LOCALIZATION NOTE (editor_alt_text_button_label): Alternative text (alt text) helps
# when people can't see the image.
editor_alt_text_button_label=Alternativer Text
editor_alt_text_edit_button_label=Alternativer Text bearbeiten
editor_alt_text_dialog_label=Wählen Sie eine Option
editor_alt_text_dialog_description=Alternativer Text hilft, wenn die Leute das Bild nicht sehen können oder es nicht lädt.
editor_alt_text_add_description_label=Eine Beschreibung hinzufügen
editor_alt_text_add_description_description=Setzen Sie auf 12 Sätze, die das Thema, die Einstellung oder die Aktionen beschreiben.
editor_alt_text_mark_decorative_label=Als dekorativ markieren
editor_alt_text_mark_decorative_description=Dies wird für dekorative Bilder wie Ränder oder Wasserzeichen verwendet.
editor_alt_text_cancel_button=Abbrechen
editor_alt_text_save_button=Speichern
editor_alt_text_decorative_tooltip=Als dekorativ markiert
# This is a placeholder for the alt text input area
editor_alt_text_textarea.placeholder=Zum Beispiel: „Ein junger Mann setzt sich an einen Tisch, um eine Mahlzeit einzunehmen.“

View File

@@ -1,22 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" th:language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title='<3')}"></th:block>
</head>
<th:block th:insert="~{fragments/common :: head(title='<3')}"></th:block> <body>
<body>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br> <br> <br /><br />
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6"> <div class="col-md-6"></div>
</div> </div>
</div> </div>
</div> </div>
<div th:insert="~{fragments/footer.html :: footer}"></div> <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -1,62 +1,60 @@
<!doctype html> <!DOCTYPE html>
<html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" th:language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{account.title})}"></th:block>
</head>
<th:block th:insert="~{fragments/common :: head(title=#{account.title}, header=#{account.header})}"></th:block> <body>
<body>
<th:block th:insert="~{fragments/common :: game}"></th:block> <th:block th:insert="~{fragments/common :: game}"></th:block>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br> <br> <br /><br />
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-9"> <div class="col-md-9">
<!-- User Settings Title --> <!-- User Settings Title -->
<h2 class="text-center" th:text="#{account.accountSettings}">User Settings</h2> <h2 class="text-center" th:text="#{account.accountSettings}">User Settings</h2>
<hr> <hr />
<div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'notAuthenticated'}" class="alert alert-danger"> <th:block th:if="${param.messageType != null and param.messageType.size() > 0}">
<div th:if="${param.messageType[0] == 'notAuthenticated'}" class="alert alert-danger">
<span th:text="#{notAuthenticatedMessage}">Default message if not found</span> <span th:text="#{notAuthenticatedMessage}">Default message if not found</span>
</div> </div>
<div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'userNotFound'}" class="alert alert-danger"> <div th:if="${param.messageType[0] == 'userNotFound'}" class="alert alert-danger">
<span th:text="#{userNotFoundMessage}">Default message if not found</span> <span th:text="#{userNotFoundMessage}">Default message if not found</span>
</div> </div>
<div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'incorrectPassword'}" class="alert alert-danger"> <div th:if="${param.messageType[0] == 'incorrectPassword'}" class="alert alert-danger">
<span th:text="#{incorrectPasswordMessage}">Default message if not found</span> <span th:text="#{incorrectPasswordMessage}">Default message if not found</span>
</div> </div>
<div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'usernameExists'}" class="alert alert-danger"> <div th:if="${param.messageType[0] == 'usernameExists'}" class="alert alert-danger">
<span th:text="#{usernameExistsMessage}">Default message if not found</span> <span th:text="#{usernameExistsMessage}">Default message if not found</span>
</div> </div>
</th:block>
<!-- At the top of the user settings --> <!-- At the top of the user settings -->
<h3 class="text-center"><span th:text="#{welcome} + ' ' + ${username}">User</span>!</h3> <h3 class="text-center"><span th:text="#{welcome} + ' ' + ${username}">User</span>!</h3>
<th:block th:if="${error}">
<div th:if="${error}" class="alert alert-danger" role="alert"> <div class="alert alert-danger" role="alert">
<span th:text="${error}">Error Message</span> <span th:text="${error}">Error Message</span>
</div> </div>
</th:block>
<!-- Change Username Form --> <!-- Change Username Form -->
<h4></h4> <h4></h4>
<form action="api/v1/user/change-username" method="post"> <form action="api/v1/user/change-username" method="post">
<div class="mb-3"> <div class="mb-3">
<label for="newUsername" th:text="#{account.changeUsername}">Change Username</label> <label for="newUsername" th:text="#{account.changeUsername}">Change Username</label>
<input type="text" class="form-control" name="newUsername" id="newUsername" placeholder="New Username"> <input type="text" class="form-control" name="newUsername" id="newUsername" th:placeholder="#{account.newUsername}">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="currentPassword" th:text="#{password}">Password</label> <label for="currentPassword" th:text="#{password}">Password</label>
<input type="password" class="form-control" name="currentPassword" id="currentPasswordUsername" placeholder="Password"> <input type="password" class="form-control" name="currentPassword" id="currentPasswordUsername" th:placeholder="#{password}">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<button type="submit" class="btn btn-primary" th:text="#{account.changeUsername}">Change Username</button> <button type="submit" class="btn btn-primary" th:text="#{account.changeUsername}">Change Username</button>
</div> </div>
</form> </form>
<hr> <!-- Separator Line --> <hr /> <!-- Separator Line -->
<!-- Change Password Form --> <!-- Change Password Form -->
<h4 th:text="#{account.changePassword}">Change Password?</h4> <h4 th:text="#{account.changePassword}">Change Password?</h4>
@@ -78,12 +76,10 @@
</div> </div>
</form> </form>
<hr> <hr />
<div class="card"> <div class="card">
<div class="card-header" th:text="#{account.yourApiKey}"> <div class="card-header" th:text="#{account.yourApiKey}"></div>
</div>
<div class="card-body"> <div class="card-body">
<div class="input-group mb-3"> <div class="input-group mb-3">
<input type="password" class="form-control" id="apiKey" th:placeholder="#{account.yourApiKey}" readonly> <input type="password" class="form-control" id="apiKey" th:placeholder="#{account.yourApiKey}" readonly>
@@ -97,8 +93,6 @@
<button class="btn btn-outline-secondary" id="refreshBtn" type="button" onclick="refreshApiKey()"> <button class="btn btn-outline-secondary" id="refreshBtn" type="button" onclick="refreshApiKey()">
<img class="blackwhite-icon" id="eyeIcon" src="images/arrow-clockwise.svg" alt="Refresh API-Key" style="height:20px;"> <img class="blackwhite-icon" id="eyeIcon" src="images/arrow-clockwise.svg" alt="Refresh API-Key" style="height:20px;">
</button> </button>
</div> </div>
</div> </div>
</div> </div>
@@ -111,7 +105,6 @@
document.execCommand("copy"); document.execCommand("copy");
} }
function showApiKey() { function showApiKey() {
const apiKeyElement = document.getElementById("apiKey"); const apiKeyElement = document.getElementById("apiKey");
const copyBtn = document.getElementById("copyBtn"); const copyBtn = document.getElementById("copyBtn");
@@ -189,8 +182,7 @@
}); });
</script> </script>
<hr /> <!-- Separator Line -->
<hr> <!-- Separator Line -->
<h4 th:text="#{account.syncTitle}">Sync browser settings with Account</h4> <h4 th:text="#{account.syncTitle}">Sync browser settings with Account</h4>
<div class="container mt-4"> <div class="container mt-4">
@@ -212,24 +204,7 @@
<button id="syncToBrowser" class="btn btn-primary btn-sm" th:text="#{account.syncToBrowser}">Sync Account -> Browser</button> <button id="syncToBrowser" class="btn btn-primary btn-sm" th:text="#{account.syncToBrowser}">Sync Account -> Browser</button>
<button id="syncToAccount" class="btn btn-secondary btn-sm" th:text="#{account.syncToAccount}">Sync Account <- Browser</button> <button id="syncToAccount" class="btn btn-secondary btn-sm" th:text="#{account.syncToAccount}">Sync Account <- Browser</button>
</div> </div>
</div> </div>
<style>
.container {
width: 100%;
max-width: 800px;
margin: 0 auto;
}
.buttons-container {
margin-top: 20px;
text-align: center;
}
</style>
<script th:inline="javascript"> <script th:inline="javascript">
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
@@ -271,7 +246,6 @@
location.reload(); // Refresh the page after sync location.reload(); // Refresh the page after sync
}); });
document.getElementById('syncToAccount').addEventListener('click', function() { document.getElementById('syncToAccount').addEventListener('click', function() {
let form = document.createElement("form"); let form = document.createElement("form");
form.method = "POST"; form.method = "POST";
@@ -293,18 +267,7 @@
}); });
}); });
</script> </script>
<div class="mb-3 mt-4"> <div class="mb-3 mt-4">
<a href="logout"> <a href="logout">
<button type="button" class="btn btn-danger" th:text="#{account.signOut}">Sign Out</button> <button type="button" class="btn btn-danger" th:text="#{account.signOut}">Sign Out</button>
@@ -312,15 +275,12 @@
<a th:if="${role == 'ROLE_ADMIN'}" href="addUsers" target="_blank"> <a th:if="${role == 'ROLE_ADMIN'}" href="addUsers" target="_blank">
<button type="button" class="btn btn-info" th:text="#{account.adminSettings}">Admin Settings</button> <button type="button" class="btn btn-info" th:text="#{account.adminSettings}">Admin Settings</button>
</a> </a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div> </div>
</body> <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</body>
</html> </html>

View File

@@ -1,24 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" th:language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{adminUserSettings.title}, header=#{adminUserSettings.header})}"></th:block>
</head>
<th:block th:insert="~{fragments/common :: head(title=#{adminUserSettings.title}, header=#{adminUserSettings.header})}"></th:block> <body>
<body>
<th:block th:insert="~{fragments/common :: game}"></th:block> <th:block th:insert="~{fragments/common :: game}"></th:block>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br> <br> <br /><br />
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-8"> <div class="col-md-8">
<!-- User Settings Title --> <!-- User Settings Title -->
<h2 class="text-center" th:text="#{adminUserSettings.header}">Admin User Control Settings</h2> <h2 class="text-center" th:text="#{adminUserSettings.header}">Admin User Control Settings</h2>
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
@@ -40,8 +37,6 @@
</tbody> </tbody>
</table> </table>
<h2 th:text="#{adminUserSettings.addUser}">Add New User</h2> <h2 th:text="#{adminUserSettings.addUser}">Add New User</h2>
<div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'usernameExists'}" class="alert alert-danger"> <div th:if="${param.messageType != null and param.messageType.size() > 0 and param.messageType[0] == 'usernameExists'}" class="alert alert-danger">
<span th:text="#{usernameExistsMessage}">Default message if not found</span> <span th:text="#{usernameExistsMessage}">Default message if not found</span>
@@ -76,9 +71,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div th:insert="~{fragments/footer.html :: footer}"></div> <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
</body> </body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More