1
0

Updated OpenGraph metadata

Fixed target="_blank" security issue
This commit is contained in:
Michael Gordeev
2020-06-19 14:23:49 +03:00
parent 4bcf227f6a
commit 398a16b596
22 changed files with 1450 additions and 1395 deletions
@@ -1,52 +1,52 @@
@model MyWebsite.Models.LinkModel @model MyWebsite.Models.LinkModel
@{ @{
ViewData["Title"] = "Create link"; ViewData["Title"] = "Create link";
} }
<header> <header>
&#xE760; <a asp-action="Index">Back to the list</a> &#xE760; <a asp-action="Index">Back to the list</a>
<h1>Create link</h1> <h1>Create link</h1>
</header> </header>
<article> <article>
<form asp-action="Create"> <form asp-action="Create">
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<input asp-for="Order" type="number" hidden value="-1" /> <input asp-for="Order" type="number" hidden value="-1" />
<div> <div>
<label asp-for="Name"></label> <label asp-for="Name"></label>
<a target="_blank" class="comment" href="//socicon.com/icons">// Socicon naming cheatsheet</a> <a target="_blank" rel="noopener noreferrer" class="comment" href="//socicon.com/icons">// Socicon naming cheatsheet</a>
<input asp-for="Name" type="text" required /> <input asp-for="Name" type="text" required />
<span asp-validation-for="Name" class="text-danger"></span> <span asp-validation-for="Name" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="EnglishTitle"></label> <label asp-for="EnglishTitle"></label>
<input asp-for="EnglishTitle" type="text" required /> <input asp-for="EnglishTitle" type="text" required />
<span asp-validation-for="EnglishTitle" class="text-danger"></span> <span asp-validation-for="EnglishTitle" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="RussianTitle"></label> <label asp-for="RussianTitle"></label>
<input asp-for="RussianTitle" type="text" /> <input asp-for="RussianTitle" type="text" />
<span asp-validation-for="RussianTitle" class="text-danger"></span> <span asp-validation-for="RussianTitle" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="Username"></label> <label asp-for="Username"></label>
<input asp-for="Username" type="text" required /> <input asp-for="Username" type="text" required />
<span asp-validation-for="Username" class="text-danger"></span> <span asp-validation-for="Username" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="Url"></label> <label asp-for="Url"></label>
<input asp-for="Url" type="text" required /> <input asp-for="Url" type="text" required />
<span asp-validation-for="Url" class="text-danger"></span> <span asp-validation-for="Url" class="text-danger"></span>
</div> </div>
<div> <div>
<input type="checkbox" class="checkbox" asp-for="CanContactMe" /> <input type="checkbox" class="checkbox" asp-for="CanContactMe" />
<label asp-for="CanContactMe"></label> <br /> <label asp-for="CanContactMe"></label> <br />
</div> </div>
<div> <div>
<input type="checkbox" class="checkbox" asp-for="DisplayInFooter" /> <input type="checkbox" class="checkbox" asp-for="DisplayInFooter" />
<label asp-for="DisplayInFooter"></label> <label asp-for="DisplayInFooter"></label>
</div> </div>
<input type="submit" value="Create" /> <input type="submit" value="Create" />
</form> </form>
</article> </article>
@@ -1,28 +1,28 @@
@model MyWebsite.Models.LinkModel @model MyWebsite.Models.LinkModel
@{ @{
ViewData["Title"] = "Delete link"; ViewData["Title"] = "Delete link";
} }
<header> <header>
&#xE760; <a asp-action="Index">Back to the list</a> &#xE760; <a asp-action="Index">Back to the list</a>
<h1>Delete link</h1> <h1>Delete link</h1>
<h3>Are you sure you want to delete this?</h3> <h3>Are you sure you want to delete this?</h3>
</header> </header>
<article> <article>
<p> <p>
<b>@Html.DisplayNameFor(model => model.Name):</b> @Model.Name<br /> <b>@Html.DisplayNameFor(model => model.Name):</b> @Model.Name<br />
<b>@Html.DisplayNameFor(model => model.Order):</b> @Model.Order<br /> <b>@Html.DisplayNameFor(model => model.Order):</b> @Model.Order<br />
<b>@Html.DisplayNameFor(model => model.EnglishTitle):</b> @Model.EnglishTitle<br /> <b>@Html.DisplayNameFor(model => model.EnglishTitle):</b> @Model.EnglishTitle<br />
<b>@Html.DisplayNameFor(model => model.RussianTitle):</b> @Model.RussianTitle<br /> <b>@Html.DisplayNameFor(model => model.RussianTitle):</b> @Model.RussianTitle<br />
<b>@Html.DisplayNameFor(model => model.Username):</b> @Model.Username<br /> <b>@Html.DisplayNameFor(model => model.Username):</b> @Model.Username<br />
<b>@Html.DisplayNameFor(model => model.Url):</b> <a href="@Model.Url" target="_blank">@Model.Url</a><br /> <b>@Html.DisplayNameFor(model => model.Url):</b> <a href="@Model.Url" target="_blank" rel="noopener noreferrer">@Model.Url</a><br />
<b>@Html.DisplayNameFor(model => model.CanContactMe):</b> @Html.DisplayFor(model => model.CanContactMe)<br /> <b>@Html.DisplayNameFor(model => model.CanContactMe):</b> @Html.DisplayFor(model => model.CanContactMe)<br />
<b>@Html.DisplayNameFor(model => model.DisplayInFooter):</b> @Html.DisplayFor(model => model.DisplayInFooter) <b>@Html.DisplayNameFor(model => model.DisplayInFooter):</b> @Html.DisplayFor(model => model.DisplayInFooter)
</p> </p>
<form asp-action="Delete"> <form asp-action="Delete">
<input hidden asp-for="Name" /> <input hidden asp-for="Name" />
<input type="submit" value="Delete" required /> <input type="submit" value="Delete" required />
</form> </form>
</article> </article>
@@ -1,90 +1,90 @@
@model IEnumerable<MyWebsite.Models.LinkModel> @model IEnumerable<MyWebsite.Models.LinkModel>
@{ @{
ViewData["Title"] = "Links list"; ViewData["Title"] = "Links list";
} }
<header> <header>
&#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a> &#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a>
<h1>Links list</h1> <h1>Links list</h1>
<a asp-action="Create" class="comment">// + Create New</a> <a asp-action="Create" class="comment">// + Create New</a>
</header> </header>
<article> <article>
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>&#xE700;</th> <th>&#xE700;</th>
<th> <th>
@Html.DisplayNameFor(model => model.Name) @Html.DisplayNameFor(model => model.Name)
</th> </th>
<th class="hide-l2"> <th class="hide-l2">
@Html.DisplayNameFor(model => model.Title) @Html.DisplayNameFor(model => model.Title)
</th> </th>
<th class="hide-l1"> <th class="hide-l1">
@Html.DisplayNameFor(model => model.Username) @Html.DisplayNameFor(model => model.Username)
</th> </th>
<th class="hide-l2"> <th class="hide-l2">
@Html.DisplayNameFor(model => model.Url) @Html.DisplayNameFor(model => model.Url)
</th> </th>
<th class="hide-l1"> <th class="hide-l1">
@Html.DisplayNameFor(model => model.CanContactMe) @Html.DisplayNameFor(model => model.CanContactMe)
</th> </th>
<th class="hide-l1"> <th class="hide-l1">
@Html.DisplayNameFor(model => model.DisplayInFooter) @Html.DisplayNameFor(model => model.DisplayInFooter)
</th> </th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var item in Model.OrderBy(i => i.Order)) @foreach (var item in Model.OrderBy(i => i.Order))
{ {
<tr id="@item.Name"> <tr id="@item.Name">
<td class="reorderingBtns"> <td class="reorderingBtns">
<a onclick="Up(this)">&#xE010;</a><br /> <a onclick="Up(this)">&#xE010;</a><br />
<span>&#xE915;</span><br /> <span>&#xE915;</span><br />
<a onclick="Down(this)">&#xE011;</a> <a onclick="Down(this)">&#xE011;</a>
</td> </td>
<td>@item.Name</td> <td>@item.Name</td>
<td class="hide-l2"> <td class="hide-l2">
@item.EnglishTitle (en)<br /> @item.EnglishTitle (en)<br />
@(item.RussianTitle ?? "<not_set>") (ru) @(item.RussianTitle ?? "<not_set>") (ru)
</td> </td>
<td class="hide-l1">@item.Username</td> <td class="hide-l1">@item.Username</td>
<td class="hide-l2"><a target="_blank" href="@item.Url">@item.Url</a></td> <td class="hide-l2"><a target="_blank" rel="noopener noreferrer" href="@item.Url">@item.Url</a></td>
<td class="hide-l1"> <td class="hide-l1">
@Html.DisplayFor(modelItem => item.CanContactMe) @Html.DisplayFor(modelItem => item.CanContactMe)
</td> </td>
<td class="hide-l1"> <td class="hide-l1">
@Html.DisplayFor(modelItem => item.DisplayInFooter) @Html.DisplayFor(modelItem => item.DisplayInFooter)
</td> </td>
<td> <td>
<a asp-action="Edit" asp-route-id="@item.Name">Edit</a> | <a asp-action="Edit" asp-route-id="@item.Name">Edit</a> |
<a asp-action="Delete" asp-route-id="@item.Name">Delete</a> <a asp-action="Delete" asp-route-id="@item.Name">Delete</a>
</td> </td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
<button onclick="ApplyReorder()" disabled>Apply reordering</button> <button onclick="ApplyReorder()" disabled>Apply reordering</button>
</article> </article>
@section Imports @section Imports
{ {
<style type="text/css"> <style type="text/css">
.reorderingBtns .reorderingBtns
{ {
user-select: none; user-select: none;
} }
.reorderingBtns a:hover .reorderingBtns a:hover
{ {
cursor: pointer; cursor: pointer;
color: gray; color: gray;
text-decoration: underline; text-decoration: underline;
} }
</style> </style>
<script type="text/javascript" src="~/js/ReorderScript.js"></script> <script type="text/javascript" src="~/js/ReorderScript.js"></script>
} }
@@ -1,97 +1,97 @@
@model MyWebsite.Models.ImageModel @model MyWebsite.Models.ImageModel
@{ @{
ViewData["Title"] = "Edit artwork"; ViewData["Title"] = "Edit artwork";
} }
<header> <header>
&#xE760; <a asp-action="Index">Back to the list</a> &#xE760; <a asp-action="Index">Back to the list</a>
<h1>Edit artwork</h1> <h1>Edit artwork</h1>
<a class="comment" href="~/images/Gallery/@(Model.FileName)" target="_blank">// Open artwork file</a> <a class="comment" href="~/images/Gallery/@(Model.FileName)" target="_blank" rel="noopener noreferrer">// Open artwork file</a>
</header> </header>
<article> <article>
<img src="~/images/Gallery/@Model.FileName" onclick="ToggleImageSize();" /> <img src="~/images/Gallery/@Model.FileName" onclick="ToggleImageSize();" />
<form asp-action="Edit"> <form asp-action="Edit">
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<input asp-for="FileName" hidden /> <input asp-for="FileName" hidden />
<div> <div>
<label asp-for="EnglishTitle"></label> <label asp-for="EnglishTitle"></label>
<input asp-for="EnglishTitle" type="text" required/> <input asp-for="EnglishTitle" type="text" required/>
<span asp-validation-for="EnglishTitle" class="text-danger"></span> <span asp-validation-for="EnglishTitle" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="RussianTitle"></label> <label asp-for="RussianTitle"></label>
<input asp-for="RussianTitle" type="text" /> <input asp-for="RussianTitle" type="text" />
<span asp-validation-for="RussianTitle" class="text-danger"></span> <span asp-validation-for="RussianTitle" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="EnglishDescription"></label> <label asp-for="EnglishDescription"></label>
<textarea asp-for="EnglishDescription"></textarea> <textarea asp-for="EnglishDescription"></textarea>
<span asp-validation-for="EnglishDescription" class="text-danger"></span> <span asp-validation-for="EnglishDescription" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="RussianDescription"></label> <label asp-for="RussianDescription"></label>
<textarea asp-for="RussianDescription"></textarea> <textarea asp-for="RussianDescription"></textarea>
<span asp-validation-for="RussianDescription" class="text-danger"></span> <span asp-validation-for="RussianDescription" class="text-danger"></span>
</div> </div>
<div> <div>
<label asp-for="CreationDate"></label> <label asp-for="CreationDate"></label>
<input asp-for="CreationDate" type="date" required/> <input asp-for="CreationDate" type="date" required/>
<span asp-validation-for="CreationDate" class="text-danger"></span> <span asp-validation-for="CreationDate" class="text-danger"></span>
</div> </div>
<input type="submit" value="Save" /> <input type="submit" value="Save" />
</form> </form>
</article> </article>
@section Imports @section Imports
{ {
<script type="text/javascript"> <script type="text/javascript">
function ToggleImageSize() function ToggleImageSize()
{ {
var image = document.querySelector("img"); var image = document.querySelector("img");
if (image.style.cursor == "zoom-out") if (image.style.cursor == "zoom-out")
image.style = ""; image.style = "";
else else
{ {
image.style.maxHeight = "none"; image.style.maxHeight = "none";
image.style.maxWidth = "none"; image.style.maxWidth = "none";
image.style.cursor = "zoom-out"; image.style.cursor = "zoom-out";
} }
} }
</script> </script>
<style type="text/css"> <style type="text/css">
article article
{ {
display: grid; display: grid;
grid-template-columns: 500px 1fr; grid-template-columns: 500px 1fr;
grid-column-gap: 20px; grid-column-gap: 20px;
} }
article img article img
{ {
width: 100%; width: 100%;
} }
@@media only screen and (max-width: 1000px) @@media only screen and (max-width: 1000px)
{ {
article article
{ {
display: inherit; display: inherit;
} }
} }
form form
{ {
max-width: initial; max-width: initial;
} }
textarea textarea
{ {
max-height: 250px; max-height: 250px;
} }
</style> </style>
} }
@@ -1,54 +1,54 @@
@model ArtworkViewModel @model ArtworkViewModel
@{ @{
ViewData["Title"] = "Gallery"; ViewData["Title"] = "Gallery";
} }
<header> <header>
&#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a> &#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a>
<h1>Gallery</h1> <h1>Gallery</h1>
<a asp-action="Upload" class="comment">// &#xE11C; Upload new</a><br /> <a asp-action="Upload" class="comment">// &#xE11C; Upload new</a><br />
<a asp-action="UpdateCache" class="comment">// Cache gallery</a> <a asp-action="UpdateCache" class="comment">// Cache gallery</a>
</header> </header>
<article> <article>
<table> <table>
@foreach (ImageModel item in Model.Images) @foreach (ImageModel item in Model.Images)
{ {
<tr> <tr>
<td> <td>
<a asp-area="" asp-controller="Gallery" asp-action="Details" asp-route-id="@item.FileName" target="_blank"> <a asp-area="" asp-controller="Gallery" asp-action="Details" asp-route-id="@item.FileName" target="_blank" rel="noopener noreferrer">
<img title="@item.Title" src="~/images/Gallery/@(item.FileName.EndsWith(".svg", StringComparison.OrdinalIgnoreCase) ? item.FileName : $"Cache/{item.FileName}.jpg")" onerror="this.src = '/images/Gallery/@item.FileName'" /> <img title="@item.Title" src="~/images/Gallery/@(item.FileName.EndsWith(".svg", StringComparison.OrdinalIgnoreCase) ? item.FileName : $"Cache/{item.FileName}.jpg")" onerror="this.src = '/images/Gallery/@item.FileName'" />
</a> </a>
</td> </td>
<td> <td>
<p> <p>
<h3>@item.Title</h3> <h3>@item.Title</h3>
<span>File name: @item.FileName</span><br /> <span>File name: @item.FileName</span><br />
<span>Creation date: @item.CreationDate.ToShortDateString()</span><br /> <span>Creation date: @item.CreationDate.ToShortDateString()</span><br />
<span> <span>
<a asp-action="Edit" asp-route-id="@item.FileName">Edit</a> | <a asp-action="Edit" asp-route-id="@item.FileName">Edit</a> |
<a asp-action="Delete" asp-route-id="@item.FileName">Delete</a> | <a asp-action="Delete" asp-route-id="@item.FileName">Delete</a> |
<a asp-area="" asp-controller="Gallery" asp-action="Details" asp-route-id="@item.FileName" target="_blank">View</a> <a asp-area="" asp-controller="Gallery" asp-action="Details" asp-route-id="@item.FileName" target="_blank" rel="noopener noreferrer">View</a>
</span> </span>
</p> </p>
</td> </td>
</tr> </tr>
} }
</table> </table>
</article> </article>
@section Imports @section Imports
{ {
<style type="text/css"> <style type="text/css">
img img
{ {
height: 200px; height: 200px;
margin-right: 20px; margin-right: 20px;
} }
table table
{ {
width: initial; width: initial;
} }
</style> </style>
} }
@@ -1,63 +1,63 @@
@model MyWebsite.Models.ProjectModel @model MyWebsite.Models.ProjectModel
@{ @{
ViewData["Title"] = "Delete project"; ViewData["Title"] = "Delete project";
} }
<header> <header>
&#xE760; <a asp-action="Index">Back to the list</a> &#xE760; <a asp-action="Index">Back to the list</a>
<h1>Delete project entry</h1> <h1>Delete project entry</h1>
<h3>Are you sure you want to delete this?</h3> <h3>Are you sure you want to delete this?</h3>
</header> </header>
<article> <article>
<p> <p>
<b>@Html.DisplayNameFor(model => model.Id):</b> @Model.Id<br /> <b>@Html.DisplayNameFor(model => model.Id):</b> @Model.Id<br />
</p> </p>
<p> <p>
<b>@Html.DisplayNameFor(model => model.EnglishTitle):</b> @Model.EnglishTitle<br /> <b>@Html.DisplayNameFor(model => model.EnglishTitle):</b> @Model.EnglishTitle<br />
<b>@Html.DisplayNameFor(model => model.RussianTitle):</b> @Model.RussianTitle<br /> <b>@Html.DisplayNameFor(model => model.RussianTitle):</b> @Model.RussianTitle<br />
</p> </p>
<p> <p>
<b>@Html.DisplayNameFor(model => model.EnglishLinkCaption):</b> @Model.EnglishLinkCaption<br /> <b>@Html.DisplayNameFor(model => model.EnglishLinkCaption):</b> @Model.EnglishLinkCaption<br />
<b>@Html.DisplayNameFor(model => model.RussianLinkCaption):</b> @Model.RussianLinkCaption<br /> <b>@Html.DisplayNameFor(model => model.RussianLinkCaption):</b> @Model.RussianLinkCaption<br />
</p> </p>
<p> <p>
<b>@Html.DisplayNameFor(model => model.Link):</b> <a target="_blank" href="@Model.Link">@Model.Link</a><br /> <b>@Html.DisplayNameFor(model => model.Link):</b> <a target="_blank" rel="noopener noreferrer" href="@Model.Link">@Model.Link</a><br />
</p> </p>
<p> <p>
<b>@Html.DisplayNameFor(model => model.Badges):</b> @Model.Badges<br /> <b>@Html.DisplayNameFor(model => model.Badges):</b> @Model.Badges<br />
<div class="badge-placeholder"> <div class="badge-placeholder">
@foreach (string b in (Model.Badges ?? "").Split(',')) @foreach (string b in (Model.Badges ?? "").Split(','))
{ {
BadgeModel badge = (ViewData["Badges"] as List<BadgeModel>).FirstOrDefault(i => i.Name == b); BadgeModel badge = (ViewData["Badges"] as List<BadgeModel>).FirstOrDefault(i => i.Name == b);
<div style="background-image: url('/images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div> <div style="background-image: url('/images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div>
} }
</div> </div>
</p> </p>
<form asp-action="Delete"> <form asp-action="Delete">
<input hidden asp-for="Id" /> <input hidden asp-for="Id" />
<input type="submit" value="Delete" required /> <input type="submit" value="Delete" required />
</form> </form>
</article> </article>
@section Imports @section Imports
{ {
<style type="text/css"> <style type="text/css">
.badge-placeholder .badge-placeholder
{ {
display: grid; display: grid;
grid-column-gap: 10px; grid-column-gap: 10px;
grid-auto-columns: max-content; grid-auto-columns: max-content;
grid-auto-flow: column; grid-auto-flow: column;
} }
.badge-placeholder div .badge-placeholder div
{ {
height: 25px; height: 25px;
width: 25px; width: 25px;
display: inline-block; display: inline-block;
background-size: contain; background-size: contain;
} }
</style> </style>
} }
@@ -1,110 +1,110 @@
@model (IEnumerable<MyWebsite.Models.ProjectModel> projects, IEnumerable<MyWebsite.Models.BadgeModel> badges) @model (IEnumerable<MyWebsite.Models.ProjectModel> projects, IEnumerable<MyWebsite.Models.BadgeModel> badges)
@{ @{
ViewData["Title"] = "Projects"; ViewData["Title"] = "Projects";
} }
<header> <header>
&#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a> &#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a>
<h1>Projects list</h1> <h1>Projects list</h1>
<a asp-action="Create" class="comment">// + Add new project</a> <a asp-action="Create" class="comment">// + Add new project</a>
</header> </header>
<article> <article>
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>&#xE700;</th> <th>&#xE700;</th>
<th class="hide-l1"> <th class="hide-l1">
@Html.DisplayNameFor(model => model.projects.First().Id) @Html.DisplayNameFor(model => model.projects.First().Id)
</th> </th>
<th> <th>
@Html.DisplayNameFor(model => model.projects.First().Title) @Html.DisplayNameFor(model => model.projects.First().Title)
</th> </th>
<th class="hide-l1"> <th class="hide-l1">
@Html.DisplayNameFor(model => model.projects.First().LinkCaption) @Html.DisplayNameFor(model => model.projects.First().LinkCaption)
</th> </th>
<th class="hide-l2"> <th class="hide-l2">
@Html.DisplayNameFor(model => model.projects.First().Link) @Html.DisplayNameFor(model => model.projects.First().Link)
</th> </th>
<th class="hide-l2"> <th class="hide-l2">
@Html.DisplayNameFor(model => model.projects.First().Badges) @Html.DisplayNameFor(model => model.projects.First().Badges)
(<a asp-controller="Badges" asp-action="Index">Edit badges</a>) (<a asp-controller="Badges" asp-action="Index">Edit badges</a>)
</th> </th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var item in Model.projects.OrderBy(i => i.Order)) @foreach (var item in Model.projects.OrderBy(i => i.Order))
{ {
<tr id="@item.Id"> <tr id="@item.Id">
<td class="reorderingBtns"> <td class="reorderingBtns">
<a onclick="Up(this)">&#xE010;</a><br /> <a onclick="Up(this)">&#xE010;</a><br />
<span>&#xE915;</span><br /> <span>&#xE915;</span><br />
<a onclick="Down(this)">&#xE011;</a> <a onclick="Down(this)">&#xE011;</a>
</td> </td>
<td class="hide-l1">@item.Id</td> <td class="hide-l1">@item.Id</td>
<td> <td>
@item.EnglishTitle (en)<br /> @item.EnglishTitle (en)<br />
@(item.RussianTitle ?? "<not_set>") (ru) @(item.RussianTitle ?? "<not_set>") (ru)
</td> </td>
<td class="hide-l1"> <td class="hide-l1">
@(item.EnglishLinkCaption ?? "<not_set>") (en)<br /> @(item.EnglishLinkCaption ?? "<not_set>") (en)<br />
@(item.RussianLinkCaption ?? "<not_set>") (ru) @(item.RussianLinkCaption ?? "<not_set>") (ru)
</td> </td>
<td class="hide-l2"><a target="_blank" href="@item.Link">@item.Link</a></td> <td class="hide-l2"><a target="_blank" rel="noopener noreferrer" href="@item.Link">@item.Link</a></td>
<td class="hide-l2"> <td class="hide-l2">
<div class="badge-placeholder"> <div class="badge-placeholder">
@foreach (string b in (item.Badges ?? "").Split(',')) @foreach (string b in (item.Badges ?? "").Split(','))
{ {
BadgeModel badge = Model.badges.FirstOrDefault(i => i.Name == b); BadgeModel badge = Model.badges.FirstOrDefault(i => i.Name == b);
<div style="background-image: url('../images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div> <div style="background-image: url('../images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div>
} }
</div> </div>
</td> </td>
<td> <td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a> <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td> </td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
<button onclick="ApplyReorder()" disabled>Apply reordering</button> <button onclick="ApplyReorder()" disabled>Apply reordering</button>
</article> </article>
@section Imports @section Imports
{ {
<style type="text/css"> <style type="text/css">
.badge-placeholder .badge-placeholder
{ {
display: grid; display: grid;
grid-column-gap: 10px; grid-column-gap: 10px;
grid-auto-columns: max-content; grid-auto-columns: max-content;
grid-auto-flow: column; grid-auto-flow: column;
} }
.badge-placeholder div .badge-placeholder div
{ {
height: 25px; height: 25px;
width: 25px; width: 25px;
display: inline-block; display: inline-block;
background-size: contain; background-size: contain;
} }
.reorderingBtns .reorderingBtns
{ {
user-select: none; user-select: none;
} }
.reorderingBtns a:hover .reorderingBtns a:hover
{ {
cursor: pointer; cursor: pointer;
color: gray; color: gray;
text-decoration: underline; text-decoration: underline;
} }
</style> </style>
<script type="text/javascript" src="~/js/ReorderScript.js"></script> <script type="text/javascript" src="~/js/ReorderScript.js"></script>
} }
@@ -1,49 +1,49 @@
@model CustomData @model CustomData
@{ @{
ViewData["Title"] = "GUTSchedule"; ViewData["Title"] = "GUTSchedule";
IEnumerable<ResumeModel> policies = ViewData["Policies"] as IEnumerable<ResumeModel>; IEnumerable<ResumeModel> policies = ViewData["Policies"] as IEnumerable<ResumeModel>;
} }
<header> <header>
&#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a> &#xE760; <a asp-action="Index" asp-controller="Admin" asp-area="">Back to main menu</a>
<h1>GUTSchedule</h1> <h1>GUTSchedule</h1>
</header> </header>
<article> <article>
<div asp-validation-summary="All" class="text-danger"></div> <div asp-validation-summary="All" class="text-danger"></div>
<h2>Offset dates</h2> <h2>Offset dates</h2>
<form asp-action="Index"> <form asp-action="Index">
<input asp-for="Key" value="offset" hidden /> <input asp-for="Key" value="offset" hidden />
<label asp-for="Value">First work day in the semester: (Current: @Model?.Value)</label> <label asp-for="Value">First work day in the semester: (Current: @Model?.Value)</label>
<input type="number" asp-for="Value" /> <input type="number" asp-for="Value" />
<span asp-validation-for="Value" class="text-danger"></span> <span asp-validation-for="Value" class="text-danger"></span>
<input type="submit" value="Update" /> <input type="submit" value="Update" />
</form> </form>
<h2>Privacy policies</h2> <h2>Privacy policies</h2>
<a class="comment" asp-action="PrivacyPolicy" target="_blank">// View privacy policy page</a><br /> <a class="comment" asp-action="PrivacyPolicy" target="_blank" rel="noopener noreferrer">// View privacy policy page</a><br />
<a class="comment" asp-action="CreatePolicy">// + Add new privacy policy</a> <a class="comment" asp-action="CreatePolicy">// + Add new privacy policy</a>
<table> <table>
<thead> <thead>
<tr> <tr>
<th>Langauge</th> <th>Langauge</th>
<th>Last update</th> <th>Last update</th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (ResumeModel item in policies) @foreach (ResumeModel item in policies)
{ {
<tr> <tr>
<td>@item.Language</td> <td>@item.Language</td>
<td>@item.LastUpdate</td> <td>@item.LastUpdate</td>
<td> <td>
<a asp-action="EditPolicy" asp-route-id="@item.Language">Edit</a> | <a asp-action="EditPolicy" asp-route-id="@item.Language">Edit</a> |
<a asp-action="DeletePolicy" asp-route-id="@item.Language">Delete</a> <a asp-action="DeletePolicy" asp-route-id="@item.Language">Delete</a>
</td> </td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
</article> </article>
@@ -1,35 +1,35 @@
@{ @{
ViewData["Title"] = "Скачайте ГУТ.Расписание сейчас!"; ViewData["Title"] = "Скачайте ГУТ.Расписание сейчас!";
Layout = "/Views/Shared/_Layout.cshtml"; Layout = "/Views/Shared/_Layout.cshtml";
} }
<header> <header>
<h1>Скачайте ГУТ.Расписание сейчас!</h1> <h1>Скачайте ГУТ.Расписание сейчас!</h1>
</header> </header>
<article> <article>
<img src="~/images/GUTSchedulePoster.png" style="max-width:800px; width: 100%" /> <img src="~/images/GUTSchedulePoster.png" style="max-width:800px; width: 100%" />
<h2>Для Windows 10</h2> <h2>Для Windows 10</h2>
<div id="mspb-cgyfrexl3uyg" class="9NXKDK52W3RX"></div> <div id="mspb-cgyfrexl3uyg" class="9NXKDK52W3RX"></div>
<h2>Для Android</h2> <h2>Для Android</h2>
<small>Доступно для версий Android 4.1 и выше</small><br /> <small>Доступно для версий Android 4.1 и выше</small><br />
<a href="https://play.google.com/store/apps/details?id=com.xfox111.gut.schedule" target="_blank"> <a href="https://play.google.com/store/apps/details?id=com.xfox111.gut.schedule" target="_blank" rel="noopener noreferrer">
<img alt='Доступно в Google Play' style="max-width:475px; width:100%" src='https://play.google.com/intl/en_us/badges/static/images/badges/ru_badge_web_generic.png' /> <img alt='Доступно в Google Play' style="max-width:475px; width:100%" src='https://play.google.com/intl/en_us/badges/static/images/badges/ru_badge_web_generic.png' />
</a> </a>
<p> <p>
<small>Microsoft Store и логотип Майкрософт являются товарными знаками корпорации Майкрософт.</small><br /> <small>Microsoft Store и логотип Майкрософт являются товарными знаками корпорации Майкрософт.</small><br />
<small>Google Play и логотип Google Play являются товарными знаками корпорации Google LLC.</small> <small>Google Play и логотип Google Play являются товарными знаками корпорации Google LLC.</small>
</p> </p>
</article> </article>
@section Imports @section Imports
{ {
<script src="https://storebadge.azureedge.net/src/badge-1.8.4.js"></script> <script src="https://storebadge.azureedge.net/src/badge-1.8.4.js"></script>
<script> <script>
mspb('9NXKDK52W3RX', function (badge) mspb('9NXKDK52W3RX', function (badge)
{ {
document.getElementById('mspb-cgyfrexl3uyg').innerHTML = badge; document.getElementById('mspb-cgyfrexl3uyg').innerHTML = badge;
}); });
</script> </script>
} }
@@ -55,28 +55,28 @@
<ul> <ul>
<li><a asp-area="" asp-controller="Blog" asp-action="Tags" asp-route-id="FoxTube">Dev Notes</a></li> <li><a asp-area="" asp-controller="Blog" asp-action="Tags" asp-route-id="FoxTube">Dev Notes</a></li>
<li><a asp-action="Privacy">Privacy policy</a></li> <li><a asp-action="Privacy">Privacy policy</a></li>
<li><a target="_blank" href="//youtube.com/t/privacy">YouTube privacy policy</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//youtube.com/t/privacy">YouTube privacy policy</a></li>
<li><a target="_blank" href="//youtube.com/t/terms">YouTube terms of use</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//youtube.com/t/terms">YouTube terms of use</a></li>
<li><a target="_blank" href="//youtube.com/t/community_guidelines">YouTube community guidelines</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//youtube.com/t/community_guidelines">YouTube community guidelines</a></li>
</ul> </ul>
<h1>Credits</h1> <h1>Credits</h1>
<h2>Demo footage content</h2> <h2>Demo footage content</h2>
<h3>Trailer</h3> <h3>Trailer</h3>
<ul> <ul>
<li><a target="_blank" href="//microsoft.com/">Microsoft</a> (Soundtrack: <a target="_blank" href="//www.youtube.com/watch?v=dwK422sLD-s">Introducing Microsoft Surface Laptop 2</a>)</li> <li><a target="_blank" rel="noopener noreferrer" href="//microsoft.com/">Microsoft</a> (Soundtrack: <a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/watch?v=dwK422sLD-s">Introducing Microsoft Surface Laptop 2</a>)</li>
<li><a target="_blank" href="//www.youtube.com/user/skullkruncher13">JT Music</a> (Comparasion video: <a target="_blank" href="//www.youtube.com/watch?v=AGfa24afEBM">METRO EXODUS SONG by JT Music (feat. Andrea Storm Kaden)</a>)</li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/user/skullkruncher13">JT Music</a> (Comparasion video: <a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/watch?v=AGfa24afEBM">METRO EXODUS SONG by JT Music (feat. Andrea Storm Kaden)</a>)</li>
</ul> </ul>
<h3>Screenshots and live</h3> <h3>Screenshots and live</h3>
<ul> <ul>
<li><a target="_blank" href="//windowscentral.com/">Windows Central</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//windowscentral.com/">Windows Central</a></li>
<li><a target="_blank" href="//www.youtube.com/user/ouramazingspace/about">Space Videos</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/user/ouramazingspace/about">Space Videos</a></li>
<li><a target="_blank" href="//www.youtube.com/channel/UCS3pqiugq53HFPYiWLPtdeA">MSReview</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/channel/UCS3pqiugq53HFPYiWLPtdeA">MSReview</a></li>
<li><a target="_blank" href="//www.youtube.com/channel/UC6cqazSR6CnVMClY0bJI0Lg">BadComedian</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/channel/UC6cqazSR6CnVMClY0bJI0Lg">BadComedian</a></li>
<li><a target="_blank" href="//www.youtube.com/channel/UCf31Gf5nCU8J6eUlr7QSU0w">Marmok</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/channel/UCf31Gf5nCU8J6eUlr7QSU0w">Marmok</a></li>
<li><a target="_blank" href="//www.youtube.com/channel/UCK7OXr0m5mnM1z9p7n_Bwfw">DAGames</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/channel/UCK7OXr0m5mnM1z9p7n_Bwfw">DAGames</a></li>
<li><a target="_blank" href="//www.youtube.com/user/RandomEncountersEnt">Random Ecounters</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/user/RandomEncountersEnt">Random Ecounters</a></li>
<li><a target="_blank" href="//www.youtube.com/channel/UCuXYmUOJSbEH1x88WUV1aMg">TheNafig</a></li> <li><a target="_blank" rel="noopener noreferrer" href="//www.youtube.com/channel/UCuXYmUOJSbEH1x88WUV1aMg">TheNafig</a></li>
</ul> </ul>
<p> <p>
@@ -81,7 +81,7 @@
<div> <div>
@foreach (LinkModel link in Model.Links.Where(i => i.DisplayInFooter).OrderBy(i => i.Order)) @foreach (LinkModel link in Model.Links.Where(i => i.DisplayInFooter).OrderBy(i => i.Order))
{ {
<a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" title="@(link.Title)"></a> <a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" rel="noopener noreferrer" title="@(link.Title)"></a>
} }
</div> </div>
</footer> </footer>
@@ -1,201 +1,201 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="AboutMe" xml:space="preserve"> <data name="AboutMe" xml:space="preserve">
<value>ОбоМне</value> <value>ОбоМне</value>
</data> </data>
<data name="All links are clickable" xml:space="preserve"> <data name="All links are clickable" xml:space="preserve">
<value>Все ссылки кликабельны</value> <value>Все ссылки кликабельны</value>
</data> </data>
<data name="Arts" xml:space="preserve"> <data name="Arts" xml:space="preserve">
<value>Галерея</value> <value>Галерея</value>
</data> </data>
<data name="Back to main menu" xml:space="preserve"> <data name="Back to main menu" xml:space="preserve">
<value>Назад в главное меню</value> <value>Назад в главное меню</value>
</data> </data>
<data name="Blog" xml:space="preserve"> <data name="Blog" xml:space="preserve">
<value>Блог</value> <value>Блог</value>
</data> </data>
<data name="Contact information" xml:space="preserve"> <data name="Contact information" xml:space="preserve">
<value>Контактная информация</value> <value>Контактная информация</value>
</data> </data>
<data name="ContactMe" xml:space="preserve"> <data name="ContactMe" xml:space="preserve">
<value>СвязатьсяСоМной</value> <value>СвязатьсяСоМной</value>
</data> </data>
<data name="Contacts" xml:space="preserve"> <data name="Contacts" xml:space="preserve">
<value>Контакты</value> <value>Контакты</value>
</data> </data>
<data name="Copyright" xml:space="preserve"> <data name="Copyright" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="en" xml:space="preserve"> <data name="en" xml:space="preserve">
<value>ru</value> <value>ru</value>
</data> </data>
<data name="Follow me on" xml:space="preserve"> <data name="Follow me on" xml:space="preserve">
<value>Подписывайтесь на</value> <value>Подписывайтесь на</value>
</data> </data>
<data name="Here is presented the most of projects I worked on" xml:space="preserve"> <data name="Here is presented the most of projects I worked on" xml:space="preserve">
<value>Здесь собрано большинство проектов над которыми я когда-либо работал</value> <value>Здесь собрано большинство проектов над которыми я когда-либо работал</value>
</data> </data>
<data name="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!" xml:space="preserve"> <data name="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!" xml:space="preserve">
<value>Привет! Меня зовут Михаил и я C# разработчик. Это мой личный веб-сайт. Здесь вы можете найти информацию обо мне и моих проектах</value> <value>Привет! Меня зовут Михаил и я C# разработчик. Это мой личный веб-сайт. Здесь вы можете найти информацию обо мне и моих проектах</value>
</data> </data>
<data name="InterestedInMe" xml:space="preserve"> <data name="InterestedInMe" xml:space="preserve">
<value>Заинтересовались</value> <value>Заинтересовались</value>
</data> </data>
<data name="Michael &quot;XFox&quot; Gordeev" xml:space="preserve"> <data name="Michael &amp;apos;XFox&amp;apos; Gordeev" xml:space="preserve">
<value>Михаил "XFox" Гордеев</value> <value>Михаил &amp;apos;XFox&amp;apos; Гордеев</value>
</data> </data>
<data name="Michael (Mikhail) Gordeev - Resume" xml:space="preserve"> <data name="Michael (Mikhail) Gordeev - Resume" xml:space="preserve">
<value>Михаил Гордеев - Резюме</value> <value>Михаил Гордеев - Резюме</value>
</data> </data>
<data name="My artworks" xml:space="preserve"> <data name="My artworks" xml:space="preserve">
<value>Мои рисунки</value> <value>Мои рисунки</value>
</data> </data>
<data name="My projects" xml:space="preserve"> <data name="My projects" xml:space="preserve">
<value>Мои проекты</value> <value>Мои проекты</value>
</data> </data>
<data name="MyResume" xml:space="preserve"> <data name="MyResume" xml:space="preserve">
<value>Резюме</value> <value>Резюме</value>
</data> </data>
<data name="No content available" xml:space="preserve"> <data name="No content available" xml:space="preserve">
<value>Нет доступного контента</value> <value>Нет доступного контента</value>
</data> </data>
<data name="Personal website" xml:space="preserve"> <data name="Personal website" xml:space="preserve">
<value>Личный веб-сайт</value> <value>Личный веб-сайт</value>
</data> </data>
<data name="Projects" xml:space="preserve"> <data name="Projects" xml:space="preserve">
<value>Проекты</value> <value>Проекты</value>
</data> </data>
<data name="ru" xml:space="preserve"> <data name="ru" xml:space="preserve">
<value>en</value> <value>en</value>
</data> </data>
<data name="socialNetworks" xml:space="preserve"> <data name="socialNetworks" xml:space="preserve">
<value>соцСети</value> <value>соцСети</value>
</data> </data>
<data name="Tags" xml:space="preserve"> <data name="Tags" xml:space="preserve">
<value>Теги</value> <value>Теги</value>
</data> </data>
<data name="You" xml:space="preserve"> <data name="You" xml:space="preserve">
<value>Вы</value> <value>Вы</value>
</data> </data>
<data name="РУС" xml:space="preserve"> <data name="РУС" xml:space="preserve">
<value>ENG</value> <value>ENG</value>
</data> </data>
</root> </root>
@@ -1,135 +1,138 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Next" xml:space="preserve"> <data name="Hi, my name is Michael. And this is my blog. Here I write about software and hardware development, interesting things from CS and more" xml:space="preserve">
<value>Вперед</value> <value>Привет! Меня зовут Михаил и это мой блог. Здесь я пишу о разработе программного и аппаратного обеспечения, а текже об интересных вещах из мира компьютерных наук</value>
</data> </data>
<data name="Prev" xml:space="preserve"> <data name="Next" xml:space="preserve">
<value>Назад</value> <value>Вперед</value>
</data> </data>
<data name="Search" xml:space="preserve"> <data name="Prev" xml:space="preserve">
<value>Поиск</value> <value>Назад</value>
</data> </data>
<data name="Search results for" xml:space="preserve"> <data name="Search" xml:space="preserve">
<value>Результаты поиска по тегу</value> <value>Поиск</value>
</data> </data>
<data name="Visit on" xml:space="preserve"> <data name="Search results for" xml:space="preserve">
<value>Открыть на</value> <value>Результаты поиска по тегу</value>
</data> </data>
<data name="Visit on" xml:space="preserve">
<value>Открыть на</value>
</data>
</root> </root>
@@ -1,132 +1,132 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Download CV" xml:space="preserve"> <data name="Download resume" xml:space="preserve">
<value>Скачать резюме</value> <value>Скачать резюме</value>
</data> </data>
<data name="Last update" xml:space="preserve"> <data name="Last update" xml:space="preserve">
<value>Последнее обновление</value> <value>Последнее обновление</value>
</data> </data>
<data name="My resume" xml:space="preserve"> <data name="My resume" xml:space="preserve">
<value>Мое резюме</value> <value>Мое резюме</value>
</data> </data>
<data name="Print CV" xml:space="preserve"> <data name="Print resume" xml:space="preserve">
<value>Распечатать резюме</value> <value>Распечатать резюме</value>
</data> </data>
</root> </root>
+20 -6
View File
@@ -3,6 +3,20 @@
ViewData["Title"] = "Fox, Coffee and Science - " + SharedLocalizer["Blog"]; ViewData["Title"] = "Fox, Coffee and Science - " + SharedLocalizer["Blog"];
} }
@section OpenGraph
{
<meta name="author" content="@SharedLocalizer["Michael &apos;XFox&apos; Gordeev"]" />
<meta name="description" content="@SharedLocalizer["Hi, my name is Michael. And this is my blog. Here I write about software and hardware development, interesting things from CS and more"]" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="XFox111.NET" />
<meta property="og:url" content="https://XFox111.NET/Blog" />
<meta property="og:locale" content="@SharedLocalizer["en"]" />
@*<meta property="og:image" content="https://xfox111.net/images/me.jpg" />*@
<meta property="og:description" content="@Localizer["Hi, my name is Michael. And this is my blog. Here I write about software and hardware development, interesting things from CS and more"]" />
<meta property="og:title" content="Fox, Coffee and Science" />
}
<header> <header>
@if (string.IsNullOrWhiteSpace(Model.SearchTerm)) @if (string.IsNullOrWhiteSpace(Model.SearchTerm))
{ {
@@ -12,10 +26,10 @@
{ {
<h1>@SharedLocalizer["Search results for"] @Model.SearchTerm</h1> <h1>@SharedLocalizer["Search results for"] @Model.SearchTerm</h1>
} }
@Localizer["Visit on"] <a target="_blank" href="@Model.Links.FirstOrDefault(i => i.Name == "blogger")?.Url">Blogspot</a> @Localizer["Visit on"] <a target="_blank" rel="noopener noreferrer" href="@Model.Links.FirstOrDefault(i => i.Name == "blogger")?.Url">Blogspot</a>
</header> </header>
<form method="get" action="https://xfox111.blogspot.com/search" target="_blank"> <form method="get" action="https://xfox111.blogspot.com/search" target="_blank" rel="noopener noreferrer">
<input type="text" name="q" spellcheck="false" placeholder="@Localizer["Search"]" /> <input type="text" name="q" spellcheck="false" placeholder="@Localizer["Search"]" />
<input type="submit" value="&#xE094;" /> <input type="submit" value="&#xE094;" />
</form> </form>
@@ -36,7 +50,7 @@
} }
<div> <div>
<p> <p>
@DateTime.Parse(post.Published).ToShortDateString() | <a href="@post.Author.Url" target="_blank">@post.Author.DisplayName</a><br /> @DateTime.Parse(post.Published).ToShortDateString() | <a href="@post.Author.Url" target="_blank" rel="noopener noreferrer">@post.Author.DisplayName</a><br />
@if (post.Labels != null && post.Labels.Count > 0) @if (post.Labels != null && post.Labels.Count > 0)
{ {
<span class="comment">// @(Html.Raw(string.Join(", ", (post.Labels ?? new string[0]).Select(i => $"<a class=\"comment\" href=\"Blog/Tags/{i}\">{i}</a>"))))</span> <span class="comment">// @(Html.Raw(string.Join(", ", (post.Labels ?? new string[0]).Select(i => $"<a class=\"comment\" href=\"Blog/Tags/{i}\">{i}</a>"))))</span>
@@ -72,10 +86,10 @@
<div class="follow-list"> <div class="follow-list">
@foreach (LinkModel link in Model.Links.Where(i => new[] { "twitter", "blogger", "github" }.Contains(i.Name)).OrderBy(i => i.Order)) @foreach (LinkModel link in Model.Links.Where(i => new[] { "twitter", "blogger", "github" }.Contains(i.Name)).OrderBy(i => i.Order))
{ {
<a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" title="@(link.Title)"></a> <a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" rel="noopener noreferrer" title="@(link.Title)"></a>
} }
<a class="socicon-rss" href="//xfox111.blogspot.com/feeds/posts/default?alt=rss" target="_blank" title="RSS Feed"></a> <a class="socicon-rss" href="//xfox111.blogspot.com/feeds/posts/default?alt=rss" target="_blank" rel="noopener noreferrer" title="RSS Feed"></a>
<a href="//buymeacoff.ee/xfox111" target="_blank" title="Buy me a coffee"> <a href="//buymeacoff.ee/xfox111" target="_blank" rel="noopener noreferrer" title="Buy me a coffee">
<img width="24" height="25" src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg"> <img width="24" height="25" src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg">
</a> </a>
</div> </div>
+31 -9
View File
@@ -3,30 +3,52 @@
ViewData["Title"] = Model.Post.Title + " - Fox, Coffee and Science - " + SharedLocalizer["Blog"]; ViewData["Title"] = Model.Post.Title + " - Fox, Coffee and Science - " + SharedLocalizer["Blog"];
} }
@section OpenGraph
{
<meta name="author" content="@Model.Post.Author.DisplayName" />
<meta name="description" content="@(new System.Text.RegularExpressions.Regex(@"(?<=\<p\>)(\s*.*\s*)(?=\<\/p\>)").Match(Model.Post.Content).Value.Replace("\n", ""))" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Fox, Coffee and Science Blog" />
<meta property="og:url" content="@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")" />
<meta property="og:locale" content="en_US" />
<meta property="og:title" content="@Model.Post.Title" />
<meta property="og:image" content="@(Model.Post.Images.FirstOrDefault()?.Url)" />
<meta property="og:description" content="@(new System.Text.RegularExpressions.Regex(@"(?<=\<p\>)(\s*.*\s*)(?=\<\/p\>)").Match(Model.Post.Content).Value.Replace("\n", ""))" />
<meta property="article:published_time" content="@Model.Post.Published" />
<meta property="article:modified_time" content="@Model.Post.Updated" />
@foreach (string tag in Model.Post.Labels)
{
<meta property="article:tag" content="@tag" />
}
}
<article> <article>
<div class="post-body"> <div class="post-body">
<div class="post-header"> <div class="post-header">
<h2>@Model.Post.Title</h2> <h2>@Model.Post.Title</h2>
<p> <p>
@DateTime.Parse(Model.Post.Published).ToShortDateString() | <a href="@Model.Post.Author.Url" target="_blank">@Model.Post.Author.DisplayName</a><br /> @DateTime.Parse(Model.Post.Published).ToShortDateString() | <a href="@Model.Post.Author.Url" target="_blank" rel="noopener noreferrer">@Model.Post.Author.DisplayName</a><br />
</p> </p>
<div class="share-btns"> <div class="share-btns">
<a class="share-btn facebook" target="_blank" href="//www.facebook.com/sharer/sharer.php?u=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path" title="Facebook"> <a class="share-btn facebook" target="_blank" rel="noopener noreferrer" href="//www.facebook.com/sharer/sharer.php?u=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path" title="Facebook">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon">
<path d="M5.677,12.998V8.123h3.575V6.224C9.252,2.949,11.712,0,14.736,0h3.94v4.874h-3.94 c-0.432,0-0.934,0.524-0.934,1.308v1.942h4.874v4.874h-4.874V24H9.252V12.998H5.677z"></path> <path d="M5.677,12.998V8.123h3.575V6.224C9.252,2.949,11.712,0,14.736,0h3.94v4.874h-3.94 c-0.432,0-0.934,0.524-0.934,1.308v1.942h4.874v4.874h-4.874V24H9.252V12.998H5.677z"></path>
</svg> </svg>
</a> </a>
<a class="share-btn twitter" target="_blank" href="//twitter.com/intent/tweet?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path&text=@Model.Post.Title" title="Twitter"> <a class="share-btn twitter" target="_blank" rel="noopener noreferrer" href="//twitter.com/intent/tweet?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path&text=@Model.Post.Title" title="Twitter">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon">
<path fill="%233E68C0" d="M21.535,7.063c0.311,6.923-4.852,14.642-13.99,14.642 c-2.78,0-5.368-0.815-7.545-2.213c2.611,0.308,5.217-0.415,7.287-2.038c-2.154-0.039-3.972-1.462-4.599-3.418 c0.771,0.148,1.53,0.105,2.223-0.084c-2.367-0.475-4.002-2.608-3.948-4.888c0.664,0.369,1.423,0.59,2.229,0.615 C1.001,8.215,0.38,5.32,1.67,3.108c2.428,2.978,6.055,4.938,10.145,5.143c-0.717-3.079,1.618-6.044,4.796-6.044 c1.415,0,2.694,0.598,3.592,1.554c1.121-0.221,2.174-0.631,3.126-1.195c-0.368,1.149-1.149,2.114-2.164,2.724 c0.995-0.119,1.944-0.384,2.826-0.776C23.331,5.503,22.497,6.37,21.535,7.063z"></path> <path fill="%233E68C0" d="M21.535,7.063c0.311,6.923-4.852,14.642-13.99,14.642 c-2.78,0-5.368-0.815-7.545-2.213c2.611,0.308,5.217-0.415,7.287-2.038c-2.154-0.039-3.972-1.462-4.599-3.418 c0.771,0.148,1.53,0.105,2.223-0.084c-2.367-0.475-4.002-2.608-3.948-4.888c0.664,0.369,1.423,0.59,2.229,0.615 C1.001,8.215,0.38,5.32,1.67,3.108c2.428,2.978,6.055,4.938,10.145,5.143c-0.717-3.079,1.618-6.044,4.796-6.044 c1.415,0,2.694,0.598,3.592,1.554c1.121-0.221,2.174-0.631,3.126-1.195c-0.368,1.149-1.149,2.114-2.164,2.724 c0.995-0.119,1.944-0.384,2.826-0.776C23.331,5.503,22.497,6.37,21.535,7.063z"></path>
</svg> </svg>
</a> </a>
<a class="share-btn linkedin" target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path" title="LinkedIn"> <a class="share-btn linkedin" target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/sharing/share-offsite/?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path" title="LinkedIn">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon">
<path fill="%233E68C0" d="M6.52,22h-4.13V8.667h4.13V22z M4.436,6.92 c-1.349,0-2.442-1.101-2.442-2.46C1.994,3.102,3.087,2,4.436,2s2.442,1.102,2.442,2.46C6.877,5.819,5.784,6.92,4.436,6.92z M21.994,22h-4.109c0,0,0-5.079,0-6.999c0-1.919-0.73-2.991-2.249-2.991c-1.652,0-2.515,1.116-2.515,2.991c0,2.054,0,6.999,0,6.999 h-3.96V8.667h3.96v1.796c0,0,1.191-2.202,4.02-2.202c2.828,0,4.853,1.727,4.853,5.298C21.994,17.129,21.994,22,21.994,22z"></path> <path fill="%233E68C0" d="M6.52,22h-4.13V8.667h4.13V22z M4.436,6.92 c-1.349,0-2.442-1.101-2.442-2.46C1.994,3.102,3.087,2,4.436,2s2.442,1.102,2.442,2.46C6.877,5.819,5.784,6.92,4.436,6.92z M21.994,22h-4.109c0,0,0-5.079,0-6.999c0-1.919-0.73-2.991-2.249-2.991c-1.652,0-2.515,1.116-2.515,2.991c0,2.054,0,6.999,0,6.999 h-3.96V8.667h3.96v1.796c0,0,1.191-2.202,4.02-2.202c2.828,0,4.853,1.727,4.853,5.298C21.994,17.129,21.994,22,21.994,22z"></path>
</svg> </svg>
</a> </a>
<a class="share-btn vk" target="_blank" href="//vk.com/share.php?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path&title=@Model.Post.Title" title="VK"> <a class="share-btn vk" target="_blank" rel="noopener noreferrer" href="//vk.com/share.php?url=@Context.Request.Scheme://@Context.Request.Host@Context.Request.Path&title=@Model.Post.Title" title="VK">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve" class="eapps-social-share-buttons-item-icon">
<path fill="%233E68C0" d="M23.876,17.52c-0.029-0.063-0.056-0.115-0.081-0.156c-0.416-0.75-1.212-1.67-2.387-2.762l-0.025-0.025 l-0.012-0.012l-0.013-0.013h-0.013c-0.533-0.508-0.871-0.85-1.012-1.025c-0.259-0.333-0.317-0.671-0.175-1.012 c0.1-0.258,0.475-0.804,1.125-1.637c0.342-0.442,0.612-0.795,0.812-1.062c1.441-1.916,2.066-3.141,1.874-3.674l-0.074-0.125 c-0.05-0.075-0.096-0.116-0.304-0.178c-0.208-0.062-0.466-0.057-1.107-0.057l-3.03,0.021c-0.155,0-0.486-0.017-0.594,0.008 s-0.163,0.038-0.163,0.038L18.633,5.88l-0.05,0.038c-0.042,0.025-0.087,0.069-0.138,0.131c-0.05,0.062-0.091,0.135-0.125,0.219 c-0.392,1.008-0.837,1.945-1.337,2.811c-0.308,0.517-0.591,0.964-0.85,1.343c-0.258,0.379-0.475,0.658-0.65,0.837 c-0.175,0.179-0.333,0.323-0.475,0.431s-0.25,0.154-0.325,0.138c-0.075-0.017-0.146-0.033-0.213-0.05 c-0.117-0.075-0.21-0.177-0.281-0.306s-0.119-0.292-0.144-0.487c-0.025-0.196-0.04-0.364-0.044-0.506 c-0.004-0.141-0.002-0.342,0.006-0.6c0.009-0.258,0.013-0.433,0.013-0.525c0-0.317,0.006-0.66,0.019-1.031s0.023-0.664,0.031-0.881 s0.012-0.446,0.012-0.687c0-0.242-0.015-0.431-0.044-0.569c-0.029-0.137-0.073-0.271-0.131-0.4s-0.144-0.229-0.256-0.3 c-0.112-0.071-0.252-0.127-0.419-0.169c-0.442-0.1-1.004-0.154-1.687-0.162C9.996,5.138,9,5.238,8.559,5.455 C8.384,5.547,8.226,5.672,8.084,5.83c-0.15,0.183-0.171,0.283-0.063,0.3c0.5,0.075,0.854,0.254,1.062,0.537l0.075,0.15 c0.058,0.108,0.117,0.3,0.175,0.575c0.058,0.275,0.096,0.579,0.112,0.912c0.042,0.608,0.042,1.129,0,1.562 s-0.081,0.771-0.119,1.012c-0.038,0.242-0.094,0.437-0.169,0.587s-0.125,0.242-0.15,0.275s-0.046,0.054-0.062,0.062 c-0.108,0.042-0.221,0.063-0.337,0.063c-0.117,0-0.258-0.058-0.425-0.175c-0.167-0.117-0.339-0.277-0.519-0.481 c-0.179-0.204-0.381-0.489-0.606-0.856c-0.225-0.366-0.458-0.8-0.7-1.299l-0.2-0.362C6.033,8.459,5.862,8.119,5.646,7.674 C5.429,7.228,5.238,6.797,5.071,6.381c-0.067-0.175-0.167-0.308-0.3-0.4L4.708,5.943C4.666,5.91,4.6,5.874,4.508,5.837 C4.416,5.799,3.576,5.766,3.219,5.766L0.831,5.78c-0.35,0-0.621,0.08-0.746,0.239l-0.05,0.075c-0.025,0.042-0.038,0.108-0.038,0.2 s0.025,0.204,0.075,0.337c0.5,1.175,1.043,2.308,1.631,3.399C2.29,11.121,2.801,12,3.234,12.666 c0.433,0.667,0.875,1.296,1.325,1.887c0.45,0.592,0.748,0.971,0.893,1.137c0.146,0.167,0.26,0.292,0.344,0.375l0.312,0.3 c0.2,0.2,0.494,0.439,0.881,0.718c0.387,0.279,0.816,0.554,1.287,0.825c0.471,0.271,1.018,0.491,1.643,0.662 s1.218,0.206,1.824,0.206h1.437c0.291-0.025,0.512-0.117,0.662-0.275l0.05-0.063c0.033-0.05,0.065-0.127,0.094-0.231 s0.044-0.219,0.044-0.344c-0.009-0.358,0.019-0.681,0.081-0.968s0.133-0.504,0.213-0.65c0.079-0.146,0.169-0.269,0.269-0.368 c0.1-0.1,0.171-0.16,0.213-0.181c0.041-0.021,0.075-0.035,0.1-0.044c0.2-0.067,0.435-0.002,0.706,0.194s0.525,0.437,0.762,0.725 s0.523,0.61,0.856,0.968s0.625,0.625,0.875,0.8l0.25,0.15c0.167,0.1,0.383,0.192,0.65,0.275c0.266,0.083,0.401,0.062,0.7,0.062 l3.262-0.003c0.316,0,0.5-0.099,0.674-0.203c0.175-0.104,0.279-0.219,0.312-0.344s0.035-0.267,0.006-0.425 C23.935,17.693,23.905,17.582,23.876,17.52z"></path> <path fill="%233E68C0" d="M23.876,17.52c-0.029-0.063-0.056-0.115-0.081-0.156c-0.416-0.75-1.212-1.67-2.387-2.762l-0.025-0.025 l-0.012-0.012l-0.013-0.013h-0.013c-0.533-0.508-0.871-0.85-1.012-1.025c-0.259-0.333-0.317-0.671-0.175-1.012 c0.1-0.258,0.475-0.804,1.125-1.637c0.342-0.442,0.612-0.795,0.812-1.062c1.441-1.916,2.066-3.141,1.874-3.674l-0.074-0.125 c-0.05-0.075-0.096-0.116-0.304-0.178c-0.208-0.062-0.466-0.057-1.107-0.057l-3.03,0.021c-0.155,0-0.486-0.017-0.594,0.008 s-0.163,0.038-0.163,0.038L18.633,5.88l-0.05,0.038c-0.042,0.025-0.087,0.069-0.138,0.131c-0.05,0.062-0.091,0.135-0.125,0.219 c-0.392,1.008-0.837,1.945-1.337,2.811c-0.308,0.517-0.591,0.964-0.85,1.343c-0.258,0.379-0.475,0.658-0.65,0.837 c-0.175,0.179-0.333,0.323-0.475,0.431s-0.25,0.154-0.325,0.138c-0.075-0.017-0.146-0.033-0.213-0.05 c-0.117-0.075-0.21-0.177-0.281-0.306s-0.119-0.292-0.144-0.487c-0.025-0.196-0.04-0.364-0.044-0.506 c-0.004-0.141-0.002-0.342,0.006-0.6c0.009-0.258,0.013-0.433,0.013-0.525c0-0.317,0.006-0.66,0.019-1.031s0.023-0.664,0.031-0.881 s0.012-0.446,0.012-0.687c0-0.242-0.015-0.431-0.044-0.569c-0.029-0.137-0.073-0.271-0.131-0.4s-0.144-0.229-0.256-0.3 c-0.112-0.071-0.252-0.127-0.419-0.169c-0.442-0.1-1.004-0.154-1.687-0.162C9.996,5.138,9,5.238,8.559,5.455 C8.384,5.547,8.226,5.672,8.084,5.83c-0.15,0.183-0.171,0.283-0.063,0.3c0.5,0.075,0.854,0.254,1.062,0.537l0.075,0.15 c0.058,0.108,0.117,0.3,0.175,0.575c0.058,0.275,0.096,0.579,0.112,0.912c0.042,0.608,0.042,1.129,0,1.562 s-0.081,0.771-0.119,1.012c-0.038,0.242-0.094,0.437-0.169,0.587s-0.125,0.242-0.15,0.275s-0.046,0.054-0.062,0.062 c-0.108,0.042-0.221,0.063-0.337,0.063c-0.117,0-0.258-0.058-0.425-0.175c-0.167-0.117-0.339-0.277-0.519-0.481 c-0.179-0.204-0.381-0.489-0.606-0.856c-0.225-0.366-0.458-0.8-0.7-1.299l-0.2-0.362C6.033,8.459,5.862,8.119,5.646,7.674 C5.429,7.228,5.238,6.797,5.071,6.381c-0.067-0.175-0.167-0.308-0.3-0.4L4.708,5.943C4.666,5.91,4.6,5.874,4.508,5.837 C4.416,5.799,3.576,5.766,3.219,5.766L0.831,5.78c-0.35,0-0.621,0.08-0.746,0.239l-0.05,0.075c-0.025,0.042-0.038,0.108-0.038,0.2 s0.025,0.204,0.075,0.337c0.5,1.175,1.043,2.308,1.631,3.399C2.29,11.121,2.801,12,3.234,12.666 c0.433,0.667,0.875,1.296,1.325,1.887c0.45,0.592,0.748,0.971,0.893,1.137c0.146,0.167,0.26,0.292,0.344,0.375l0.312,0.3 c0.2,0.2,0.494,0.439,0.881,0.718c0.387,0.279,0.816,0.554,1.287,0.825c0.471,0.271,1.018,0.491,1.643,0.662 s1.218,0.206,1.824,0.206h1.437c0.291-0.025,0.512-0.117,0.662-0.275l0.05-0.063c0.033-0.05,0.065-0.127,0.094-0.231 s0.044-0.219,0.044-0.344c-0.009-0.358,0.019-0.681,0.081-0.968s0.133-0.504,0.213-0.65c0.079-0.146,0.169-0.269,0.269-0.368 c0.1-0.1,0.171-0.16,0.213-0.181c0.041-0.021,0.075-0.035,0.1-0.044c0.2-0.067,0.435-0.002,0.706,0.194s0.525,0.437,0.762,0.725 s0.523,0.61,0.856,0.968s0.625,0.625,0.875,0.8l0.25,0.15c0.167,0.1,0.383,0.192,0.65,0.275c0.266,0.083,0.401,0.062,0.7,0.062 l3.262-0.003c0.316,0,0.5-0.099,0.674-0.203c0.175-0.104,0.279-0.219,0.312-0.344s0.035-0.267,0.006-0.425 C23.935,17.693,23.905,17.582,23.876,17.52z"></path>
</svg> </svg>
@@ -47,7 +69,7 @@
<div class="post-comments" style="display: none !important;"> <div class="post-comments" style="display: none !important;">
<h3>Comments: @Model.Post.Replies.TotalItems</h3> <h3>Comments: @Model.Post.Replies.TotalItems</h3>
<p> <p>
<a class="comment" href="@Model.Post.Url" target="_blank">// Add comment on Blogpost</a> <a class="comment" href="@Model.Post.Url" target="_blank" rel="noopener noreferrer">// Add comment on Blogpost</a>
</p> </p>
<div> <div>
@foreach (var i in Model.Post.Replies.Items.Where(i => i.InReplyTo == null)) @foreach (var i in Model.Post.Replies.Items.Where(i => i.InReplyTo == null))
@@ -66,10 +88,10 @@
<div class="follow-list"> <div class="follow-list">
@foreach (LinkModel link in Model.Links.Where(i => new[] { "twitter", "blogger", "github" }.Contains(i.Name)).OrderBy(i => i.Order)) @foreach (LinkModel link in Model.Links.Where(i => new[] { "twitter", "blogger", "github" }.Contains(i.Name)).OrderBy(i => i.Order))
{ {
<a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" title="@(link.Title)"></a> <a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" rel="noopener noreferrer" title="@(link.Title)"></a>
} }
<a class="socicon-rss" href="//xfox111.blogspot.com/feeds/posts/default?alt=rss" target="_blank" title="RSS Feed"></a> <a class="socicon-rss" href="//xfox111.blogspot.com/feeds/posts/default?alt=rss" target="_blank" rel="noopener noreferrer" title="RSS Feed"></a>
<a href="//buymeacoff.ee/xfox111" target="_blank" title="Buy me a coffee"> <a href="//buymeacoff.ee/xfox111" target="_blank" rel="noopener noreferrer" title="Buy me a coffee">
<img width="24" height="25" src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg"> <img width="24" height="25" src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg">
</a> </a>
</div> </div>
+36 -20
View File
@@ -1,21 +1,37 @@
@model ResumeViewModel @model ResumeViewModel
@{ @{
ViewData["Title"] = Localizer["My resume"]; ViewData["Title"] = Localizer["My resume"];
} }
<header> @section OpenGraph
<h1>@Localizer["My resume"]</h1> {
<p>@Localizer["Last update"]: @Model.Resume.LastUpdate</p> <meta name="author" content="@SharedLocalizer["Michael &apos;XFox&apos; Gordeev"]" />
<meta name="description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" />
<a class="comment" asp-action="Download">// @Localizer["Download CV"] (.pdf) &#xE118;</a><br />
<a class="comment" asp-action="Print">// @Localizer["Print CV"] &#xE749;</a> <meta property="og:type" content="article" />
</header> <meta property="og:site_name" content="@SharedLocalizer["Michael &apos;XFox&apos; Gordeev"]" />
<meta property="og:url" content="https://XFox111.NET/Resume" />
<article> <meta property="og:locale" content="@SharedLocalizer["en"]" />
@Html.Raw(Model.Resume.Content) <meta property="og:image" content="https://xfox111.net/images/me.jpg" />
</article> <meta property="og:description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" />
<meta property="og:title" content="@Localizer["My resume"]" />
@section Footer
{ <meta property="article:modified_time" content="@Model.Resume.LastUpdate.ToString("o")" />
<partial name="~/Views/Shared/ContactsBlock.cshtml" /> }
<header>
<h1>@Localizer["My resume"]</h1>
<p>@Localizer["Last update"]: @Model.Resume.LastUpdate</p>
<a class="comment" asp-action="Download">// @Localizer["Download resume"] (.pdf) &#xE118;</a><br />
<a class="comment" asp-action="Print">// @Localizer["Print resume"] &#xE749;</a>
</header>
<article>
@Html.Raw(Model.Resume.Content)
</article>
@section Footer
{
<partial name="~/Views/Shared/ContactsBlock.cshtml" />
} }
@@ -1,119 +1,119 @@
@model ViewModelBase @model ViewModelBase
@using Microsoft.AspNetCore.Http @using Microsoft.AspNetCore.Http
@{ @{
Layout = null; Layout = null;
HttpRequest request = ViewContext.HttpContext.Request; HttpRequest request = ViewContext.HttpContext.Request;
} }
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en-US"> <html lang="en-US">
<head> <head>
<title>Ready - XFox111</title> <title>Ready - XFox111</title>
<base href="~/assets/Construction/" /> <base href="~/assets/Construction/" />
<link rel="stylesheet" type="text/css" href="Construction.css"> <link rel="stylesheet" type="text/css" href="Construction.css">
<link rel="stylesheet" type="text/css" href="~/css/Fonts.css"> <link rel="stylesheet" type="text/css" href="~/css/Fonts.css">
<script type="text/javascript" src="Construction.js"></script> <script type="text/javascript" src="Construction.js"></script>
<meta name="author" content="Michael 'XFox' Gordeev"> <meta name="author" content="Michael 'XFox' Gordeev">
<meta name="description" content="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"> <meta name="description" content="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:locale" content="en_US"> <meta property="og:locale" content="en_US">
<meta property="og:image" content="//xfox111.net/pics/me.jpg"> <meta property="og:image" content="//xfox111.net/pics/me.jpg">
<meta property="og:description" content="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"> <meta property="og:description" content="Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!">
<meta property="og:title" content="Michael 'XFox' Gordeev - Personal website"> <meta property="og:title" content="Michael 'XFox' Gordeev - Personal website">
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head> </head>
<body onload="Load();"> <body onload="Load();">
<nav> <nav>
<div> <div>
<span>Output</span> <span>Output</span>
<div></div> <div></div>
<div> <div>
<div class="btn hide" title="Window Position"></div> <div class="btn hide" title="Window Position"></div>
<div class="btn maximize" title="Maximize"></div> <div class="btn maximize" title="Maximize"></div>
<div class="btn close" title="Close"></div> <div class="btn close" title="Close"></div>
</div> </div>
</div> </div>
<div> <div>
<span>Show output from:</span> <span>Show output from:</span>
<select> <select>
<option selected>Build</option> <option selected>Build</option>
</select> </select>
<img draggable="false" src="Images/tools.png" /> <img draggable="false" src="Images/tools.png" />
</div> </div>
</nav> </nav>
<main id="output"> <main id="output">
<p>1>------ Build started: Project: xfox111.net, Configuration: Any CPU ------</p> <p>1>------ Build started: Project: xfox111.net, Configuration: Any CPU ------</p>
<p>1> xfox111.net -> @request.Scheme://@request.Host/MyWebsite.dll </p> <p>1> xfox111.net -> @request.Scheme://@request.Host/MyWebsite.dll </p>
<p>2>------ Deploy started: Project: xfox111.net, Configuration: Any CPU ------</p> <p>2>------ Deploy started: Project: xfox111.net, Configuration: Any CPU ------</p>
<p>Updating the layout...</p> <p>Updating the layout...</p>
<p>Copying files: Total &#x3C;1 mb to layout...</p> <p>Copying files: Total &#x3C;1 mb to layout...</p>
<p>Checking whether required frameworks are installed...</p> <p>Checking whether required frameworks are installed...</p>
<p>Registering the website to run from layout...</p> <p>Registering the website to run from layout...</p>
<br /> <br />
<p class="err">========== Deployment failed ==========</p> <p class="err">========== Deployment failed ==========</p>
<p>Error message:</p> <p>Error message:</p>
<p class="err">========== Site is under construction ==========</p> <p class="err">========== Site is under construction ==========</p>
<br /> <br />
<p> <p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/‾\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/‾\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;_&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;_&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;╭-╮\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;╭-╮\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;----╰-╯&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;----╰-╯&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;///&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;///&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;///&nbsp;&nbsp;/||&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;///&nbsp;&nbsp;/||&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;>&nbsp;&nbsp;/&nbsp;||&nbsp;&nbsp;___\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;>&nbsp;&nbsp;/&nbsp;||&nbsp;&nbsp;___\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;^&nbsp;\՟||_/&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;^&nbsp;\՟||_/&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;/&nbsp;|&nbsp;\&nbsp;-/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;/&nbsp;|&nbsp;\&nbsp;-/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;/&nbsp;&nbsp;|&nbsp;|&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/&nbsp;/&nbsp;&nbsp;|&nbsp;|&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\&nbsp;&nbsp;\<br />
&nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/_/&nbsp;&nbsp;&nbsp;|_|/_________\\&nbsp;&nbsp;\<br /> &nbsp;&nbsp;/&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;/_/&nbsp;&nbsp;&nbsp;|_|/_________\\&nbsp;&nbsp;\<br />
&nbsp;/&nbsp;&nbsp;/_________________________\&nbsp;&nbsp;\<br /> &nbsp;/&nbsp;&nbsp;/_________________________\&nbsp;&nbsp;\<br />
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br /> |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />
&nbsp;‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ &nbsp;‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
</p> </p>
<br /> <br />
<p>It will be done soon</p> <p>It will be done soon</p>
<p>For now you can check my other links:</p> <p>For now you can check my other links:</p>
<br /> <br />
@foreach (LinkModel item in Model.Links.Where(i => i.Name.Belongs("outlook", "linkedin", "vkontakte", "twitter", "github"))) @foreach (LinkModel item in Model.Links.Where(i => i.Name.Belongs("outlook", "linkedin", "vkontakte", "twitter", "github")))
{ {
<p>@item.Title: <a href="@item.Url" target="_blank">@((item.Url.ToString().StartsWith("mailto:") ? "" : "https:") + item.Url)</a></p> <p>@item.Title: <a href="@item.Url" target="_blank" rel="noopener noreferrer">@((item.Url.ToString().StartsWith("mailto:") ? "" : "https:") + item.Url)</a></p>
} }
<br /> <br />
<p>========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========</p> <p>========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========</p>
<p>========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========</p> <p>========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========</p>
</main> </main>
<footer> <footer>
<div class="status-bar-btn btn task" title="Background tasks"></div> <div class="status-bar-btn btn task" title="Background tasks"></div>
<span id="status">Ready</span> <span id="status">Ready</span>
<div class="git-btn btn push" title="4 unpushed commits"> <div class="git-btn btn push" title="4 unpushed commits">
<span>4</span> <span>4</span>
</div> </div>
<div class="git-btn btn commit" title="11 changes"> <div class="git-btn btn commit" title="11 changes">
<span>11</span> <span>11</span>
</div> </div>
<div class="git-btn btn git" title="Path: //xfox111.net"> <div class="git-btn btn git" title="Path: //xfox111.net">
<span>xfox111</span> <span>xfox111</span>
</div> </div>
<div class="git-btn btn branch" title="Name: master"> <div class="git-btn btn branch" title="Name: master">
<span>master</span> <span>master</span>
</div> </div>
<div class="status-bar-btn btn notification" title="No Notifications"></div> <div class="status-bar-btn btn notification" title="No Notifications"></div>
</footer> </footer>
</body> </body>
</html> </html>
@@ -1,23 +1,23 @@
@model ViewModelBase @model ViewModelBase
@{ @{
ViewData["Title"] = SharedLocalizer["Contact information"]; ViewData["Title"] = SharedLocalizer["Contact information"];
} }
<header> <header>
<h1>@SharedLocalizer["Contact information"]</h1> <h1>@SharedLocalizer["Contact information"]</h1>
</header> </header>
<article> <article>
<p> <p>
@foreach (LinkModel link in Model.Links.Where(i => i.CanContactMe)) @foreach (LinkModel link in Model.Links.Where(i => i.CanContactMe))
{ {
<a class="socicon-@(link.Name)"></a> @(link.Title) <a href="@(link.Url)" target="_blank">@(link.Username)</a><br /> <a class="socicon-@(link.Name)"></a> @(link.Title) <a href="@(link.Url)" target="_blank" rel="noopener noreferrer">@(link.Username)</a><br />
} }
</p> </p>
<p> <p>
@foreach (LinkModel link in Model.Links.Where(i => !i.CanContactMe)) @foreach (LinkModel link in Model.Links.Where(i => !i.CanContactMe))
{ {
<a class="socicon-@(link.Name)"></a> @(link.Title) <a href="@(link.Url)" target="_blank">@(link.Username)</a><br /> <a class="socicon-@(link.Name)"></a> @(link.Title) <a href="@(link.Url)" target="_blank" rel="noopener noreferrer">@(link.Username)</a><br />
} }
</p> </p>
</article> </article>
@@ -1,36 +1,36 @@
@model ViewModelBase @model ViewModelBase
@{ @{
LinkModel email = Model.Links.FirstOrDefault(i => i.Name == "outlook" || i.Name == "email"); LinkModel email = Model.Links.FirstOrDefault(i => i.Name == "outlook" || i.Name == "email");
List<LinkModel> links = Model.Links.Where(i => new string[] { "linkedin", "github", "twitter", "vkontakte" }.Contains(i.Name)).OrderBy(i => i.Order).ToList(); List<LinkModel> links = Model.Links.Where(i => new string[] { "linkedin", "github", "twitter", "vkontakte" }.Contains(i.Name)).OrderBy(i => i.Order).ToList();
} }
<footer> <footer>
<var>if</var> (<var class="class">@SharedLocalizer["You"]</var>.@SharedLocalizer["InterestedInMe"])<br /> <var>if</var> (<var class="class">@SharedLocalizer["You"]</var>.@SharedLocalizer["InterestedInMe"])<br />
<div> <div>
<var class="method">@SharedLocalizer["ContactMe"]</var>();<br /> <var class="method">@SharedLocalizer["ContactMe"]</var>();<br />
</div> </div>
<br /> <br />
<a class="comment">// @SharedLocalizer["All links are clickable"] </a><br /> <a class="comment">// @SharedLocalizer["All links are clickable"] </a><br />
<var>public void</var> <var class="method">@SharedLocalizer["ContactMe"]</var>()<br /> <var>public void</var> <var class="method">@SharedLocalizer["ContactMe"]</var>()<br />
{<br /> {<br />
<div> <div>
@if (email != null) @if (email != null)
{ {
<span><var>string</var> email = <a href="@email.Url">@email.Username</a>;<br /></span> <span><var>string</var> email = <a href="@email.Url">@email.Username</a>;<br /></span>
} }
<var class="class">Link</var>[] @SharedLocalizer["socialNetworks"] = <var>new</var> <var class="class">Link</var>[]<br /> <var class="class">Link</var>[] @SharedLocalizer["socialNetworks"] = <var>new</var> <var class="class">Link</var>[]<br />
{<br /> {<br />
<div> <div>
@foreach (LinkModel link in links) @foreach (LinkModel link in links)
{ {
<span><img /><img /><var>new</var> <var class="class">Link</var>(<a>@(link.Title)</a>, <a target="_blank" href="@(link.Url)">https:@(link.Url)</a>),</span><br /> <span><img /><img /><var>new</var> <var class="class">Link</var>(<a>@(link.Title)</a>, <a target="_blank" rel="noopener noreferrer" href="@(link.Url)">https:@(link.Url)</a>),</span><br />
} }
</div> </div>
}<br /> }<br />
</div> </div>
}<br /> }<br />
<br /> <br />
<a class="comment">// @SharedLocalizer["Copyright"] &copy;@(DateTime.Today.Year) @SharedLocalizer["Michael \"XFox\" Gordeev"]</a> <a class="comment">// @SharedLocalizer["Copyright"] &copy;@(DateTime.Today.Year) @SharedLocalizer["Michael \"XFox\" Gordeev"]</a>
</footer> </footer>
<link rel="stylesheet" type="text/css" href="~/css/ContactsBlock.css" /> <link rel="stylesheet" type="text/css" href="~/css/ContactsBlock.css" />
@@ -1,46 +1,46 @@
@model ProjectsViewModel @model ProjectsViewModel
@{ @{
ViewData["Title"] = SharedLocalizer["My projects"]; ViewData["Title"] = SharedLocalizer["My projects"];
} }
<header> <header>
<div> <div>
<h1>@SharedLocalizer["My projects"]</h1> <h1>@SharedLocalizer["My projects"]</h1>
<h3>@SharedLocalizer["Here is presented the most of projects I worked on"]</h3> <h3>@SharedLocalizer["Here is presented the most of projects I worked on"]</h3>
</div> </div>
<iframe src="//githubbadge.appspot.com/xfox111" class="github-stats" frameborder="0"></iframe> <iframe src="//githubbadge.appspot.com/xfox111" class="github-stats" frameborder="0"></iframe>
</header> </header>
<article> <article>
@if (Model.Projects.Count() > 0) @if (Model.Projects.Count() > 0)
{ {
@foreach (ProjectModel project in Model.Projects.OrderBy(i => i.Order)) @foreach (ProjectModel project in Model.Projects.OrderBy(i => i.Order))
{ {
<div class="project-item"> <div class="project-item">
<div> <div>
<h1>@project.Title</h1> <h1>@project.Title</h1>
<p> <p>
@Html.Raw(project.Description?.Replace("\n", "<br />")) @Html.Raw(project.Description?.Replace("\n", "<br />"))
</p> </p>
<a href="@(project.Link)" target="_blank">@project.LinkCaption</a> <a href="@(project.Link)" target="_blank" rel="noopener noreferrer">@project.LinkCaption</a>
</div> </div>
<div class="badge-placeholder"> <div class="badge-placeholder">
@foreach (string b in (project.Badges ?? "").Split(',')) @foreach (string b in (project.Badges ?? "").Split(','))
{ {
BadgeModel badge = Model.Badges.FirstOrDefault(i => i.Name == b); BadgeModel badge = Model.Badges.FirstOrDefault(i => i.Name == b);
<div style="background-image: url('../images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div> <div style="background-image: url('../images/Badges/@(badge?.Image).png')" title="@(badge?.Description)"></div>
} }
</div> </div>
</div> </div>
} }
} }
else else
{ {
<p style="margin: 0px 40px" class="comment">// @SharedLocalizer["No content available"]</p> <p style="margin: 0px 40px" class="comment">// @SharedLocalizer["No content available"]</p>
} }
</article> </article>
@section Imports @section Imports
{ {
<link rel="stylesheet" type="text/css" href="~/css/Projects.css" /> <link rel="stylesheet" type="text/css" href="~/css/Projects.css" />
} }
+92 -92
View File
@@ -1,93 +1,93 @@
@model ViewModelBase @model ViewModelBase
<!DOCTYPE html> <!DOCTYPE html>
<html> <html prefix="og: http://ogp.me/ns#">
<head> <head>
<title>@ViewData["Title"] - XFox111.NET</title> <title>@ViewData["Title"] - XFox111.NET</title>
<link rel="shortcut icon" href="~/favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="~/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" type="text/css" href="~/css/Style.css" /> <link rel="stylesheet" type="text/css" href="~/css/Style.css" />
<link rel="stylesheet" type="text/css" href="~/css/Fonts.css" /> <link rel="stylesheet" type="text/css" href="~/css/Fonts.css" />
<link rel="stylesheet" type="text/css" href="~/css/Socicon.css" /> <link rel="stylesheet" type="text/css" href="~/css/Socicon.css" />
@if (Context.Request.Cookies.ContainsKey("useComicSans")) @if (Context.Request.Cookies.ContainsKey("useComicSans"))
{ {
<style type="text/css"> <style type="text/css">
body body
{ {
font-family: 'Comic Sans MS', 'Consolas', 'SegoeMDL2Assets'; font-family: 'Comic Sans MS', 'Consolas', 'SegoeMDL2Assets';
} }
</style> </style>
} }
<script type="text/javascript"> <script type="text/javascript">
function ToggleMenu() function ToggleMenu()
{ {
var menu = document.querySelector("nav menu"); var menu = document.querySelector("nav menu");
if (menu.style.display == "none") if (menu.style.display == "none")
menu.style.display = "initial"; menu.style.display = "initial";
else else
menu.style.display = "none"; menu.style.display = "none";
} }
</script> </script>
@RenderSection("Imports", false) @RenderSection("Imports", false)
@{ @{
if (IsSectionDefined("OpenGraph")) if (IsSectionDefined("OpenGraph"))
RenderSection("OpenGraph"); RenderSection("OpenGraph");
else else
{ {
<meta name="author" content="@SharedLocalizer["Michael \"XFox\" Gordeev"]" /> <meta name="author" content="@SharedLocalizer["Michael &apos;XFox&apos; Gordeev"]" />
<meta name="description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" /> <meta name="description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:site_name" content="XFox111.NET" /> <meta property="og:site_name" content="XFox111.NET" />
<meta property="og:url" content="//XFox111.NET/" /> <meta property="og:url" content="@Context.Request.Scheme://@Context.Request.Host@(Context.Request.Path)@Context.Request.QueryString" />
<meta property="og:locale" content="@SharedLocalizer["en"]" /> <meta property="og:locale" content="@SharedLocalizer["en"]" />
<meta property="og:image" content="/images/me.png" /> <meta property="og:image" content="https://xfox111.net/images/me.jpg" />
<meta property="og:description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" /> <meta property="og:description" content="@SharedLocalizer["Hi, my name is Michael. I'm C# Developer and this is my personal website. Here you can find info about me, my projects and more. Check it out!"]" />
<meta property="og:title" content="@SharedLocalizer["Michael \"XFox\" Gordeev"] - @SharedLocalizer["Personal website"]" /> <meta property="og:title" content="@SharedLocalizer["Michael &apos;XFox&apos; Gordeev"] - @SharedLocalizer["Personal website"]" />
} }
} }
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head> </head>
<body> <body>
<nav> <nav>
<a asp-controller="Home" asp-action="Index" asp-area="">XFox111.NET</a> <a asp-controller="Home" asp-action="Index" asp-area="">XFox111.NET</a>
<menu type="toolbar" style="display:none"> <menu type="toolbar" style="display:none">
<partial name="~/Views/Shared/TopBarMenu.cshtml" /> <partial name="~/Views/Shared/TopBarMenu.cshtml" />
</menu> </menu>
<div> <div>
<a asp-area="" asp-controller="Home" asp-action="SwitchLanguage" lang="@SharedLocalizer["ru"]">@SharedLocalizer["РУС"] &#xE12B;</a> <a asp-area="" asp-controller="Home" asp-action="SwitchLanguage" lang="@SharedLocalizer["ru"]">@SharedLocalizer["РУС"] &#xE12B;</a>
<a id="menu-toggle" onclick="ToggleMenu();">&#xE700;</a> <a id="menu-toggle" onclick="ToggleMenu();">&#xE700;</a>
</div> </div>
</nav> </nav>
<main onclick="document.querySelector('nav menu').style.display = 'none'"> <main onclick="document.querySelector('nav menu').style.display = 'none'">
@RenderBody() @RenderBody()
</main> </main>
@{ @{
if (IsSectionDefined("Footer")) if (IsSectionDefined("Footer"))
RenderSection("Footer"); RenderSection("Footer");
else else
{ {
<footer> <footer>
<span class="comment">// @SharedLocalizer["Copyright"] &copy;@(DateTime.Today.Year) @SharedLocalizer["Michael \"XFox\" Gordeev"]</span> <span class="comment">// @SharedLocalizer["Copyright"] &copy;@(DateTime.Today.Year) @SharedLocalizer["Michael \"XFox\" Gordeev"]</span>
<div> <div>
@foreach (LinkModel link in Model.Links.Where(i => i.DisplayInFooter).OrderBy(i => i.Order)) @foreach (LinkModel link in Model.Links.Where(i => i.DisplayInFooter).OrderBy(i => i.Order))
{ {
<a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" title="@(link.Title)"></a> <a class="socicon-@(link.Name)" href="@(link.Url)" target="_blank" rel="noopener noreferrer" title="@(link.Title)"></a>
} }
</div> </div>
</footer> </footer>
} }
} }
</body> </body>
</html> </html>