public static Task <string> ImportWithImagesAsync(this(IMarkdownService, IStaticFileRepository) v, string content, string typeid) { (IMarkdownService markdown, IStaticFileRepository files) = v; return(markdown.SolveImagesUrlAsync(content, async url => { if (!url.StartsWith("data:image/")) { return url; } var index = url.IndexOf(";base64,"); if (index == -1) { return url; } string ext = url[11..index]; // upload files string fileName; do { var guid = Guid.NewGuid().ToString("N").Substring(0, 16); fileName = $"images/problem/{typeid}.{guid}.{ext}"; }while (files.GetFileInfo(fileName).Exists); try { var fileIn = Convert.FromBase64String(url.Substring(index + 8)); await files.WriteBinaryAsync(fileName, fileIn); return "/" + fileName; } catch { return url; } }));
public MarkdownProblemViewProvider( IMarkdownService markdownService, HtmlEncoder encoder, IStaticFileRepository io2) { Markdown = markdownService; Encoder = encoder; StaticFiles = io2; }
public async Task <IActionResult> ImagesUpload( [FromQuery] int id, [FromQuery] string type, [FromForm(Name = "editormd-image-file")] IFormFile formFile, [FromServices] IStaticFileRepository io, [FromServices] ArrayPool <byte> arrayPool) { // handle authorize bool authorized = User.IsInRole("Administrator"); if (type == "c") { authorized = authorized || User.IsInRole($"JuryOfContest{id}"); } else if (type == "p") { authorized = authorized || User.IsInRole($"AuthorOfProblem{id}"); } else { authorized = false; } if (!authorized || formFile == null) { return(new ObjectResult(new { success = 0, message = "无权限访问。" })); } if (formFile.Length > (5 << 20)) { return(new ObjectResult(new { success = 0, message = "文件过大。" })); } // upload files try { string fileName, fileNameFull; do { var ext = Path.GetExtension(formFile.FileName); var guid = Guid.NewGuid().ToString("N").Substring(0, 16); fileName = $"{type}{id}.{guid}{ext}"; fileNameFull = "images/problem/" + fileName; }while (io.GetFileInfo(fileNameFull).Exists); using (var dest = io.OpenWrite(fileNameFull)) await formFile.CopyToAsync(dest); await HttpContext.AuditAsync("upload", fileName); return(new ObjectResult(new { success = 1, url = "/" + fileNameFull })); } catch (Exception ex) { return(new ObjectResult(new { success = 0, message = "内部错误。" + ex.Message })); } }
public async Task <IActionResult> GenerateStatement(int cid, [FromServices] IProblemViewProvider generator, [FromServices] IStaticFileRepository io) { var stmts = await Facade.Problemset.StatementsAsync(cid); var startTime = Contest.StartTime ?? DateTimeOffset.Now; var startDate = startTime.ToString("dddd, MMMM d, yyyy", formatProvider: System.Globalization.CultureInfo.GetCultureInfo(1033)); var memstream = new MemoryStream(); using (var zip = new ZipArchive(memstream, ZipArchiveMode.Create, true)) { var olymp = io.GetFileInfo("static/olymp.sty"); using (var olympStream = olymp.CreateReadStream()) await zip.CreateEntryFromStream(olympStream, "olymp.sty"); var texBegin = io.GetFileInfo("static/contest.tex-begin"); var documentStart = await texBegin.ReadAsync(); var documentBuilder = new System.Text.StringBuilder(documentStart) .Append("\\begin {document}\n\n") .Append("\\contest\n{") .Append(Contest.Name) .Append("}%\n{ACM.XYLAB.FUN}%\n{") .Append(startDate) .Append("}%\n\n") .Append("\\binoppenalty=10000\n") .Append("\\relpenalty=10000\n\n") .Append("\\renewcommand{\\t}{\\texttt}\n\n"); foreach (var item in stmts) { var folderPrefix = $"{item.ShortName}/"; generator.BuildLatex(zip, item, folderPrefix); documentBuilder .Append("\\graphicspath{{./") .Append(item.ShortName) .Append("/}}\n\\import{./") .Append(item.ShortName) .Append("/}{./problem.tex}\n\n"); } documentBuilder.Append("\\end{document}\n\n"); zip.CreateEntryFromString(documentBuilder.ToString(), "contest.tex"); } memstream.Position = 0; return(File(memstream, "application/zip", $"c{cid}-statements.zip")); }
public KattisExportProvider( IProblemStore store, ISubmissionStore submissions, IExecutableStore execs, ITestcaseStore tcs, IMarkdownService markdown, IStaticFileRepository io2) { Store = store; StaticFile = io2; Markdown = markdown; Submissions = submissions; Executables = execs; Testcases = tcs; }
public DataImportProvider( IProblemStore store, ILanguageStore languages, IExecutableStore executables, ISubmissionStore submissions, ILogger <DataImportProvider> logger, IStaticFileRepository io2) { Logger = logger; Store = store; Languages = languages; Executables = executables; Submissions = submissions; LogBuffer = new StringBuilder(); StaticFiles = io2; }
public KattisImportProvider( IProblemStore store, ILanguageStore languages, IExecutableStore executables, ISubmissionStore submissions, ILogger <KattisImportProvider> logger, IMarkdownService markdownService, IStaticFileRepository io2) { Logger = logger; Store = store; Languages = languages; Executables = executables; Submissions = submissions; LogBuffer = new StringBuilder(); Markdown = markdownService; StaticFiles = io2; }
public static Task <string> ExportWithImagesAsync(this(IMarkdownService, IStaticFileRepository) v, string content) { (IMarkdownService markdown, IStaticFileRepository files) = v; return(markdown.SolveImagesUrlAsync(content, async url => { if (!url.StartsWith("/images/problem/")) { return url; } var file = files.GetFileInfo(url); if (!file.Exists) { return url; } var img = await file.ReadBinaryAsync(); var imgExt = Path.GetExtension(url).TrimStart('.'); return $"data:image/{imgExt};base64," + Convert.ToBase64String(img); })); }