Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–132 unchanged (132 lines)
133 });
134
135 var genreNodes = _document.SelectNodes("//dc:subject", _namespaceManager);
136
137 if (genreNodes?.Count > 0)
138 {
139 foreach (var node in genreNodes.Cast<XmlNode>().Where(node => !book.Genres.Contains(node.InnerText)))
140 {
141 book.AddGenre(node.InnerText);
142 }
143 }
144
145 ReadInt32AttributeInto("//opf:meta[@name='calibre:series_index']", index => book.IndexNumber = index);
146 ReadInt32AttributeInto("//opf:meta[@name='calibre:rating']", rating => book.CommunityRating = rating);
147
…lines 148–326 unchanged (179 lines)

After

…lines 1–132 unchanged (132 lines)
133 });
134
135 var genreNodes = _document.SelectNodes("//dc:subject", _namespaceManager);
136
137 if (genreNodes?.Count > 0)
138 {
139 foreach (var node in genreNodes.Cast<XmlNode>().Where(node => !string.IsNullOrEmpty(node.InnerText) && !book.Genres.Contains(node.InnerText)))
140 {
141 // specification has no rules about content and some books combine every genre into a single element
142 foreach (var item in node.InnerText.Split(["/", "&", ",", ";", " - "], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
143 {
144 book.AddGenre(item);
145 }
146 }
147 }
148
149 ReadInt32AttributeInto("//opf:meta[@name='calibre:series_index']", index => book.IndexNumber = index);
150 ReadInt32AttributeInto("//opf:meta[@name='calibre:rating']", rating => book.CommunityRating = rating);
151
…lines 152–330 unchanged (179 lines)

Before

compilation_unit
using_directive
using "using"
identifier "System"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Globalization"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "IO"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Linq"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Threading"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Xml"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "Jellyfin"
. "."
identifier "Data"
. "."
identifier "Enums"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Controller"
. "."
identifier "Entities"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Controller"
. "."
identifier "Providers"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Model"
. "."
identifier "Entities"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Model"
. "."
identifier "Net"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "Microsoft"
. "."
identifier "Extensions"
. "."
identifier "Logging"
; ";"
namespace_declaration
namespace "namespace"
qualified_name
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Providers"
. "."
identifier "Books"
. "."
identifier "OpenPackagingFormat"
declaration_list
{ "{"
comment "/// <summary>"
comment "/// Methods used to pull metadata and other information from"...
comment "/// </summary>"
comment "/// <typeparam name=\"TCategoryName\">The type of category.</t"...
class_declaration
modifier
public "public"
class "class"
identifier "OpfReader"
type_parameter_list
< "<"
type_parameter
identifier "TCategoryName"
> ">"
declaration_list
{ "{"
field_declaration
modifier
private "private"
modifier
const "const"
variable_declaration
predefined_type "string"
variable_declarator
identifier "DcNamespace"
= "="
verbatim_string_literal "@\"http://purl.org/dc/elements/1.1/\""
; ";"
field_declaration
modifier
private "private"
modifier
const "const"
variable_declaration
predefined_type "string"
variable_declarator
identifier "OpfNamespace"
= "="
verbatim_string_literal "@\"http://www.idpf.org/2007/opf\""
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
identifier "XmlNamespaceManager"
variable_declarator
identifier "_namespaceManager"
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
identifier "XmlDocument"
variable_declarator
identifier "_document"
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
generic_name
identifier "ILogger"
type_argument_list
< "<"
identifier "TCategoryName"
> ">"
variable_declarator
identifier "_logger"
; ";"
comment "/// <summary>"
comment "/// Initializes a new instance of the <see cref=\"OpfReader{T"...
comment "/// </summary>"
comment "/// <param name=\"document\">The XML document to parse.</param"...
comment "/// <param name=\"logger\">Instance of the <see cref=\"ILogger{"...
constructor_declaration (+86 nodes collapsed)
comment "/// <summary>"
comment "/// Checks for the existence of a cover image."
comment "/// </summary>"
comment "/// <param name=\"opfRootDirectory\">The root directory in whi"...
comment "/// <returns>Returns the found cover and its type or null.</"...
method_declaration (+432 nodes collapsed)
comment "/// <summary>"
comment "/// Read all supported OPF data from the file."
comment "/// </summary>"
comment "/// <param name=\"cancellationToken\">The cancellation token.<"...
comment "/// <returns>The metadata result to update.</returns>"
method_declaration (+108 nodes collapsed)
method_declaration
modifier
private "private"
identifier "Book"
identifier "CreateBookFromOpf"
parameter_list
( "("
) ")"
block
{ "{"
local_declaration_statement (+32 nodes collapsed)
expression_statement (+24 nodes collapsed)
expression_statement (+27 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+71 nodes collapsed)
local_declaration_statement (+24 nodes collapsed)
if_statement
if "if"
( "("
binary_expression
conditional_access_expression
identifier "genreNodes"
? "?"
member_binding_expression
. "."
identifier "Count"
> ">"
integer_literal "0"
) ")"
block
{ "{"
foreach_statement
foreach "foreach"
( "("
implicit_type
var "var"
identifier "node"
in "in"
invocation_expression
member_access_expression
invocation_expression
member_access_expression
identifier "genreNodes"
. "."
generic_name
identifier "Cast"
type_argument_list
< "<"
identifier "XmlNode"
> ">"
argument_list
( "("
) ")"
. "."
identifier "Where"
argument_list
( "("
argument
lambda_expression
implicit_parameter "node"
=> "=>"
prefix_unary_expression
! "!"
invocation_expression
member_access_expression
member_access_expression
identifier "book"
. "."
identifier "Genres"
. "."
identifier "Contains"
argument_list
( "("
argument
member_access_expression
identifier "node"
. "."
identifier "InnerText"
) ")"
) ")"
) ")"
block
{ "{"
expression_statement
invocation_expression
member_access_expression
identifier "book"
. "."
identifier "AddGenre"
argument_list
( "("
argument
member_access_expression
identifier "node"
. "."
identifier "InnerText"
) ")"
; ";"
} "}"
} "}"
expression_statement (+24 nodes collapsed)
expression_statement (+24 nodes collapsed)
local_declaration_statement (+24 nodes collapsed)
if_statement (+94 nodes collapsed)
return_statement
return "return"
identifier "book"
; ";"
} "}"
method_declaration (+244 nodes collapsed)
method_declaration (+220 nodes collapsed)
method_declaration (+148 nodes collapsed)
method_declaration (+186 nodes collapsed)
method_declaration (+87 nodes collapsed)
method_declaration (+158 nodes collapsed)
method_declaration (+81 nodes collapsed)
method_declaration (+163 nodes collapsed)
method_declaration (+56 nodes collapsed)
} "}"
} "}"

After

compilation_unit
using_directive
using "using"
identifier "System"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Globalization"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "IO"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Linq"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Threading"
; ";"
using_directive
using "using"
qualified_name
identifier "System"
. "."
identifier "Xml"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "Jellyfin"
. "."
identifier "Data"
. "."
identifier "Enums"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Controller"
. "."
identifier "Entities"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Controller"
. "."
identifier "Providers"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Model"
. "."
identifier "Entities"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Model"
. "."
identifier "Net"
; ";"
using_directive
using "using"
qualified_name
qualified_name
identifier "Microsoft"
. "."
identifier "Extensions"
. "."
identifier "Logging"
; ";"
namespace_declaration
namespace "namespace"
qualified_name
qualified_name
qualified_name
identifier "MediaBrowser"
. "."
identifier "Providers"
. "."
identifier "Books"
. "."
identifier "OpenPackagingFormat"
declaration_list
{ "{"
comment "/// <summary>"
comment "/// Methods used to pull metadata and other information from"...
comment "/// </summary>"
comment "/// <typeparam name=\"TCategoryName\">The type of category.</t"...
class_declaration
modifier
public "public"
class "class"
identifier "OpfReader"
type_parameter_list
< "<"
type_parameter
identifier "TCategoryName"
> ">"
declaration_list
{ "{"
field_declaration
modifier
private "private"
modifier
const "const"
variable_declaration
predefined_type "string"
variable_declarator
identifier "DcNamespace"
= "="
verbatim_string_literal "@\"http://purl.org/dc/elements/1.1/\""
; ";"
field_declaration
modifier
private "private"
modifier
const "const"
variable_declaration
predefined_type "string"
variable_declarator
identifier "OpfNamespace"
= "="
verbatim_string_literal "@\"http://www.idpf.org/2007/opf\""
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
identifier "XmlNamespaceManager"
variable_declarator
identifier "_namespaceManager"
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
identifier "XmlDocument"
variable_declarator
identifier "_document"
; ";"
field_declaration
modifier
private "private"
modifier
readonly "readonly"
variable_declaration
generic_name
identifier "ILogger"
type_argument_list
< "<"
identifier "TCategoryName"
> ">"
variable_declarator
identifier "_logger"
; ";"
comment "/// <summary>"
comment "/// Initializes a new instance of the <see cref=\"OpfReader{T"...
comment "/// </summary>"
comment "/// <param name=\"document\">The XML document to parse.</param"...
comment "/// <param name=\"logger\">Instance of the <see cref=\"ILogger{"...
constructor_declaration (+86 nodes collapsed)
comment "/// <summary>"
comment "/// Checks for the existence of a cover image."
comment "/// </summary>"
comment "/// <param name=\"opfRootDirectory\">The root directory in whi"...
comment "/// <returns>Returns the found cover and its type or null.</"...
method_declaration (+432 nodes collapsed)
comment "/// <summary>"
comment "/// Read all supported OPF data from the file."
comment "/// </summary>"
comment "/// <param name=\"cancellationToken\">The cancellation token.<"...
comment "/// <returns>The metadata result to update.</returns>"
method_declaration (+108 nodes collapsed)
method_declaration
modifier
private "private"
identifier "Book"
identifier "CreateBookFromOpf"
parameter_list
( "("
) ")"
block
{ "{"
local_declaration_statement (+32 nodes collapsed)
expression_statement (+24 nodes collapsed)
expression_statement (+27 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+33 nodes collapsed)
expression_statement (+71 nodes collapsed)
local_declaration_statement (+24 nodes collapsed)
if_statement
if "if"
( "("
binary_expression
conditional_access_expression
identifier "genreNodes"
? "?"
member_binding_expression
. "."
identifier "Count"
> ">"
integer_literal "0"
) ")"
block
{ "{"
foreach_statement
foreach "foreach"
( "("
implicit_type
var "var"
identifier "node"
in "in"
invocation_expression
member_access_expression
invocation_expression
member_access_expression
identifier "genreNodes"
. "."
generic_name
identifier "Cast"
type_argument_list
< "<"
identifier "XmlNode"
> ">"
argument_list
( "("
) ")"
. "."
identifier "Where"
argument_list
( "("
argument
lambda_expression
implicit_parameter "node"
=> "=>"
binary_expression
prefix_unary_expression
! "!"
invocation_expression
member_access_expression
predefined_type "string"
. "."
identifier "IsNullOrEmpty"
argument_list
( "("
argument
member_access_expression
identifier "node"
. "."
identifier "InnerText"
) ")"
&& "&&"
prefix_unary_expression
! "!"
invocation_expression
member_access_expression
member_access_expression
identifier "book"
. "."
identifier "Genres"
. "."
identifier "Contains"
argument_list
( "("
argument
member_access_expression
identifier "node"
. "."
identifier "InnerText"
) ")"
) ")"
) ")"
block
{ "{"
comment "// specification has no rules about content and some books c"...
foreach_statement
foreach "foreach"
( "("
implicit_type
var "var"
identifier "item"
in "in"
invocation_expression
member_access_expression
member_access_expression
identifier "node"
. "."
identifier "InnerText"
. "."
identifier "Split"
argument_list
( "("
argument
collection_expression
[ "["
collection_element
expression_element
string_literal
" "\""
string_literal_content "/"
" "\""
, ","
collection_element
expression_element
string_literal
" "\""
string_literal_content "&"
" "\""
, ","
collection_element
expression_element
string_literal
" "\""
string_literal_content ","
" "\""
, ","
collection_element
expression_element
string_literal
" "\""
string_literal_content ";"
" "\""
, ","
collection_element
expression_element
string_literal
" "\""
string_literal_content " - "
" "\""
] "]"
, ","
argument
binary_expression
member_access_expression
identifier "StringSplitOptions"
. "."
identifier "RemoveEmptyEntries"
| "|"
member_access_expression
identifier "StringSplitOptions"
. "."
identifier "TrimEntries"
) ")"
) ")"
block
{ "{"
expression_statement
invocation_expression
member_access_expression
identifier "book"
. "."
identifier "AddGenre"
argument_list
( "("
argument
identifier "item"
) ")"
; ";"
} "}"
} "}"
} "}"
expression_statement (+24 nodes collapsed)
expression_statement (+24 nodes collapsed)
local_declaration_statement (+24 nodes collapsed)
if_statement (+94 nodes collapsed)
return_statement
return "return"
identifier "book"
; ";"
} "}"
method_declaration (+244 nodes collapsed)
method_declaration (+220 nodes collapsed)
method_declaration (+148 nodes collapsed)
method_declaration (+186 nodes collapsed)
method_declaration (+87 nodes collapsed)
method_declaration (+158 nodes collapsed)
method_declaration (+81 nodes collapsed)
method_declaration (+163 nodes collapsed)
method_declaration (+56 nodes collapsed)
} "}"
} "}"