Zacharia2 / SuperMemo-Toolkit

SuperMemo 增强工具(CLI命令行)。包含图链整理、EPUB图书转换导入、Latex公式转图片等。
GNU General Public License v2.0
24 stars 3 forks source link

图链整理小工具 #4

Closed Zacharia2 closed 10 months ago

Zacharia2 commented 10 months ago

如果是网络图片就下载下来,然后放到统一位置。要注意图片格式。

如果是本地图片,就改为相对路径。本地图片一般是绝对路径。

所以就是输入任意路径(非相对路径),输出一个相对路径。

采取对集合文件的一个个处理。

Zacharia2 commented 10 months ago

https://zhuanlan.zhihu.com/p/545894970?utm_id=0

Zacharia2 commented 10 months ago

https://blog.csdn.net/Mr_Sun88/article/details/106303440

Zacharia2 commented 10 months ago
import os
from PIL import Image, ImageOps

if __name__ == '__main__':
    srcImagePath = 'D:/test.webp'
    image = Image.open(srcImagePath)
    image = ImageOps.exif_transpose(image)
    path, ext = os.path.splitext(srcImagePath)
    dstImagePath = path + '.png'
    image.save(dstImagePath)
    print('%s ---> %s' % (srcImagePath, dstImagePath))
Zacharia2 commented 10 months ago

在网页中,常见的图片格式有以下几种:

  1. JPEG(或JPG):这是最常见的图片格式之一,用于在网页中显示照片或其他图像。它具有较高的压缩率,可以在保持较高质量的同时减小文件大小。

  2. PNG:Portable Network Graphics(可移植网络图形)使用无损压缩算法,适用于图像中带有透明背景的情况。PNG格式的图像质量通常比JPEG更好,但文件大小可能会更大。

  3. GIF:Graphics Interchange Format(图形交换格式)支持动画和透明背景。GIF格式适用于简单的动画图像和具有少量颜色的图像。

  4. BMP:Windows位图格式是一种无损位图图像格式。它不进行压缩,因此文件大小较大。BMP通常用于在Windows系统中处理图像。

  5. TIFF:Tagged Image File Format(标记图像文件格式)是一种高质量的无损图像格式。它适用于印刷和出版领域,支持多通道色彩、透明度和多种压缩算法。

  6. SVG:Scalable Vector Graphics(可缩放矢量图形)是一种基于XML的矢量图形格式。它使用数学描述来定义图像,因此可以无限放大而不会失真。

请注意,这些只是常见的图片格式之一。还有其他一些不太常见的图片格式,例如WebP、ICO、PSD等,具体使用哪种格式取决于网页开发人员或图像设计师的要求和喜好。

Zacharia2 commented 10 months ago

WebP:一种由Google开发的图片格式,具有较小的文件大小和较高的图像质量。在某些情况下,WebP可以比JPEG和PNG更有效地压缩图像。

Zacharia2 commented 10 months ago

实现路径

  1. 先实现,下载和转化非jpg和png为png图片。
  2. 如何实现转换模块?
  3. 在实现,遍历elements文件夹,对其中的文件挨个使用soup读取img标签的链接
  4. 如何实现遍历目录?
  5. 判断链接的类型,返回类型。
  6. 如何判断链接的类型?需要查找链接的类型。

https://github.com/KingSun5/WebpToPngByPython/blob/master/ConvertImage.py

Pillow

整体思路,遍历目标目录,对目标目录中的html文件使用soup进行读取,找到img标签,并获取src属性。对属性中的链接类型进行判断,并根据判断的结果执行变更为相对路径或者执行下载任务。

在执行下载任务时,判断是否是jpg或png图片,如果不是,则执行转换操作,转换完成后,放到定义的目录下。如果是,则直接放到定义的目录下,并返回相对文件路径。

Zacharia2 commented 10 months ago

https://ask.csdn.net/questions/7866665

判断sm是否关闭。在关闭后执行任务。

Zacharia2 commented 10 months ago

PathPix 名字

Zacharia2 commented 10 months ago

https://pillow.readthedocs.io/en/stable/handbook/tutorial.html

Zacharia2 commented 10 months ago
function isUrl(str) {
    var v = new RegExp('^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', 'i');
    return v.test(str);
}

