Skip to content

Commit ec0e033

Browse files
authored
Azure Linux host detection code added
Added optional chromium start argument to ctor
2 parents f2b46ef + 2740f01 commit ec0e033

File tree

7 files changed

+244
-25
lines changed

7 files changed

+244
-25
lines changed

.editorconfig

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
# Remove the line below if you want to inherit .editorconfig settings from higher directories
2+
root = true
3+
4+
[*.sh]
5+
end_of_line = lf
6+
7+
# C# files
8+
[*.cs]
9+
10+
#### Core EditorConfig Options ####
11+
12+
# Indentation and spacing
13+
indent_size = 4
14+
indent_style = space
15+
tab_width = 4
16+
17+
# New line preferences
18+
end_of_line = crlf
19+
insert_final_newline = false
20+
21+
#### .NET Coding Conventions ####
22+
23+
# Organize usings
24+
dotnet_separate_import_directive_groups = false
25+
dotnet_sort_system_directives_first = false
26+
27+
# this. and Me. preferences
28+
dotnet_style_qualification_for_event = false:silent
29+
dotnet_style_qualification_for_field = false:silent
30+
dotnet_style_qualification_for_method = false:silent
31+
dotnet_style_qualification_for_property = false:silent
32+
33+
# Language keywords vs BCL types preferences
34+
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
35+
dotnet_style_predefined_type_for_member_access = true:silent
36+
37+
# Parentheses preferences
38+
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
39+
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
40+
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
41+
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
42+
43+
# Modifier preferences
44+
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
45+
46+
# Expression-level preferences
47+
dotnet_style_coalesce_expression = true:suggestion
48+
dotnet_style_collection_initializer = true:suggestion
49+
dotnet_style_explicit_tuple_names = true:suggestion
50+
dotnet_style_null_propagation = true:suggestion
51+
dotnet_style_object_initializer = true:suggestion
52+
dotnet_style_prefer_auto_properties = true:silent
53+
dotnet_style_prefer_compound_assignment = true:suggestion
54+
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
55+
dotnet_style_prefer_conditional_expression_over_return = true:silent
56+
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
57+
dotnet_style_prefer_inferred_tuple_names = true:suggestion
58+
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
59+
dotnet_style_prefer_simplified_interpolation = true:suggestion
60+
61+
# Field preferences
62+
dotnet_style_readonly_field = true:suggestion
63+
64+
# Parameter preferences
65+
dotnet_code_quality_unused_parameters = all:suggestion
66+
67+
#### C# Coding Conventions ####
68+
69+
# var preferences
70+
csharp_style_var_elsewhere = true:silent
71+
csharp_style_var_for_built_in_types = true:silent
72+
csharp_style_var_when_type_is_apparent = true:silent
73+
74+
# Expression-bodied members
75+
csharp_style_expression_bodied_accessors = true:silent
76+
csharp_style_expression_bodied_constructors = false:silent
77+
csharp_style_expression_bodied_indexers = true:silent
78+
csharp_style_expression_bodied_lambdas = true:silent
79+
csharp_style_expression_bodied_local_functions = false:silent
80+
csharp_style_expression_bodied_methods = false:silent
81+
csharp_style_expression_bodied_operators = false:silent
82+
csharp_style_expression_bodied_properties = true:silent
83+
84+
# Pattern matching preferences
85+
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
86+
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
87+
csharp_style_prefer_switch_expression = true:suggestion
88+
89+
# Null-checking preferences
90+
csharp_style_conditional_delegate_call = true:suggestion
91+
92+
# Modifier preferences
93+
csharp_prefer_static_local_function = true:suggestion
94+
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent
95+
96+
# Code-block preferences
97+
csharp_prefer_braces = true:silent
98+
csharp_prefer_simple_using_statement = true:suggestion
99+
100+
# Expression-level preferences
101+
csharp_prefer_simple_default_expression = true:suggestion
102+
csharp_style_deconstructed_variable_declaration = true:suggestion
103+
csharp_style_inlined_variable_declaration = true:suggestion
104+
csharp_style_pattern_local_over_anonymous_function = true:suggestion
105+
csharp_style_prefer_index_operator = true:suggestion
106+
csharp_style_prefer_range_operator = true:suggestion
107+
csharp_style_throw_expression = true:suggestion
108+
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
109+
csharp_style_unused_value_expression_statement_preference = discard_variable:silent
110+
111+
# 'using' directive preferences
112+
csharp_using_directive_placement = outside_namespace:silent
113+
114+
#### C# Formatting Rules ####
115+
116+
# New line preferences
117+
csharp_new_line_before_catch = true
118+
csharp_new_line_before_else = true
119+
csharp_new_line_before_finally = true
120+
csharp_new_line_before_members_in_anonymous_types = true
121+
csharp_new_line_before_members_in_object_initializers = true
122+
csharp_new_line_before_open_brace = all
123+
csharp_new_line_between_query_expression_clauses = true
124+
125+
# Indentation preferences
126+
csharp_indent_block_contents = true
127+
csharp_indent_braces = false
128+
csharp_indent_case_contents = true
129+
csharp_indent_case_contents_when_block = true
130+
csharp_indent_labels = one_less_than_current
131+
csharp_indent_switch_labels = true
132+
133+
# Space preferences
134+
csharp_space_after_cast = false
135+
csharp_space_after_colon_in_inheritance_clause = true
136+
csharp_space_after_comma = true
137+
csharp_space_after_dot = false
138+
csharp_space_after_keywords_in_control_flow_statements = true
139+
csharp_space_after_semicolon_in_for_statement = true
140+
csharp_space_around_binary_operators = before_and_after
141+
csharp_space_around_declaration_statements = false
142+
csharp_space_before_colon_in_inheritance_clause = true
143+
csharp_space_before_comma = false
144+
csharp_space_before_dot = false
145+
csharp_space_before_open_square_brackets = false
146+
csharp_space_before_semicolon_in_for_statement = false
147+
csharp_space_between_empty_square_brackets = false
148+
csharp_space_between_method_call_empty_parameter_list_parentheses = false
149+
csharp_space_between_method_call_name_and_opening_parenthesis = false
150+
csharp_space_between_method_call_parameter_list_parentheses = false
151+
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
152+
csharp_space_between_method_declaration_name_and_open_parenthesis = false
153+
csharp_space_between_method_declaration_parameter_list_parentheses = false
154+
csharp_space_between_parentheses = false
155+
csharp_space_between_square_brackets = false
156+
157+
# Wrapping preferences
158+
csharp_preserve_single_line_blocks = true
159+
csharp_preserve_single_line_statements = true
160+
161+
#### Naming styles ####
162+
163+
# Naming rules
164+
165+
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
166+
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
167+
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
168+
169+
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
170+
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
171+
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
172+
173+
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
174+
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
175+
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
176+
177+
# Symbol specifications
178+
179+
dotnet_naming_symbols.interface.applicable_kinds = interface
180+
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
181+
dotnet_naming_symbols.interface.required_modifiers =
182+
183+
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
184+
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
185+
dotnet_naming_symbols.types.required_modifiers =
186+
187+
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
188+
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
189+
dotnet_naming_symbols.non_field_members.required_modifiers =
190+
191+
# Naming styles
192+
193+
dotnet_naming_style.pascal_case.required_prefix =
194+
dotnet_naming_style.pascal_case.required_suffix =
195+
dotnet_naming_style.pascal_case.word_separator =
196+
dotnet_naming_style.pascal_case.capitalization = pascal_case
197+
198+
dotnet_naming_style.begins_with_i.required_prefix = I
199+
dotnet_naming_style.begins_with_i.required_suffix =
200+
dotnet_naming_style.begins_with_i.word_separator =
201+
dotnet_naming_style.begins_with_i.capitalization = pascal_case

