Пример #1
0
        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;
 }
Пример #3
0
        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 }));
            }
        }
Пример #4
0
        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"));
        }
Пример #5
0
 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;
 }
Пример #6
0
 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;
 }
Пример #7
0
 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;
 }
Пример #8
0
 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);
     }));
 }