Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,4 @@ RUN mkdir -p "$HOME/.gradle" && \
echo "org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" > "$HOME/.gradle/gradle.properties" && \
echo "org.gradle.caching=true" >> "$HOME/.gradle/gradle.properties" && \
echo "org.gradle.parallel=true" >> "$HOME/.gradle/gradle.properties" && \
echo "org.gradle.configureondemand=true" >> "$HOME/.gradle/gradle.properties" && \
echo "kapt.incremental.apt=true" >> "$HOME/.gradle/gradle.properties"
echo "org.gradle.configureondemand=true" >> "$HOME/.gradle/gradle.properties"
1 change: 0 additions & 1 deletion .github/workflows/analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,5 @@ jobs:
echo "org.gradle.jvmargs=-Xmx5g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g"
echo "org.gradle.configureondemand=true"
echo "org.gradle.configuration-cache=false"
echo "kapt.incremental.apt=true"
} > "$HOME/.gradle/gradle.properties"
scripts/analysis/analysis-wrapper.sh "${{ steps.get-vars.outputs.branch }}" "${{ secrets.LOG_USERNAME }}" "${{ secrets.LOG_PASSWORD }}" "$GITHUB_RUN_NUMBER" "${{ steps.get-vars.outputs.pr }}"
1 change: 0 additions & 1 deletion .github/workflows/assembleFlavors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,4 @@ jobs:
echo "org.gradle.caching=true" >> gradle.properties
echo "org.gradle.parallel=true" >> gradle.properties
echo "org.gradle.configureondemand=true" >> gradle.properties
echo "kapt.incremental.apt=true" >> gradle.properties
./gradlew assemble${{ matrix.flavor }}
2 changes: 1 addition & 1 deletion .github/workflows/qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
run: |
mkdir -p "$HOME/.gradle"
echo "org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g" > "$HOME/.gradle/gradle.properties"
echo "org.gradle.caching=true; org.gradle.parallel=true; org.gradle.configureondemand=true; kapt.incremental.apt=true" >> "$HOME/.gradle/gradle.properties"
echo "org.gradle.caching=true; org.gradle.parallel=true; org.gradle.configureondemand=true" >> "$HOME/.gradle/gradle.properties"
sed -i "/qa/,/\}/ s/versionCode.*/versionCode = ${{ github.event.number }}/" app/build.gradle.kts
sed -i "/qa/,/\}/ s/versionName.*/versionName = \"${{ github.event.number }}\"/" app/build.gradle.kts
./gradlew assembleQaDebug
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/screenShotTest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ jobs:
echo "org.gradle.caching=true" >> $HOME/.gradle/gradle.properties
echo "org.gradle.parallel=true" >> $HOME/.gradle/gradle.properties
echo "org.gradle.configureondemand=true" >> $HOME/.gradle/gradle.properties
echo "kapt.incremental.apt=true" >> $HOME/.gradle/gradle.properties

- name: Build gplay
run: ./gradlew assembleGenericDebug
Expand Down
4 changes: 0 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.spotless)
alias(libs.plugins.kapt)
alias(libs.plugins.ksp)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.kotlin.parcelize)
Expand Down Expand Up @@ -243,8 +242,6 @@ android {

}

kapt.useBuildCache = true

ksp.arg("room.schemaLocation", "$projectDir/schemas")