.github/workflows/dotnet.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
uses: actions/setup-dotnet@v2
2020
with:
2121
dotnet-version: 6.0.x
22-
- uses: actions/setup-node@v2
22+
- uses: actions/setup-node@v3.2.0
2323
with:
2424
node-version: 14
2525
- name: Restore dependencies

Codeuctivity.HtmlRenderer/Codeuctivity.HtmlRenderer.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<ItemGroup>
4040
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="all" />
4141
<PackageReference Include="PuppeteerSharp" Version="7.0.0" />
42-
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.37.0.45539">
42+
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.40.0.48530">
4343
<PrivateAssets>all</PrivateAssets>
4444
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4545
</PackageReference>

Codeuctivity.HtmlRenderer/Renderer.cs

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,15 @@ namespace Codeuctivity.HtmlRenderer
1212
/// </summary>
1313
public class Renderer : IAsyncDisposable, IDisposable
1414
{
15+
/// <summary>
16+
/// Ctor
17+
/// </summary>
18+
/// <param name="launchOptions"></param>
19+
public Renderer(string? launchOptions = null)
20+
{
21+
LaunchOptions = launchOptions;
22+
}
23+
1524
private Browser Browser { get; set; } = default!;
1625
private int LastProgressValue { get; set; }
1726

@@ -20,6 +29,8 @@ public class Renderer : IAsyncDisposable, IDisposable
2029
/// </summary>
2130
public BrowserFetcher BrowserFetcher { get; private set; } = default!;
2231

32+
private string? LaunchOptions { get; }
33+
2334
/// <summary>
2435
/// Call CreateAsync before using ConvertHtmlTo*
2536
/// </summary>
@@ -31,35 +42,42 @@ public static Task<Renderer> CreateAsync()
3142
}
3243

