Repository navigation
Conversation
Code Review by Qodo🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)
Great, no issues found!Qodo reviewed your code and found no material issues that require reviewTip of the day💡 Did you know, you can describe a rule in plain language on the Rules page and Qodo drafts it for you |
PR Summary by QodoDocument Markdown publication export
AI Description
Diagram
High-Level Assessment
Files changed (1)
|
35 of 36 tasks
renovate-bot
pushed a commit
to renovate-bot/JabRef-_-jabref
that referenced
this pull request
Nov 13, 2026
### Summary Adds a Markdown publication export format for publishing bibliographies on Markdown websites. It includes the five most recent publications, the complete publication list, optional group sections, bibliographic details, and DOI, URL and portable PDF links. ### Steps to test 1. Run JabRef from this branch and open a library containing more than five publications. 2. Choose File → Export, select Markdown publications, and save the Markdown file. 3. Open the exported file in a Markdown preview. Confirm that Recent publications contains at most five entries and All publications contains every exported entry, ordered newest first. 4. Check entries with different publication years, months and days. Entries without usable publication dates should appear last. 5. Create a group named Export and add subgroups containing entries. Export again. Subgroup descriptions should become section headings, with subgroup names used when descriptions are blank. 6. Check an entry containing both DOI and URL fields. Its title should link to the DOI. 7. Check online and local PDF attachments. Online attachments should retain their links; local attachments should use paths relative to the exported Markdown file. 8. Move the Markdown file and local PDFs together, preserving their relative locations, and confirm that the local PDF links still work. I also verified that a local PDF attachment exports as a relative link and opens from the Markdown preview, and that an online PDF attachment retains its URL. Manual testing on macOS confirmed that the format appears in the export dialog and produces a rendered publication list containing five recent entries, all 15 example entries, and the two expected entries under Journal Publications. <img width="1019" height="419" alt="Screenshot 2026-10-27 at 8 36 14 PM" src="https://github.com/user-attachments/assets/6e811c24-64ec-4e52-a58b-db2ed20b9f17" /> <img width="1001" height="422" alt="Screenshot 2026-10-27 at 8 36 32 PM" src="https://github.com/user-attachments/assets/eeb206e6-474b-4abe-be20-29f1724a4c0c" /> ### Related issues and pull requests Closes JabRef#12729 Documentation: JabRef/user-documentation#710 ### AI usage ChatGPT Plus (GPT-6.1 Sol Light) assisted with code, tests, debugging and written material for this contribution. A group member reviewed successive versions of the patch. <details> <summary>AI CHECKLIST.md walkthrough</summary> # Code checklist ## 1. Code self-review ### Nullability and control flow - [x] No `== null` / `!= null` checks — JSpecify annotations (`@NullMarked`, `@Nullable`, `@NonNull`) used instead. - [x] No `Objects.requireNonNull(...)` — nullability expressed via JSpecify annotations. - [x] New classes annotated with `@NullMarked` (`org.jspecify.annotations.NullMarked`). - [/] New packages annotated with `@NullMarked` (`org.jspecify.annotations.NullMarked`). No new Java packages. - [x] `Optional` consumed with `ifPresent` / `ifPresentOrElse` / `map` / `orElseThrow` — never `orElse(unusedValue)` nor an `isPresent()` + `get()` block. - [/] `StringUtil.isBlank(...)` used instead of `s == null || s.isBlank()`. No combined null/blank checks. ### Exceptions - [x] No `catch (Exception e)` — only specific exceptions are caught. - [x] No `throw new RuntimeException(...)` / `IllegalStateException(...)` — these tear down the whole application. - [/] Logged exceptions are passed as the **last** logger argument (`LOGGER.info("...", e)`), not concatenated into the message string. No exception logging added. ### Style and idioms - [x] New `BibEntry` objects built with withers (`withField`, not `setField`). - [x] Modern Java used: `List.of()` / `Map.of()` / `Set.of()`, `Path.of()`, `SequencedCollection` / `SequencedSet`, text blocks. - [/] Regexes use a precompiled `Pattern.compile(...)` constant, not `String.matches(...)`. No Java regex calls added; layout expressions use the existing formatter mechanism. - [/] Keep alphabetical ordering when adding variables or enum items. No existing ordered variable or enum lists were extended. - [/] Background work uses `org.jabref.logic.util.BackgroundTask`, not `new Thread()`. No background tasks added. - [x] No commented-out code, no trivial comments restating the code, no AI-disclosure comments in source. - [/] Markdown Javadoc (`///`) uses Markdown syntax, not JavaDoc inline tags: `code` instead of `{@code}`, `[ClassName]` instead of `{@link}`. No Javadoc added. ### User-facing text - [x] All user-facing text localized (`Localization.lang` in Java, `%` prefix in FXML). - [x] Sentence case (not Title Case); no trailing `!`; labels do not end with `:`. - [/] Variance expressed with placeholders (`"...: %0"`), not string concatenation. No variable UI messages added. ### Security - [/] User-controlled data (request params, entry fields, file contents) is HTML-escaped before being written into any `text/html` response — including exception/error messages, not just the success body (XSS). This change produces Markdown files, not HTML responses. ### Tests - [/] In case issue lists an example, this concrete example is covered by a test case. The issue links an illustrative website rather than a reproducible fixture; its derived requirements are covered by exporter tests. - [x] Behavior changes in `org.jabref.model` / `org.jabref.logic` have added or updated tests. - [x] Tests assert object contents (`assertEquals`), use plain JUnit asserts (not AssertJ), have no `@DisplayName`, do not catch exceptions (let them propagate so JUnit reports setup/teardown failures directly), and use `@TempDir` instead of manual temp directories. - [/] Fetcher tests hit the live endpoints — the remote API is not mocked or stubbed (automated-review suggestions to mock it are rejected on purpose). No fetcher changes. ## 2. Verification commands - [x] `./gradlew :jablib:check` (or `./gradlew check` for all modules). - [x] `./gradlew checkstyleMain checkstyleTest checkstyleJmh`. - [x] `./gradlew modernizer`. - [x] `./gradlew --no-configuration-cache :rewriteDryRun` reports no changes (run `./gradlew rewriteRun` to fix). - [x] `./gradlew javadoc`. - [x] `npx markdownlint-cli2 "docs/**/*.md" "*.md"` (only if Markdown changed). - [x] `npm ci && npm run textlint` reports no misspellings (only if Markdown changed). - [/] Only if formatting is still off after `rewriteRun`: `docker run -v $(pwd):/github/workspace ghcr.io/leventebajczi/intellij-format:master "*.java" "" ".idea/codeStyles/Project.xml"`. After the final convention fixes, the exporter test suite, OpenRewrite dry run, and jablib main/test Checkstyle checks passed again. ## 3. Documentation - [x] `CHANGELOG.md` entry added if the change is visible to the user (end-user wording, no extra blank lines, sorted in next to existing entries about the same component/feature). Link the issue if one exists; link the PR only when no issue exists. Use `TODO` as the placeholder when neither is known yet — never a fake number. No entry for fixes to changes that were themselves introduced after the last release (feature only in `## [Unreleased]`) — update the existing unreleased entry instead if needed. - [x] Searched [jabref/issues](https://github.com/JabRef/jabref/issues) and [jabref-koppor/issues](https://github.com/JabRef/jabref-koppor/issues) for a related issue; linked only on a confident match, otherwise kept `TODO` (no `closes`/`fixes` for merely-similar issues). Searched both repositories for `is:issue markdown export`. JabRef#12729 is the direct match; no additional issues are claimed as fixed. - [x] Requirement added to `docs/requirements/<area>.md` if the change is a new feature or significant bug fix (skip for refactors, minor fixes, and internal changes). - [x] Developer documentation under `docs/` updated if behavior or architecture changed. The new export behavior is documented in `docs/requirements/export.md`, covering publication ordering, group sections and portable links, with references to the implementation and tests. Requirements and implementation/test references are present. User documentation submitted: JabRef/user-documentation#710 ## 4. Pull request - [x] PR body built from `.github/PULL_REQUEST_TEMPLATE.md`, every section filled. - [x] All checklist items kept and marked `[x]`, `[ ]`, or `[/]`. - [x] "Steps to test" is a numbered list with a cropped screenshot of the result for every visible change; no video (only allowed when another program is involved, e.g. drag and drop or push to an external application). - [x] All HTML comments removed from the PR body. - [ ] PR created with `gh pr create --body-file <file>` (not `--body`). - [/] If `CHANGELOG.md` used a `TODO` placeholder (no issue confidently identified yet — an existing issue link always stays), the PR was opened as draft, the placeholder was replaced with the real PR-number link after PR creation, committed and pushed, and only then was the PR marked ready for review. If an issue is identified or created later, the link is switched to the issue. The PR is currently being prepared through GitHub's browser interface. CLI creation has not been performed. </details> ### Validation The following checks passed during development: - `./gradlew :jablib:check` - `./gradlew checkstyleMain checkstyleTest checkstyleJmh` - `./gradlew modernizer` - `./gradlew --no-configuration-cache :rewriteDryRun` - `./gradlew javadoc` - `npx markdownlint-cli2 "docs/**/*.md" "*.md"` - `npm ci && npm run textlint` - Requirement traceability validation After the latest code-convention changes, the MarkdownPublicationExporterTest suite, OpenRewrite dry run, and jablib main/test Checkstyle checks passed again. ### Checklist - [x] I own the copyright of the code submitted and I license it under the [MIT license](https://github.com/JabRef/jabref/blob/main/LICENSE) - [x] If AI tools were used, I disclosed them in the "AI usage" section and reviewed, understood, and take full ownership of all AI-generated code - [x] I manually tested my changes in running JabRef (always required) - [x] I added JUnit tests for changes (if applicable) - [x] I added screenshots in the PR description (if change is visible to the user) - [x] I added **one sentence (max 20 words)** to `CHANGELOG.md` describing the change from the user's point of view (if the change is visible to the user) - [x] I checked the [user documentation](https://docs.jabref.org/) for up to dateness and submitted a pull request to our [user documentation repository](https://github.com/JabRef/user-documentation/tree/main/en) --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Siedlerchr <siedlerkiller@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request Description
Summary
This updates
en/collaborative-work/export/README.mdwith instructions for Markdown publication exports, including date ordering, group sections and PDF links. This documentation describes the proposed exporter, whose implementation has not yet merged into JabRef.Steps to test
en/collaborative-work/export/README.mdand check the headings, numbered instructions and lists.Ujjwals17/jabref, branchfeature/markdown-publication-export.Related issues and pull requests
Documents JabRef/jabref#12729
Implementation: JabRef/jabref#17598
AI usage
ChatGPT Plus (GPT-6.1 Sol Light) assisted with reviewing the documentation and PR description.
Checklist
feature/markdown-publication-export)