以下是等价的Python代码来实现与给出的Typescript代码相同的功能:

import re

def is_url(str):
    v = re.compile('^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$', re.IGNORECASE)
    return bool(v.match(str))

上述代码使用Python的re模块中的re.compile和re.match方法来实现与给出的JavaScript代码相同的正则表达式匹配。is_url函数将返回一个布尔值,指示是否匹配URL模式。

请注意,这只是一个对代码的直译,是一种处理URL匹配的方法。具体使用方式可能需要根据你的实际需求进行修改。

Zacharia2 commented 10 months ago

file:///.*?elements/

file:///z:/applications%20(parallels)/sm18-lazy-package/sm18/systems/abc%20of%20supermemo%2018/elements/22/229.jpg

file:///[PrimaryStorage]

Zacharia2 commented 10 months ago
string = "file:///[PrimaryStorage]/path/to/file"

if string.startswith("file:///[PrimaryStorage]"):
    print("字符串以 file:///[PrimaryStorage] 开头")
else:
    print("字符串不以 file:///[PrimaryStorage] 开头")
Zacharia2 commented 10 months ago

现在有三种类型,绝对路径,网络图片,相对路径。分别使用1到3,三个数字表示。

Zacharia2 commented 10 months ago

supermemo.ini

[Systems] System1=all in one

或许会设为当前的?

结论是,软件打开后,会自动打开System1集合,关闭软件后会存储最后使用的集合到System1。

所以,可以,在sm程序结束后的一秒后读取这个并处理最后使用的集合。

psutil软件环境变量。或者qiucker的相关。

Zacharia2 commented 10 months ago

实在不行就命令手动整理。

Zacharia2 commented 10 months ago

f-Strings,格式化字符串文字,f'images/{filename}.png'

Zacharia2 commented 10 months ago

os.scandir(path)

def collect_html_as_list(path):
files = []
    def collect_htm():
         nolocal files

         for item in os.scandir(path):
            if item.is_dir():
               collect_html(item.path)

            elif item.is_file():
              files.append(item.path)

 return files

遍历目录中的所有htm文件,收集整理为列表。

Zacharia2 commented 10 months ago

当然,您可以使用os.scandir来实现遍历目录并整理为列表。下面是使用os.scandir的示例代码:

import os

def find_htm_files(directory):
    htm_files = []
    with os.scandir(directory) as entries:
        for entry in entries:
            if entry.is_file() and entry.name.endswith(".htm"):
                htm_files.append(entry.path)

    return htm_files

directory = "/path/to/directory"
htm_files_list = find_htm_files(directory)
print(htm_files_list)

在这个示例中,find_htm_files函数使用os.scandir遍历指定目录。with os.scandir(directory) as entries:打开目录并使用entries迭代其中的条目。对于每个条目,我们检查它是否是一个文件且以.htm结尾。如果满足条件,我们将其路径添加到htm_files列表中。最后,返回整理好的htm文件列表并进行打印。

同样,请将/path/to/directory替换为您想要遍历的目录的实际路径。

Zacharia2 commented 10 months ago

你可以使用Python中的os和glob模块来遍历目录并筛选出所有的htm文件。以下是一个示例代码:

import os
import glob

def find_htm_files(directory):
    htm_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(".htm"):
                htm_files.append(os.path.join(root, file))

    return htm_files

directory = "/path/to/directory"
htm_files_list = find_htm_files(directory)
print(htm_files_list)

在这段代码中,find_htm_files函数接受一个目录路径作为输入,并返回一个包含所有htm文件路径的列表。通过使用os.walk函数,我们可以遍历指定目录及其子目录中的所有文件。然后,使用file.endswith(".htm")来筛选出以.htm结尾的文件,并将它们的完整路径添加到htm_files列表中。最后,我们打印出这个列表。

请记得将"/path/to/directory"替换为你想要遍历的目录的实际路径。

Zacharia2 commented 10 months ago