3344
/// <summary>
34-
/// Call CreateAsync before using ConvertHtmlTo*, accepts custom BrowserFetcher
45+
/// Call CreateAsync before using ConvertHtmlTo*, accepts custom BrowserFetcher and custom chromium launch options
3546
/// </summary>
36-
/// <returns>Initialized renderer</returns>
37-
public static Task<Renderer> CreateAsync(BrowserFetcher browserFetcher)
47+
/// <param name="browserFetcher"></param>
48+
/// <param name="launchOptions">Adds launch options to chromium</param>
49+
/// <returns></returns>
50+
public static Task<Renderer> CreateAsync(BrowserFetcher browserFetcher, string? launchOptions = null)
3851
{
39-
var html2Pdf = new Renderer();
52+
var html2Pdf = new Renderer(launchOptions);
4053
return html2Pdf.InitializeAsync(browserFetcher);
4154
}
4255

4356
private async Task<Renderer> InitializeAsync(BrowserFetcher browserFetcher)
4457
{
45-
BrowserFetcher = browserFetcher ?? throw new ArgumentNullException(nameof(browserFetcher));
58+
BrowserFetcher = browserFetcher;
4659
BrowserFetcher.DownloadProgressChanged += DownloadProgressChanged;
4760

48-
await BrowserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
49-
Browser = await Puppeteer.LaunchAsync(SystemSpecificConfig());
61+
_ = await BrowserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision ?? string.Empty).ConfigureAwait(false);
62+
Browser = await Puppeteer.LaunchAsync(SystemSpecificConfig()).ConfigureAwait(false);
5063
return this;
5164
}
5265

53-
private static LaunchOptions SystemSpecificConfig()
66+
private LaunchOptions SystemSpecificConfig()
5467
{
55-
if (IsRunningOnWsl())
68+
if (!string.IsNullOrEmpty(LaunchOptions) && (IsRunningOnWsl() || IsRunningOnAzureLinux()))
5669
{
5770
return new LaunchOptions { Headless = true, Args = new string[] { "--no-sandbox" } };
5871
}
5972

6073
return new LaunchOptions { Headless = true };
6174
}
6275

