Skip to content
26 changes: 25 additions & 1 deletion main.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,34 @@ const isEn = () => location.hash.includes('README_EN');

const isRoot = () => ['', '#/', '#/README', '#/README_EN'].includes(location.hash);

const sidebar = () => (isRoot() ? false : isEn() ? 'summary_en.md' : 'summary.md');
const getSolutionPrefix = url => {
['javascript_', 'database_', 'shell_'].forEach(prefix => {
if (url.includes(prefix + 'solution')) {
return prefix;
}
});
return '';
};

const sidebar = () => {
if (isRoot()) {
return false;
}
const prefix = getSolutionPrefix(location.hash);
return isEn() ? `${prefix}summary_en.md` : `${prefix}summary.md`;
};

const cleanedHtml = html => {
return html.replace(/<pre>([\s\S]*?)<\/pre>/g, (_, group) => {
return '<pre>' + group.replace(/<code>([\s\S]*?)<\/code>/g, '$1') + '</pre>';
});
};

const replaceHref = html => {
const replacement = getSolutionPrefix(location.hash) + 'solution';
return replacement ? html.replace(/\/solution\//g, `/${replacement}/`) : html;
};

const getLang = () => (isEn() ? 'en' : 'zh-CN');

const giscusTheme = () =>
Expand All @@ -34,6 +54,9 @@ window.$docsify = {
auto2top: true,
subMaxLevel: 2,
alias: {
'^/javascript_solution/(.*)': '/solution/$1',
'^/shell_solution/(.*)': '/solution/$1',
'^/database_solution/(.*)': '/solution/$1',
'/lcs/.*/summary.md': '/lcs/summary.md',
'/lcp/.*/summary.md': '/lcp/summary.md',
'/lcci/.*/summary.md': '/lcci/summary.md',
Expand Down Expand Up @@ -128,6 +151,7 @@ window.$docsify = {
const github = `[GitHub](${url})`;
const gitee = `[Gitee](${url.replace('github', 'gitee')})`;
html = cleanedHtml(html);
html = replaceHref(html);
const editHtml = isEn()
? `:memo: Edit on ${github} / ${gitee}\n`
: `:memo: 在 ${github} / ${gitee} 编辑\n`;
Expand Down
67 changes: 67 additions & 0 deletions solution/javascript_summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
- [2618.检查是否是类的对象实例](/javascript_solution/2600-2699/2618.Check%20if%20Object%20Instance%20of%20Class/README.md)
- [2619.数组原型对象的最后一个元素](/javascript_solution/2600-2699/2619.Array%20Prototype%20Last/README.md)
- [2620.计数器](/javascript_solution/2600-2699/2620.Counter/README.md)
- [2621.睡眠函数](/javascript_solution/2600-2699/2621.Sleep/README.md)
- [2622.有时间限制的缓存](/javascript_solution/2600-2699/2622.Cache%20With%20Time%20Limit/README.md)
- [2623.记忆函数](/javascript_solution/2600-2699/2623.Memoize/README.md)
- [2624.蜗牛排序](/javascript_solution/2600-2699/2624.Snail%20Traversal/README.md)
- [2625.扁平化嵌套数组](/javascript_solution/2600-2699/2625.Flatten%20Deeply%20Nested%20Array/README.md)
- [2626.数组归约运算](/javascript_solution/2600-2699/2626.Array%20Reduce%20Transformation/README.md)
- [2627.函数防抖](/javascript_solution/2600-2699/2627.Debounce/README.md)
- [2628.完全相等的 JSON 字符串](/javascript_solution/2600-2699/2628.JSON%20Deep%20Equal/README.md)
- [2629.复合函数](/javascript_solution/2600-2699/2629.Function%20Composition/README.md)
- [2630.记忆函数 II](/javascript_solution/2600-2699/2630.Memoize%20II/README.md)
- [2631.分组](/javascript_solution/2600-2699/2631.Group%20By/README.md)
- [2632.柯里化](/javascript_solution/2600-2699/2632.Curry/README.md)
- [2633.将对象转换为 JSON 字符串](/javascript_solution/2600-2699/2633.Convert%20Object%20to%20JSON%20String/README.md)
- [2634.过滤数组中的元素](/javascript_solution/2600-2699/2634.Filter%20Elements%20from%20Array/README.md)
- [2635.转换数组中的每个元素](/javascript_solution/2600-2699/2635.Apply%20Transform%20Over%20Each%20Element%20in%20Array/README.md)
- [2636.Promise 对象池](/javascript_solution/2600-2699/2636.Promise%20Pool/README.md)
- [2637.有时间限制的 Promise 对象](/javascript_solution/2600-2699/2637.Promise%20Time%20Limit/README.md)
- [2648.生成斐波那契数列](/javascript_solution/2600-2699/2648.Generate%20Fibonacci%20Sequence/README.md)
- [2649.嵌套数组生成器](/javascript_solution/2600-2699/2649.Nested%20Array%20Generator/README.md)
- [2650.设计可取消函数](/javascript_solution/2600-2699/2650.Design%20Cancellable%20Function/README.md)
- [2665.计数器 II](/javascript_solution/2600-2699/2665.Counter%20II/README.md)
- [2666.只允许一次函数调用](/javascript_solution/2600-2699/2666.Allow%20One%20Function%20Call/README.md)
- [2667.创建 Hello World 函数](/javascript_solution/2600-2699/2667.Create%20Hello%20World%20Function/README.md)
- [2675.将对象数组转换为矩阵](/javascript_solution/2600-2699/2675.Array%20of%20Objects%20to%20Matrix/README.md)
- [2676.节流](/javascript_solution/2600-2699/2676.Throttle/README.md)
- [2677.分块数组](/javascript_solution/2600-2699/2677.Chunk%20Array/README.md)
- [2690.无穷方法对象](/javascript_solution/2600-2699/2690.Infinite%20Method%20Object/README.md)
- [2691.不可变辅助工具](/javascript_solution/2600-2699/2691.Immutability%20Helper/README.md)
- [2692.使对象不可变](/javascript_solution/2600-2699/2692.Make%20Object%20Immutable/README.md)
- [2693.使用自定义上下文调用函数](/javascript_solution/2600-2699/2693.Call%20Function%20with%20Custom%20Context/README.md)
- [2694.事件发射器](/javascript_solution/2600-2699/2694.Event%20Emitter/README.md)
- [2695.包装数组](/javascript_solution/2600-2699/2695.Array%20Wrapper/README.md)
- [2700.两个对象之间的差异](/javascript_solution/2700-2799/2700.Differences%20Between%20Two%20Objects/README.md)
- [2703.返回传递的参数的长度](/javascript_solution/2700-2799/2703.Return%20Length%20of%20Arguments%20Passed/README.md)
- [2704.相等还是不相等](/javascript_solution/2700-2799/2704.To%20Be%20Or%20Not%20To%20Be/README.md)
- [2705.精简对象](/javascript_solution/2700-2799/2705.Compact%20Object/README.md)
- [2715.执行可取消的延迟函数](/javascript_solution/2700-2799/2715.Timeout%20Cancellation/README.md)
- [2721.并行执行异步函数](/javascript_solution/2700-2799/2721.Execute%20Asynchronous%20Functions%20in%20Parallel/README.md)
- [2722.根据 ID 合并两个数组](/javascript_solution/2700-2799/2722.Join%20Two%20Arrays%20by%20ID/README.md)
- [2723.添加两个 Promise 对象](/javascript_solution/2700-2799/2723.Add%20Two%20Promises/README.md)
- [2724.排序方式](/javascript_solution/2700-2799/2724.Sort%20By/README.md)
- [2725.间隔取消](/javascript_solution/2700-2799/2725.Interval%20Cancellation/README.md)
- [2726.使用方法链的计算器](/javascript_solution/2700-2799/2726.Calculator%20with%20Method%20Chaining/README.md)
- [2727.判断对象是否为空](/javascript_solution/2700-2799/2727.Is%20Object%20Empty/README.md)
- [2754.将函数绑定到上下文](/javascript_solution/2700-2799/2754.Bind%20Function%20to%20Context/README.md)
- [2755.深度合并两个对象](/javascript_solution/2700-2799/2755.Deep%20Merge%20of%20Two%20Objects/README.md)
- [2756.批处理查询](/javascript_solution/2700-2799/2756.Query%20Batching/README.md)
- [2757.生成循环数组的值](/javascript_solution/2700-2799/2757.Generate%20Circular%20Array%20Values/README.md)
- [2758.下一天](/javascript_solution/2700-2799/2758.Next%20Day/README.md)
- [2759.将 JSON 字符串转换为对象](/javascript_solution/2700-2799/2759.Convert%20JSON%20String%20to%20Object/README.md)
- [2774.数组的上界](/javascript_solution/2700-2799/2774.Array%20Upper%20Bound/README.md)
- [2775.将 undefined 转为 null](/javascript_solution/2700-2799/2775.Undefined%20to%20Null/README.md)
- [2776.转换回调函数为 Promise 函数](/javascript_solution/2700-2799/2776.Convert%20Callback%20Based%20Function%20to%20Promise%20Based%20Function/README.md)
- [2777.日期范围生成器](/javascript_solution/2700-2799/2777.Date%20Range%20Generator/README.md)
- [2794.从两个数组中创建对象](/javascript_solution/2700-2799/2794.Create%20Object%20from%20Two%20Arrays/README.md)
- [2795.并行执行 Promise 以获取独有的结果](/javascript_solution/2700-2799/2795.Parallel%20Execution%20of%20Promises%20for%20Individual%20Results%20Retrieval/README.md)
- [2796.重复字符串](/javascript_solution/2700-2799/2796.Repeat%20String/README.md)
- [2797.带有占位符的部分函数](/javascript_solution/2700-2799/2797.Partial%20Function%20with%20Placeholders/README.md)
- [2803.阶乘生成器](/javascript_solution/2800-2899/2803.Factorial%20Generator/README.md)
- [2804.数组原型的 forEach 方法](/javascript_solution/2800-2899/2804.Array%20Prototype%20ForEach/README.md)
- [2805.自定义间隔](/javascript_solution/2800-2899/2805.Custom%20Interval/README.md)
- [2821.延迟每个 Promise 对象的解析](/javascript_solution/2800-2899/2821.Delay%20the%20Resolution%20of%20Each%20Promise/README.md)
- [2822.对象反转](/javascript_solution/2800-2899/2822.Inversion%20of%20Object/README.md)
- [2823.深度对象筛选](/javascript_solution/2800-2899/2823.Deep%20Object%20Filter/README.md)
67 changes: 67 additions & 0 deletions solution/javascript_summary_en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
- [2618.Check if Object Instance of Class](/javascript_solution/2600-2699/2618.Check%20if%20Object%20Instance%20of%20Class/README_EN.md)
- [2619.Array Prototype Last](/javascript_solution/2600-2699/2619.Array%20Prototype%20Last/README_EN.md)
- [2620.Counter](/javascript_solution/2600-2699/2620.Counter/README_EN.md)
- [2621.Sleep](/javascript_solution/2600-2699/2621.Sleep/README_EN.md)
- [2622.Cache With Time Limit](/javascript_solution/2600-2699/2622.Cache%20With%20Time%20Limit/README_EN.md)
- [2623.Memoize](/javascript_solution/2600-2699/2623.Memoize/README_EN.md)
- [2624.Snail Traversal](/javascript_solution/2600-2699/2624.Snail%20Traversal/README_EN.md)
- [2625.Flatten Deeply Nested Array](/javascript_solution/2600-2699/2625.Flatten%20Deeply%20Nested%20Array/README_EN.md)
- [2626.Array Reduce Transformation](/javascript_solution/2600-2699/2626.Array%20Reduce%20Transformation/README_EN.md)
- [2627.Debounce](/javascript_solution/2600-2699/2627.Debounce/README_EN.md)
- [2628.JSON Deep Equal](/javascript_solution/2600-2699/2628.JSON%20Deep%20Equal/README_EN.md)
- [2629.Function Composition](/javascript_solution/2600-2699/2629.Function%20Composition/README_EN.md)
- [2630.Memoize II](/javascript_solution/2600-2699/2630.Memoize%20II/README_EN.md)
- [2631.Group By](/javascript_solution/2600-2699/2631.Group%20By/README_EN.md)
- [2632.Curry](/javascript_solution/2600-2699/2632.Curry/README_EN.md)
- [2633.Convert Object to JSON String](/javascript_solution/2600-2699/2633.Convert%20Object%20to%20JSON%20String/README_EN.md)
- [2634.Filter Elements from Array](/javascript_solution/2600-2699/2634.Filter%20Elements%20from%20Array/README_EN.md)
- [2635.Apply Transform Over Each Element in Array](/javascript_solution/2600-2699/2635.Apply%20Transform%20Over%20Each%20Element%20in%20Array/README_EN.md)
- [2636.Promise Pool](/javascript_solution/2600-2699/2636.Promise%20Pool/README_EN.md)
- [2637.Promise Time Limit](/javascript_solution/2600-2699/2637.Promise%20Time%20Limit/README_EN.md)
- [2648.Generate Fibonacci Sequence](/javascript_solution/2600-2699/2648.Generate%20Fibonacci%20Sequence/README_EN.md)
- [2649.Nested Array Generator](/javascript_solution/2600-2699/2649.Nested%20Array%20Generator/README_EN.md)
- [2650.Design Cancellable Function](/javascript_solution/2600-2699/2650.Design%20Cancellable%20Function/README_EN.md)
- [2665.Counter II](/javascript_solution/2600-2699/2665.Counter%20II/README_EN.md)
- [2666.Allow One Function Call](/javascript_solution/2600-2699/2666.Allow%20One%20Function%20Call/README_EN.md)
- [2667.Create Hello World Function](/javascript_solution/2600-2699/2667.Create%20Hello%20World%20Function/README_EN.md)
- [2675.Array of Objects to Matrix](/javascript_solution/2600-2699/2675.Array%20of%20Objects%20to%20Matrix/README_EN.md)
- [2676.Throttle](/javascript_solution/2600-2699/2676.Throttle/README_EN.md)
- [2677.Chunk Array](/javascript_solution/2600-2699/2677.Chunk%20Array/README_EN.md)
- [2690.Infinite Method Object](/javascript_solution/2600-2699/2690.Infinite%20Method%20Object/README_EN.md)
- [2691.Immutability Helper](/javascript_solution/2600-2699/2691.Immutability%20Helper/README_EN.md)
- [2692.Make Object Immutable](/javascript_solution/2600-2699/2692.Make%20Object%20Immutable/README_EN.md)
- [2693.Call Function with Custom Context](/javascript_solution/2600-2699/2693.Call%20Function%20with%20Custom%20Context/README_EN.md)
- [2694.Event Emitter](/javascript_solution/2600-2699/2694.Event%20Emitter/README_EN.md)
- [2695.Array Wrapper](/javascript_solution/2600-2699/2695.Array%20Wrapper/README_EN.md)
- [2700.Differences Between Two Objects](/javascript_solution/2700-2799/2700.Differences%20Between%20Two%20Objects/README_EN.md)
- [2703.Return Length of Arguments Passed](/javascript_solution/2700-2799/2703.Return%20Length%20of%20Arguments%20Passed/README_EN.md)
- [2704.To Be Or Not To Be](/javascript_solution/2700-2799/2704.To%20Be%20Or%20Not%20To%20Be/README_EN.md)
- [2705.Compact Object](/javascript_solution/2700-2799/2705.Compact%20Object/README_EN.md)
- [2715.Timeout Cancellation](/javascript_solution/2700-2799/2715.Timeout%20Cancellation/README_EN.md)
- [2721.Execute Asynchronous Functions in Parallel](/javascript_solution/2700-2799/2721.Execute%20Asynchronous%20Functions%20in%20Parallel/README_EN.md)
- [2722.Join Two Arrays by ID](/javascript_solution/2700-2799/2722.Join%20Two%20Arrays%20by%20ID/README_EN.md)
- [2723.Add Two Promises](/javascript_solution/2700-2799/2723.Add%20Two%20Promises/README_EN.md)
- [2724.Sort By](/javascript_solution/2700-2799/2724.Sort%20By/README_EN.md)
- [2725.Interval Cancellation](/javascript_solution/2700-2799/2725.Interval%20Cancellation/README_EN.md)
- [2726.Calculator with Method Chaining](/javascript_solution/2700-2799/2726.Calculator%20with%20Method%20Chaining/README_EN.md)
- [2727.Is Object Empty](/javascript_solution/2700-2799/2727.Is%20Object%20Empty/README_EN.md)
- [2754.Bind Function to Context](/javascript_solution/2700-2799/2754.Bind%20Function%20to%20Context/README_EN.md)
- [2755.Deep Merge of Two Objects](/javascript_solution/2700-2799/2755.Deep%20Merge%20of%20Two%20Objects/README_EN.md)
- [2756.Query Batching](/javascript_solution/2700-2799/2756.Query%20Batching/README_EN.md)
- [2757.Generate Circular Array Values](/javascript_solution/2700-2799/2757.Generate%20Circular%20Array%20Values/README_EN.md)
- [2758.Next Day](/javascript_solution/2700-2799/2758.Next%20Day/README_EN.md)
- [2759.Convert JSON String to Object](/javascript_solution/2700-2799/2759.Convert%20JSON%20String%20to%20Object/README_EN.md)
- [2774.Array Upper Bound](/javascript_solution/2700-2799/2774.Array%20Upper%20Bound/README_EN.md)
- [2775.Undefined to Null](/javascript_solution/2700-2799/2775.Undefined%20to%20Null/README_EN.md)
- [2776.Convert Callback Based Function to Promise Based Function](/javascript_solution/2700-2799/2776.Convert%20Callback%20Based%20Function%20to%20Promise%20Based%20Function/README_EN.md)
- [2777.Date Range Generator](/javascript_solution/2700-2799/2777.Date%20Range%20Generator/README_EN.md)
- [2794.Create Object from Two Arrays](/javascript_solution/2700-2799/2794.Create%20Object%20from%20Two%20Arrays/README_EN.md)
- [2795.Parallel Execution of Promises for Individual Results Retrieval](/javascript_solution/2700-2799/2795.Parallel%20Execution%20of%20Promises%20for%20Individual%20Results%20Retrieval/README_EN.md)
- [2796.Repeat String](/javascript_solution/2700-2799/2796.Repeat%20String/README_EN.md)
- [2797.Partial Function with Placeholders](/javascript_solution/2700-2799/2797.Partial%20Function%20with%20Placeholders/README_EN.md)
- [2803.Factorial Generator](/javascript_solution/2800-2899/2803.Factorial%20Generator/README_EN.md)
- [2804.Array Prototype ForEach](/javascript_solution/2800-2899/2804.Array%20Prototype%20ForEach/README_EN.md)
- [2805.Custom Interval](/javascript_solution/2800-2899/2805.Custom%20Interval/README_EN.md)
- [2821.Delay the Resolution of Each Promise](/javascript_solution/2800-2899/2821.Delay%20the%20Resolution%20of%20Each%20Promise/README_EN.md)
- [2822.Inversion of Object](/javascript_solution/2800-2899/2822.Inversion%20of%20Object/README_EN.md)
- [2823.Deep Object Filter](/javascript_solution/2800-2899/2823.Deep%20Object%20Filter/README_EN.md)
40 changes: 38 additions & 2 deletions solution/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ def generate_question_readme(result):
item["title_cn"],
item["url_cn"],
item["relative_path_en"],
item["content_cn"].replace('leetcode-cn.com', 'leetcode.cn'),
item["content_cn"].replace("leetcode-cn.com", "leetcode.cn"),
)
)

Expand Down Expand Up @@ -202,6 +202,42 @@ def generate_summary(result):
f.write(summary_en)


def generate_category_summary(result, category=""):
"""generate category summary files"""
summary_cn = summary_en = ""
category = category.lower() if category else ""
sub_category = category + "_" if category else ""
m = {int(item["frontend_question_id"]): item for item in result}
for file in sorted(os.listdir("./"), key=lambda x: x.lower()):
if os.path.isdir("./" + file) and file != "__pycache__":
for sub in sorted(os.listdir("./" + file), key=lambda x: x.lower()):
sub = sub.replace("`", " ")
enc = quote(sub)
if not sub[:4].isdigit():
continue
data = m.get(int(sub[:4]))
if not data or (category and data["category"].lower() != category):
continue
sub_cn = sub
if data:
sub_cn = sub[:5] + data["title_cn"]

summary_cn += (
f" - [{sub_cn}](/{sub_category}solution/{file}/{enc}/README.md)\n"
)
summary_en += (
f" - [{sub}](/{sub_category}solution/{file}/{enc}/README_EN.md)\n"
)

# generate summary.md
with open(f"./{sub_category}summary.md", "w", encoding="utf-8") as f:
f.write(summary_cn)

# generate summary_en.md
with open(f"./{sub_category}summary_en.md", "w", encoding="utf-8") as f:
f.write(summary_en)


def refresh(result):
"""update problems"""
pattern = re.compile('src="(.*?)"')
Expand Down Expand Up @@ -248,7 +284,7 @@ def refresh(result):
)
cn_content = cn_content.replace(url, new_url)

cn_content = cn_content.replace('leetcode-cn.com', 'leetcode.cn')
cn_content = cn_content.replace("leetcode-cn.com", "leetcode.cn")
with open(path_cn, "w", encoding="utf-8") as f1:
f1.write(cn_content)

Expand Down