要判断链接中的图片格式,您可以遵循以下步骤:

  1. 查看链接的URL:通常,链接中的URL会在文件扩展名中包含有关图片格式的信息。例如,以".jpg"结尾的URL表示该图像是JPEG格式,".png"表示PNG格式,".gif"表示GIF格式,以此类推。

  2. 使用网络工具:您可以使用在线工具或编程语言提供的函数来确定链接中的图片格式。例如,大多数编程语言都有内置函数可以提取文件扩展名并判断其对应的格式。您可以使用这些函数来获取链接的文件扩展名并确定其中的图片格式。

  3. HTTP头信息:您可以发送HTTP请求并检查响应头中的内容类型(Content-Type)。大多数服务器会在响应头中包含有关文件的信息,其中也包括图片文件的格式信息。例如,Content-Type为"image/jpeg"表示图片格式为JPEG。

请记住,这些方法仅适用于能够访问链接的情况。如果链接无法访问,您可能需要尝试其他方法来确定图片格式。

Zacharia2 commented 10 months ago

ok

Zacharia2 commented 10 months ago

还有这种:'file:///C:/Users/Snowy/Desktop/sm18/必读:旅途的开始.png'

'C:/Users/Snowy/Desktop/sm18/systems/Noname/elements/web_pic\im_2023-11-09-20_39_50_plot_19.jpeg'

判断本地路径是否存在于elements目录下,不存在则要移动(复制)进去

因为只有Windows才有,所以只考虑Windows目录。

全部标准化变成file:///开头的。然后再处理。

Zacharia2 commented 10 months ago

要判断给定路径是否位于 C:/Users/Snowy/Desktop/sm18/systems/Noname/elements 文件夹内部,你可以使用 Python 的 os.path 模块和字符串操作来实现。下面是一个示例代码:

import os
import urllib.parse

def is_in_elements_directory(path, directory):
    # 解码URL路径,转换为文件系统路径
    fs_path = urllib.parse.unquote(path)

    # 获取文件夹名称
    directory_name = os.path.basename(fs_path)

    # 判断给定路径是否以指定目录开头
    return fs_path.startswith(os.path.join(directory, directory_name))

# 测试例子
path1 = 'file:///C:/Users/Snowy/Desktop/sm18/必读:旅途的开始.png'
directory = 'C:/Users/Snowy/Desktop/sm18/systems/Noname/elements'

print(is_in_elements_directory(path1, directory))  # True

在这个示例中,is_in_elements_directory 函数接受两个参数,path 代表待检查的路径,directory 代表目标文件夹路径。首先,使用 urllib.parse.unquote() 函数解码 URL 路径,并将其转换为文件系统路径。然后,使用 os.path.basename() 函数获取路径中的最后一级文件夹名称。接下来,使用 os.path.join() 函数将目标文件夹路径和文件夹名称拼接起来,得到完整的目标路径。最后,使用 startswith() 方法来判断给定路径是否以目标路径开头,如果是则返回 True,否则返回 False

需要注意的是,由于文件夹名称是区分大小写的,函数对文件夹名称的匹配也是区分大小写的。如果需要不区分大小写的匹配,可以将目标路径和给定路径都转换为小写或大写后再进行判断。

Zacharia2 commented 10 months ago

本地图片有三种类型,相对,绝对,绝对两种,在elements文件夹中和不在elements文件夹里面。

Zacharia2 commented 10 months ago

要将UTF-8编码的文件转换为GBK编码,您可以采取以下步骤:

  1. 打开您的文本编辑器或IDE,然后打开UTF-8编码的文件。

  2. 将文件保存为一个新的空白文件,确保选择使用GBK编码进行保存。这将确保文件以GBK编码进行保存,并准备好进行重新编码。

  3. 使用Python编程语言或其他支持文件编码转换的工具进行编码转换。以下是使用Python进行编码转换的示例代码:

import codecs

input_file = 'utf8_file.txt'
output_file = 'gbk_file.txt'

with codecs.open(input_file, 'r', 'utf-8') as f:
    content = f.read()

with codecs.open(output_file, 'w', 'gbk') as f:
    f.write(content)

'utf8_file.txt'替换为您的UTF-8编码文件的文件名,将'gbk_file.txt'替换为您希望生成的GBK编码文件的文件名。

  1. 运行上述代码,它将读取UTF-8文件中的内容,并将其写入以GBK编码保存的文件中。

经过上述步骤,您的UTF-8编码文件将以GBK编码进行重新编码,并保存为一个新的文件。您可以使用新的GBK编码文件进行后续操作或查看。