76+
private static bool IsRunningOnAzureLinux()
77+
{
78+
return RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && Environment.GetEnvironmentVariable("WEBSITE_SKU").Contains("Linux");
79+
}
80+
6381
private static bool IsRunningOnWsl()
6482
{
6583
return RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && File.ReadAllText("/proc/version").Contains("Microsoft");
@@ -78,7 +96,7 @@ public async Task ConvertHtmlToPdf(string sourceHtmlFilePath, string destination
7896
}
7997

8098
var absolutePath = Path.GetFullPath(sourceHtmlFilePath);
81-
await using var page = await Browser.NewPageAsync().ConfigureAwait(false);
99+
await using var page = (await Browser.NewPageAsync().ConfigureAwait(false));
82100
await page.GoToAsync($"file://{absolutePath}").ConfigureAwait(false);
83101
await page.PdfAsync(destinationPdfFilePath).ConfigureAwait(false);
84102
}
@@ -96,7 +114,7 @@ public async Task ConvertHtmlToPng(string sourceHtmlFilePath, string destination
96114
}
97115

98116
var absolutePath = Path.GetFullPath(sourceHtmlFilePath);
99-
await using var page = await Browser.NewPageAsync().ConfigureAwait(false);
117+
await using var page = (await Browser.NewPageAsync().ConfigureAwait(false));
100118
await page.GoToAsync($"file://{absolutePath}").ConfigureAwait(false);
101119
await page.ScreenshotAsync(destinationPngFilePath, new ScreenshotOptions { FullPage = true }).ConfigureAwait(false);
102120
}
@@ -123,7 +141,7 @@ public void Dispose()
123141
/// </summary>
124142
public async ValueTask DisposeAsync()
125143
{
126-
await DisposeAsyncCore();
144+
await DisposeAsyncCore().ConfigureAwait(false);
127145

128146
Dispose(disposing: false);
129147
#pragma warning disable CA1816 // Dispose methods should call SuppressFinalize
@@ -150,8 +168,8 @@ protected virtual async ValueTask DisposeAsyncCore()
150168
{
151169
if (Browser is not null)
152170
{
153-
await Browser.CloseAsync();
154-
await Browser.DisposeAsync();
171+
await Browser.CloseAsync().ConfigureAwait(false);
172+
await Browser.DisposeAsync().ConfigureAwait(false);
155173
}
156174
}
157175
}

Codeuctivity.HtmlRendererCli/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public static async Task<int> Main(string[] args)
4040
var browserFetcher = new BrowserFetcher();
4141
Console.WriteLine($"Fetching chromium from web, to {browserFetcher.DownloadsFolder} .... ");
4242
browserFetcher.DownloadProgressChanged += BrowserFetcher_DownloadProgressChanged;
43-
await using var chromiumRenderer = await Renderer.CreateAsync(browserFetcher);
43+
await using var chromiumRenderer = await Renderer.CreateAsync(browserFetcher, string.Empty);
4444
await chromiumRenderer.ConvertHtmlToPdf(inputPathDocx, outputPathHtml);
4545
return 0;
4646
}

Codeuctivity.HtmlRendererCliTests/Codeuctivity.HtmlRendererCliTests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
11-
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.37.0.45539">
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
11+
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.40.0.48530">
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
<PrivateAssets>all</PrivateAssets>
1414
</PackageReference>
1515
<PackageReference Include="xunit" Version="2.4.1" />
16-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
16+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
1717
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1818
<PrivateAssets>all</PrivateAssets>
1919
</PackageReference>

Codeuctivity.HtmlRendererTests/Codeuctivity.HtmlRendererTests.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616
</ItemGroup>
1717

1818
<ItemGroup>
19-
<PackageReference Include="Codeuctivity.ImageSharpCompare" Version="2.0.25" />
20-
<PackageReference Include="Codeuctivity.PdfjsSharp" Version="1.2.27" />
21-
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.37.0.45539">
19+
<PackageReference Include="Codeuctivity.ImageSharpCompare" Version="2.0.61" />
20+
<PackageReference Include="Codeuctivity.PdfjsSharp" Version="1.2.47" />
21+
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.40.0.48530">
2222
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2323
<PrivateAssets>all</PrivateAssets>
2424
</PackageReference>
25-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
25+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
2626
<PackageReference Include="xunit" Version="2.4.1" />
27-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
27+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
2828
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2929
<PrivateAssets>all</PrivateAssets>
3030
</PackageReference>

0 commit comments

Comments
 (0)