kotlin.compilerOptions.jvmTarget.set(JvmTarget.JVM_17)
Expand Down Expand Up @@ -460,7 +457,6 @@ dependencies {

// region Markdown rendering
implementation(libs.bundles.markdown.rendering)
kapt(libs.prism4j.bundler)
// endregion

// region Image cropping / rotation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import io.noties.markwon.syntax.Prism4jThemeDefault
import io.noties.markwon.syntax.SyntaxHighlightPlugin
import io.noties.prism4j.Prism4j
import io.noties.prism4j.annotations.PrismBundle
import third_parties.io.noties.prism4j.languages.MarkwonGrammarLocator
import javax.inject.Inject

@PrismBundle(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 Your Name <[email protected]>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package third_parties.io.noties.prism4j.languages;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import io.noties.prism4j.GrammarLocator;
import io.noties.prism4j.Prism4j;

public class MarkwonGrammarLocator implements GrammarLocator {

@SuppressWarnings("ConstantConditions")
private static final Prism4j.Grammar NULL =
new Prism4j.Grammar() {
@NotNull
@Override
public String name() {
return null;
}

@NotNull
@Override
public List<Prism4j.Token> tokens() {
return null;
}
};

private final Map<String, Prism4j.Grammar> cache = new HashMap<>(3);

@Nullable
@Override
public Prism4j.Grammar grammar(@NotNull Prism4j prism4j, @NotNull String language) {

final String name = realLanguageName(language);

Prism4j.Grammar grammar = cache.get(name);
if (grammar != null) {
if (NULL == grammar) {
grammar = null;
}
return grammar;
}

grammar = obtainGrammar(prism4j, name);
if (grammar == null) {
cache.put(name, NULL);
} else {
cache.put(name, grammar);
triggerModify(prism4j, name);
}

return grammar;
}

@NotNull
protected String realLanguageName(@NotNull String name) {
final String out;
switch (name) {
case "dotnet":
out = "csharp";
break;
case "js":
out = "javascript";
break;
case "jsonp":
out = "json";
break;
case "xml":
case "html":
case "mathml":
case "svg":
out = "markup";
break;
default:
out = name;
}
return out;
}

@Nullable
protected Prism4j.Grammar obtainGrammar(@NotNull Prism4j prism4j, @NotNull String name) {
final Prism4j.Grammar grammar;
switch (name) {
case "c":
grammar = Prism_c.create(prism4j);
break;
case "clike":
grammar = Prism_clike.create(prism4j);
break;
case "clojure":
grammar = Prism_clojure.create(prism4j);
break;
case "cpp":
grammar = Prism_cpp.create(prism4j);
break;
case "csharp":
grammar = Prism_csharp.create(prism4j);
break;
case "css":
grammar = Prism_css.create(prism4j);
break;
case "dart":
grammar = Prism_dart.create(prism4j);
break;
case "git":
grammar = Prism_git.create(prism4j);
break;
case "go":
grammar = Prism_go.create(prism4j);
break;
case "groovy":
grammar = Prism_groovy.create(prism4j);
break;
case "java":
grammar = Prism_java.create(prism4j);
break;
case "javascript":
grammar = Prism_javascript.create(prism4j);
break;
case "json":
grammar = Prism_json.create(prism4j);
break;
case "kotlin":
grammar = Prism_kotlin.create(prism4j);
break;
case "latex":
grammar = Prism_latex.create(prism4j);
break;
case "makefile":
grammar = Prism_makefile.create(prism4j);
break;
case "markdown":
grammar = Prism_markdown.create(prism4j);
break;
case "markup":
grammar = Prism_markup.create(prism4j);
break;
case "python":
grammar = Prism_python.create(prism4j);
break;
case "scala":
grammar = Prism_scala.create(prism4j);
break;
case "sql":
grammar = Prism_sql.create(prism4j);
break;
case "swift":
grammar = Prism_swift.create(prism4j);
break;
case "yaml":
grammar = Prism_yaml.create(prism4j);
break;
default:
grammar = null;
}
return grammar;
}

protected void triggerModify(@NotNull Prism4j prism4j, @NotNull String name) {
switch (name) {
case "markup":
prism4j.grammar("css");
prism4j.grammar("javascript");
break;
}
}

@Override
@NotNull
public Set<String> languages() {
final Set<String> set = new HashSet<String>(23);
set.add("c");
set.add("clike");
set.add("clojure");
set.add("cpp");
set.add("csharp");
set.add("css");
set.add("dart");
set.add("git");
set.add("go");
set.add("groovy");
set.add("java");
set.add("javascript");
set.add("json");
set.add("kotlin");
set.add("latex");
set.add("makefile");
set.add("markdown");
set.add("markup");
set.add("python");
set.add("scala");
set.add("sql");
set.add("swift");
set.add("yaml");
return set;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 Your Name <[email protected]>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package third_parties.io.noties.prism4j.languages;

import org.jetbrains.annotations.NotNull;

import io.noties.prism4j.GrammarUtils;
import io.noties.prism4j.Prism4j;
import io.noties.prism4j.annotations.Extend;

import static io.noties.prism4j.Prism4j.grammar;
import static io.noties.prism4j.Prism4j.pattern;
import static io.noties.prism4j.Prism4j.token;
import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.MULTILINE;
import static java.util.regex.Pattern.compile;

@SuppressWarnings("unused")
@Extend("clike")
public class Prism_c {

@NotNull
public static Prism4j.Grammar create(@NotNull Prism4j prism4j) {

final Prism4j.Grammar c = GrammarUtils.extend(
GrammarUtils.require(prism4j, "clike"),
"c",
new GrammarUtils.TokenFilter() {
@Override
public boolean test(@NotNull Prism4j.Token token) {
final String name = token.name();
return !"class-name".equals(name) && !"boolean".equals(name);
}
},
token("keyword", pattern(compile("\\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\\b"))),
token("operator", pattern(compile("-[>-]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|\\|?|[~^%?*\\/]"))),
token("number", pattern(compile("(?:\\b0x[\\da-f]+|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]*", CASE_INSENSITIVE)))
);

GrammarUtils.insertBeforeToken(c, "string",
token("macro", pattern(
compile("(^\\s*)#\\s*[a-z]+(?:[^\\r\\n\\\\]|\\\\(?:\\r\\n|[\\s\\S]))*", CASE_INSENSITIVE | MULTILINE),
true,
false,
"property",
grammar("inside",
token("string", pattern(compile("(#\\s*include\\s*)(?:<.+?>|(\"|')(?:\\\\?.)+?\\2)"), true)),

Check failure

Code scanning / CodeQL

Inefficient regular expression High

This part of the regular expression may cause exponential backtracking on strings starting with '#include"' and containing many repetitions of '\a'.
token("directive", pattern(
compile("(#\\s*)\\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\\b"),
true,
false,
"keyword"
))
)
)),
token("constant", pattern(compile("\\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\\b")))
);

return c;
}
}
Loading
Loading