vault backup: 2025-12-07 12:39:26
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m21s
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m21s
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,3 +4,4 @@
|
||||
.quartz-cache
|
||||
node_modules
|
||||
public
|
||||
wip/output
|
||||
@@ -33,6 +33,6 @@ Finns det värde i att svara alla med AI?
|
||||
- [ ] göra klart introduktion till metabolismen
|
||||
- [ ] glykolysen, lägg till vilka steg som är reversibla
|
||||
- [ ] också vilka steg som producerar ATP+NADPH
|
||||
- [ ] β-oxidation
|
||||
- [ ] β-oxidation (men har använt emils)
|
||||
- [ ] glykogen
|
||||
- [ ] ETK
|
||||
|
||||
73
wip/script.js
Normal file
73
wip/script.js
Normal file
@@ -0,0 +1,73 @@
|
||||
MathJax.Hub.Config({
|
||||
config: ["MMLorHTML.js"],
|
||||
jax: ["input/TeX", "output/HTML-CSS", "output/NativeMML"],
|
||||
extensions: ["MathMenu.js", "MathZoom.js"]
|
||||
});
|
||||
|
||||
let indexData = null;
|
||||
|
||||
async function loadIndex() {
|
||||
if (indexData) return indexData;
|
||||
const res = await fetch("/index.json");
|
||||
indexData = await res.json();
|
||||
return indexData;
|
||||
}
|
||||
|
||||
const templates = {
|
||||
folder: i => `<li><details><summary>${i.key}</summary>${i.inner}</details></li>`,
|
||||
file: i => `<li><a href="${i.href}">${i.title}</a></li>`
|
||||
};
|
||||
|
||||
function renderTree(data) {
|
||||
const items = Object.entries(data).map(([key, note]) => {
|
||||
if (key === "children") return null;
|
||||
if (note.children) return { type: "folder", key, inner: renderTree(note.children) };
|
||||
if (note.folder && note.filename) {
|
||||
const title = note.title || note.filename.replace(/\.md$/, "");
|
||||
let href = title + ".html";
|
||||
if (note.folder !== ".") href = `${note.folder}/${href}`;
|
||||
href = "/" + href;
|
||||
return { type: "file", href, title };
|
||||
}
|
||||
return null;
|
||||
}).filter((i) => i !== null);
|
||||
|
||||
// Sort: folders first (alphabetically), then files (alphabetically)
|
||||
// Use natural sorting for numbers (1, 2, 10 instead of 1, 10, 2)
|
||||
items.sort((a, b) => {
|
||||
if (a.type !== b.type) return a.type === "folder" ? -1 : 1;
|
||||
const nameA = (a.type === "folder" ? a.key : a.title);
|
||||
const nameB = (b.type === "folder" ? b.key : b.title);
|
||||
return nameA.localeCompare(nameB, undefined, { numeric: true, sensitivity: "base" });
|
||||
});
|
||||
|
||||
return `<ul>${items.map(i => templates[i.type](i)).join("")}</ul>`;
|
||||
}
|
||||
|
||||
loadIndex().then(data => {
|
||||
const sidebar = document.querySelector(".sidebar");
|
||||
if (sidebar) {
|
||||
sidebar.innerHTML = renderTree(data);
|
||||
|
||||
// Find and highlight the current page link
|
||||
const currentPath = window.location.pathname;
|
||||
const links = sidebar.querySelectorAll("a");
|
||||
for (const link of links) {
|
||||
const linkPath = new URL(link.href, window.location.origin).pathname;
|
||||
if (linkPath === currentPath) {
|
||||
link.classList.add("active");
|
||||
|
||||
// Expand all parent <details> elements
|
||||
let parent = link.parentElement;
|
||||
while (parent && parent !== sidebar) {
|
||||
if (parent.tagName === "DETAILS") {
|
||||
parent.open = true;
|
||||
}
|
||||
parent = parent.parentElement;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
185
wip/static.py
185
wip/static.py
@@ -1,16 +1,27 @@
|
||||
import argparse
|
||||
import http.server
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
|
||||
import shutil
|
||||
import jinja2
|
||||
|
||||
from markdown.core import Markdown
|
||||
from markdown.extensions import Extension
|
||||
from markdown.preprocessors import Preprocessor
|
||||
from obsidian_parser import Vault
|
||||
from obsidian_parser import Note, Vault
|
||||
|
||||
|
||||
def out_content(self):
|
||||
content = self.content
|
||||
if content.startswith("---\n"):
|
||||
content = content.split("---\n", 2)[2]
|
||||
return content
|
||||
Note.our_content = property(out_content)
|
||||
|
||||
root_dir = pathlib.Path(__file__).parent
|
||||
vault = Vault(root_dir.parent / "content")
|
||||
note = vault.get_note("Biokemi/Cellulära processer/Transport över cellmembran/Anteckningar.md")
|
||||
loader = jinja2.FileSystemLoader(root_dir / "templates")
|
||||
env = jinja2.Environment(loader=loader)
|
||||
|
||||
@@ -23,9 +34,9 @@ class ObsidianImage(Preprocessor):
|
||||
if m:
|
||||
if "|" in m.group(1):
|
||||
img, width = m.group(1).split("|")
|
||||
new_lines.append("<img src='../content/attachments/" + img + "' style='width:" + width + ";'/>")
|
||||
new_lines.append(f"<img src='attachments/{img}' style='width:{width};'/>")
|
||||
else:
|
||||
new_lines.append("<img src='../content/attachments/" + m.group(1) + "'/>")
|
||||
new_lines.append(f"<img src='attachments/{m.group(1)}'/>")
|
||||
else:
|
||||
new_lines.append(line)
|
||||
return new_lines
|
||||
@@ -35,35 +46,145 @@ class ObsidianImageExtension(Extension):
|
||||
def extendMarkdown(self, md):
|
||||
md.preprocessors.register(ObsidianImage(md), 'obsidianimage', 175)
|
||||
|
||||
m = Markdown(
|
||||
extensions=[
|
||||
"mdx_math",
|
||||
"nl2br",
|
||||
ObsidianImageExtension(),
|
||||
],
|
||||
extension_configs={
|
||||
"mdx_math": {
|
||||
"enable_dollar_delimiter": True
|
||||
}
|
||||
},
|
||||
tab_length=2,
|
||||
)
|
||||
env.filters["markdown"] = m.convert
|
||||
def make_markdown():
|
||||
return Markdown(
|
||||
extensions=[
|
||||
"fenced_code",
|
||||
"mdx_math",
|
||||
"nl2br",
|
||||
"tables",
|
||||
ObsidianImageExtension(),
|
||||
],
|
||||
extension_configs={
|
||||
"mdx_math": {
|
||||
"enable_dollar_delimiter": True
|
||||
}
|
||||
},
|
||||
tab_length=2,
|
||||
)
|
||||
|
||||
def markdown_filter(text):
|
||||
md = make_markdown()
|
||||
return md.convert(text)
|
||||
|
||||
env.filters["markdown"] = markdown_filter
|
||||
|
||||
output = root_dir / "test.html"
|
||||
template = env.get_template("base.html")
|
||||
output_dir = root_dir / "output"
|
||||
|
||||
def out_content(self):
|
||||
content = note.content
|
||||
if content.startswith("---\n"):
|
||||
content = content.split("---\n", 2)[2]
|
||||
return content
|
||||
|
||||
note.__class__.our_content = property(out_content)
|
||||
with output.open("w", encoding="utf-8") as f:
|
||||
data = template.render(note=note, vault=vault)
|
||||
f.write(data)
|
||||
def build_tree(vault: Vault):
|
||||
root = vault.path
|
||||
tree = {}
|
||||
for folder, dirnames, filenames in root.walk():
|
||||
for dirname in dirnames[:]:
|
||||
if dirname.startswith(".") or dirname == "attachments":
|
||||
dirnames.remove(dirname)
|
||||
cur = tree
|
||||
for part in folder.relative_to(root).parts:
|
||||
cur = cur.setdefault(part, {"children": {}})["children"]
|
||||
|
||||
import webbrowser
|
||||
webbrowser.open(output.as_uri())
|
||||
print(f"Written to {output}")
|
||||
for filename in filenames:
|
||||
# .DS_Store etc
|
||||
if filename.startswith("."):
|
||||
continue
|
||||
item = {
|
||||
"filename": filename,
|
||||
"folder": str(folder.relative_to(root)),
|
||||
}
|
||||
note = vault.get_note((folder / filename).relative_to(root))
|
||||
if note:
|
||||
item["title"] = note.title
|
||||
# TODO: for search add tags, modified time, content etc
|
||||
|
||||
cur[filename] = item
|
||||
return tree
|
||||
|
||||
|
||||
def write_note(item, tree_json):
|
||||
if "children" in item:
|
||||
for child in item["children"].values():
|
||||
write_note(child, tree_json)
|
||||
else:
|
||||
path = pathlib.Path(item["folder"]) / item["filename"]
|
||||
note = vault.get_note(path)
|
||||
if note:
|
||||
out_path = output_dir / item["folder"] / (item["title"] + ".html")
|
||||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Calculate relative base_path based on folder depth
|
||||
folder = item["folder"]
|
||||
if folder == ".":
|
||||
base_path = ""
|
||||
else:
|
||||
depth = len(pathlib.Path(folder).parts)
|
||||
base_path = "../" * depth
|
||||
|
||||
with out_path.open("w", encoding="utf-8") as f:
|
||||
data = template.render(note=note, vault=vault, base_path=base_path, index_json=tree_json)
|
||||
f.write(data)
|
||||
else:
|
||||
print(f"Note not found for {path}")
|
||||
|
||||
|
||||
def build():
|
||||
"""Build the static site."""
|
||||
print("Building...")
|
||||
|
||||
# 1. Create output dir
|
||||
shutil.rmtree(output_dir, ignore_errors=True)
|
||||
output_dir.mkdir(exist_ok=True)
|
||||
|
||||
# 1b. Symlink CSS/JS to output root
|
||||
(output_dir / "style.css").symlink_to(root_dir / "style.css")
|
||||
(output_dir / "script.js").symlink_to(root_dir / "script.js")
|
||||
|
||||
# 1c. Symlink attachments directory
|
||||
attachments_src = root_dir.parent / "content" / "attachments"
|
||||
attachments_dst = output_dir / "attachments"
|
||||
attachments_dst.symlink_to(attachments_src)
|
||||
|
||||
# 2. Build tree and write index json
|
||||
tree = build_tree(vault)
|
||||
tree_json = json.dumps(tree)
|
||||
with (output_dir / "index.json").open("w") as f:
|
||||
f.write(tree_json)
|
||||
|
||||
# 3. Write out each note as html
|
||||
write_note({"children": tree}, tree_json)
|
||||
|
||||
print(f"Built to {output_dir}")
|
||||
|
||||
|
||||
def serve(port):
|
||||
"""Build and serve the site."""
|
||||
build()
|
||||
|
||||
os.chdir(output_dir)
|
||||
print(f"Serving at http://localhost:{port}")
|
||||
server = http.server.HTTPServer(("", port), http.server.SimpleHTTPRequestHandler)
|
||||
try:
|
||||
server.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\nStopped.")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Static site generator for medical notes")
|
||||
subparsers = parser.add_subparsers(dest="command", required=True)
|
||||
|
||||
subparsers.add_parser("build", help="Build the static site")
|
||||
|
||||
serve_parser = subparsers.add_parser("serve", help="Build and serve the site")
|
||||
serve_parser.add_argument("-p", "--port", type=int, default=8000, help="Port to serve on")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.command == "build":
|
||||
build()
|
||||
elif args.command == "serve":
|
||||
serve(args.port)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
139
wip/style.css
Normal file
139
wip/style.css
Normal file
@@ -0,0 +1,139 @@
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
||||
--font-mono: ui-monospace, "SF Mono", Menlo, monospace;
|
||||
--max-width: 70ch;
|
||||
--line-height: 1.15;
|
||||
--space: 1.25rem;
|
||||
--radius: 6px;
|
||||
--sidebar-width: 250px;
|
||||
}
|
||||
body {
|
||||
margin: 0;
|
||||
display: flex;
|
||||
font-family: var(--font-sans-serif);
|
||||
line-height: var(--line-height);
|
||||
font-size: 1rem;
|
||||
}
|
||||
.sidebar {
|
||||
width: var(--sidebar-width);
|
||||
height: 100vh;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
overflow-y: auto;
|
||||
padding: var(--space);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.sidebar ul { list-style: none; padding: 0; margin: 0; }
|
||||
.sidebar details ul { padding-left: 1rem; }
|
||||
.sidebar li { margin: 0.2rem 0; }
|
||||
.sidebar a { text-decoration: none; }
|
||||
.sidebar a.active { font-weight: 600; }
|
||||
.sidebar details { margin: 0.2rem 0; }
|
||||
.sidebar summary { cursor: pointer; }
|
||||
.content {
|
||||
flex: 1;
|
||||
max-width: var(--max-width);
|
||||
padding: calc(var(--space) * 1.2);
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
body { background: #fafafa; color: #222; }
|
||||
.sidebar { background: #f0f0f0; }
|
||||
a { color: #0645ad; }
|
||||
code, pre { background: #f0f0f0; }
|
||||
hr { border-color: #ddd; }
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body { background: #111; color: #ddd; }
|
||||
.sidebar { background: #1a1a1a; }
|
||||
a { color: #7bbaff; }
|
||||
code, pre { background: #222; }
|
||||
hr { border-color: #333; }
|
||||
}
|
||||
|
||||
p, ul, ol, blockquote, pre, table {
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.25;
|
||||
margin: calc(var(--space) * 1.6) 0 var(--space);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.45rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
h5, h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
padding-inline-start: 1.4rem;
|
||||
margin-block-start: var(--space);
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0.3rem 0;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: var(--font-mono) monospace;
|
||||
font-size: 0.9rem;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0.75rem 1rem;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0.5rem 0.75rem;
|
||||
border: 1px solid currentcolor;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
padding: 0.75rem 1rem;
|
||||
border-inline-start: 4px solid currentcolor;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
img, video {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
border-radius: var(--radius);
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: calc(var(--space) * 2) 0;
|
||||
border: none;
|
||||
border-bottom: 1px solid;
|
||||
opacity: 0.2;
|
||||
}
|
||||
@@ -1,175 +1,14 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
/* Root scales + light/dark system colors */
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--font-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
||||
--font-mono: ui-monospace, "SF Mono", Menlo, monospace;
|
||||
--max-width: 70ch;
|
||||
--line-height: 1.15;
|
||||
--space: 1.25rem;
|
||||
--radius: 6px;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 auto;
|
||||
max-width: var(--max-width);
|
||||
padding: calc(var(--space) * 1.2);
|
||||
font-family: var(--font-body);
|
||||
line-height: var(--line-height);
|
||||
font-size: 1rem;
|
||||
word-wrap: break-word;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
/* Color auto-adjusts with system theme */
|
||||
@media (prefers-color-scheme: light) {
|
||||
body {
|
||||
background: #fafafa;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0645ad;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: #ddd;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background: #111;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #7bbaff;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
background: #222;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
p, ul, ol, blockquote, pre, table {
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
/* Headings: predictable rhythm, not oversized */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.25;
|
||||
margin: calc(var(--space) * 1.6) 0 var(--space);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.45rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
h5, h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Lists */
|
||||
ul, ol {
|
||||
padding-inline-start: 1.4rem;
|
||||
margin-block-start: var(--space);
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0.3rem 0;
|
||||
}
|
||||
|
||||
/* Code */
|
||||
code, pre {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.9rem;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0.75rem 1rem;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0.5rem 0.75rem;
|
||||
border: 1px solid currentcolor;
|
||||
border-opacity: 0.2;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Blockquotes */
|
||||
blockquote {
|
||||
padding: 0.75rem 1rem;
|
||||
border-inline-start: 4px solid currentcolor;
|
||||
border-opacity: 0.4;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* Images & media */
|
||||
img, video {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
border-radius: var(--radius);
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
/* Horizontal rule */
|
||||
hr {
|
||||
margin: calc(var(--space) * 2) 0;
|
||||
border: none;
|
||||
border-bottom: 1px solid;
|
||||
opacity: 0.2;
|
||||
}
|
||||
</style>
|
||||
<base href="{{base_path}}">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
<title>{{note.title}}</title>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js">
|
||||
</script>
|
||||
<script type="text/x-mathjax-config">
|
||||
MathJax.Hub.Config({
|
||||
config: ["MMLorHTML.js"],
|
||||
jax: ["input/TeX", "output/HTML-CSS", "output/NativeMML"],
|
||||
extensions: ["MathMenu.js", "MathZoom.js"]
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="sidebar"></div>
|
||||
<div class="content">
|
||||
<h1>{{note.title}}</h1>
|
||||
<ul>
|
||||
{% for key, value in note.frontmatter.items() %}
|
||||
@@ -186,5 +25,7 @@
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{{note.our_content | markdown}}
|
||||
</div>
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
495
wip/test.html
495
wip/test.html
@@ -1,495 +0,0 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<style>
|
||||
/* Root scales + light/dark system colors */
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--font-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
||||
--font-mono: ui-monospace, "SF Mono", Menlo, monospace;
|
||||
--max-width: 70ch;
|
||||
--line-height: 1.15;
|
||||
--space: 1.25rem;
|
||||
--radius: 6px;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 auto;
|
||||
max-width: var(--max-width);
|
||||
padding: calc(var(--space) * 1.2);
|
||||
font-family: var(--font-body);
|
||||
line-height: var(--line-height);
|
||||
font-size: 1rem;
|
||||
word-wrap: break-word;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
/* Color auto-adjusts with system theme */
|
||||
@media (prefers-color-scheme: light) {
|
||||
body {
|
||||
background: #fafafa;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0645ad;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: #ddd;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background: #111;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #7bbaff;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
background: #222;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
p, ul, ol, blockquote, pre, table {
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
/* Headings: predictable rhythm, not oversized */
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
line-height: 1.25;
|
||||
margin: calc(var(--space) * 1.6) 0 var(--space);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.8rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.45rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
h5, h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Lists */
|
||||
ul, ol {
|
||||
padding-inline-start: 1.4rem;
|
||||
margin-block-start: var(--space);
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 0.3rem 0;
|
||||
}
|
||||
|
||||
/* Code */
|
||||
code, pre {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.9rem;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0.75rem 1rem;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0.5rem 0.75rem;
|
||||
border: 1px solid currentcolor;
|
||||
border-opacity: 0.2;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Blockquotes */
|
||||
blockquote {
|
||||
padding: 0.75rem 1rem;
|
||||
border-inline-start: 4px solid currentcolor;
|
||||
border-opacity: 0.4;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* Images & media */
|
||||
img, video {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
border-radius: var(--radius);
|
||||
margin: var(--space) 0;
|
||||
}
|
||||
|
||||
/* Horizontal rule */
|
||||
hr {
|
||||
margin: calc(var(--space) * 2) 0;
|
||||
border: none;
|
||||
border-bottom: 1px solid;
|
||||
opacity: 0.2;
|
||||
}
|
||||
</style>
|
||||
<title>Anteckningar</title>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js">
|
||||
</script>
|
||||
<script type="text/x-mathjax-config">
|
||||
MathJax.Hub.Config({
|
||||
config: ["MMLorHTML.js"],
|
||||
jax: ["input/TeX", "output/HTML-CSS", "output/NativeMML"],
|
||||
extensions: ["MathMenu.js", "MathZoom.js"]
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Anteckningar</h1>
|
||||
<ul>
|
||||
|
||||
<li>
|
||||
<strong>föreläsare</strong>
|
||||
|
||||
Ingela Parmryd
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<strong>tags</strong>
|
||||
|
||||
|
||||
#biokemi
|
||||
|
||||
#anteckningar
|
||||
|
||||
#transport-över-cellmembran
|
||||
|
||||
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<strong>date</strong>
|
||||
|
||||
2025-11-25
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<p>Diffusion är något INTE behöver hjälp<br />
|
||||
Passiv vs Aktiv transport<br />
|
||||
Faciliterad diffusion</p>
|
||||
<p>plasmamembransystem</p>
|
||||
<ul>
|
||||
<li>tar in och tar</li>
|
||||
<li>när det går ut, börjar det i <ul>
|
||||
<li>ER → Golgi → sekretoriska vesiklar → PM eller </li>
|
||||
<li>ER → golgi → PM</li>
|
||||
<li>heter sekretoriska vägen</li>
|
||||
<li></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>när det går ut<ul>
|
||||
<li>tidigt endosom → sen endosom → lysosom</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Vad påverkar utgången?<ul>
|
||||
<li>tjocklek</li>
|
||||
<li>kolesterol i membranet</li>
|
||||
<li>mättade fettsyror/acylgrupper</li>
|
||||
<li>tätare packning</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Vad påverkar ingången?<ul>
|
||||
<li>permeabilitet (hur genomsläppligt)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h2>Diffusion över membran</h2>
|
||||
<p>Vad är lättast att diffunder?</p>
|
||||
<ul>
|
||||
<li>lättast → svårast<ul>
|
||||
<li>(små) hydrofoba, <script type="math/tex">O_2</script> (stora kommer här också)</li>
|
||||
<li>små polära <script type="math/tex">H_2O</script> (osmos)</li>
|
||||
<li>stora polära, glykos (kolhydrater) </li>
|
||||
<li>joner, laddade har det svårast (aminosyrer, nukleotider)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<p>Glukostransportörer faciliterar diffusion<br />
|
||||
<img src='../content/attachments/Pasted image 20251125132516.png'/><br />
|
||||
Även kallade bärarproteiner </p>
|
||||
<h1>Passiv transport</h1>
|
||||
<p>med gradienten - Man behöver inte tillföra energi, använder energin som tillför gradienten </p>
|
||||
<h3>Transportörer/Bärarproteiner</h3>
|
||||
<ul>
|
||||
<li>transport av polära moleklyer</li>
|
||||
<li>
|
||||
<script type="math/tex">k_m</script> uppnår mättnad är när alla transportörer är upptagna</li>
|
||||
</ul>
|
||||
<p>GLUT1-5 har olika affinitet för glukos<br />
|
||||
Varje transportör kan ta ungefär ~1000 molekyler per sekund<br />
|
||||
Högre i blodet och ECM, transport av glukos sker oftast inåt i cellen<br />
|
||||
Hastigheten beror på<br />
|
||||
- antal transportprotein<br />
|
||||
- hur hög koncentration</p>
|
||||
<p>
|
||||
<script type="math/tex">\Delta G = RTln(C_2/C_1)</script>
|
||||
<br />
|
||||
C1 = till<br />
|
||||
C2 = från</p>
|
||||
<p>Q: Behöver vi kunna formeln. Svaret är att vi inte behöver en miniräknare på tentan.</p>
|
||||
<h3>Diffusion av <script type="math/tex">H_2O</script>
|
||||
</h3>
|
||||
<p>Fysiologiskt salt ~150mM = isotonisk<br />
|
||||
- Det är så mkt joner vi har i miljön runt om och i våra celler<br />
|
||||
- Har man exakt händer ingenting<br />
|
||||
- Har man mer eller mindre så händer osmos<br />
|
||||
- hypertonisk, högre saltkoncentration<br />
|
||||
- då kommer vatten gå ut ur cellen för att xxx koncentrationsgradienten<br />
|
||||
- Då får vi en cell som krymper<br />
|
||||
- hypotonisk, lägre saltkoncentration<br />
|
||||
- då försöker vattnet att ta sig in<br />
|
||||
- då sväller cellen<br />
|
||||
- när det kommer in för mycket vatten så går den sönder, då säger den lysering<br />
|
||||
- man kan använda saltlösning för att få ut innehållet i en cell<br />
|
||||
- sen centrifugerar man så man får ut sina mitokondrier<br />
|
||||
- osmos = strävar mot utjämning av koncentrationsgradienten</p>
|
||||
<hr />
|
||||
<h3>Diffusion av vatten faciliteras av aquaporiner</h3>
|
||||
<h3>Aquaporiner</h3>
|
||||
<ul>
|
||||
<li>Ett ökat vattenflöde ibland, t.ex. i njurarna</li>
|
||||
<li>Utsöndring av svett och tårar</li>
|
||||
<li>Passiv transport</li>
|
||||
<li>Epitel - njurar</li>
|
||||
<li>Det här går mkt snabbare <script type="math/tex">10^6</script> /s 𝛼-poriner</li>
|
||||
<li>Faciliterad diffusion</li>
|
||||
</ul>
|
||||
<h3>Jonkanalerna</h3>
|
||||
<ul>
|
||||
<li>Faciliterar diffusion pendlar mellan att vara öppna eller stängda</li>
|
||||
<li>Faciliterad diffusion</li>
|
||||
<li>
|
||||
<script type="math/tex">10^6</script> /s per kanal<ul>
|
||||
<li>men bara öppna någon millisekund</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Pendlar mellan öppen och stängd</li>
|
||||
<li>Aktiveras betyder att den öppnas<ul>
|
||||
<li>ligandbindning - kommer någonting utanför cellen, får en konformationsändring och öppnar sig<ul>
|
||||
<li>i sliden nämns att det kan t.ex. vara acetylkolin</li>
|
||||
<li>elektriskt rocka, har 20k per kvmm, det gör att det kan komma upp i höga spänningar</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>ändring av spänning<ul>
|
||||
<li>membranpotential, skillnad mellan joner över ett membran</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>mekaniskt</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h3>Transporthastigheten genom jonkanaler styrs av skillnader i koncentrations- och elektriska gradienter</h3>
|
||||
<p>Beroende av andra joner<br />
|
||||
<script type="math/tex">\Delta G = RT ln(C_2/C_1) + ZF\Delta V</script>
|
||||
</p>
|
||||
<p><strong>R:</strong> gaskonstanten = 8.314 J·mol⁻¹·K⁻¹<br />
|
||||
<strong>T:</strong> absoluta temperaturen i Kelvin (t.ex. 310 K för 37°C)<br />
|
||||
<strong>C₂:</strong> koncentration <em>utanför</em> cellen<br />
|
||||
<strong>C₁:</strong> koncentration <em>innanför</em> cellen<br />
|
||||
<strong>Z:</strong> jonens laddning (t.ex. Na⁺ = +1, Ca²⁺ = +2, Cl⁻ = –1)<br />
|
||||
<strong>F:</strong> Faradays konstant (≈ 96 485 C/mol), laddning per mol elektroner<br />
|
||||
<strong>ΔV:</strong> skillnaden i membranpotential (V₂ – V₁), mäts i volt</p>
|
||||
<hr />
|
||||
<h3>Hur skulle en jonkanal vara uppbyggd?</h3>
|
||||
<ul>
|
||||
<li>amfipatiska hydrofila mot kanalen, hydrofoba mot insidan av cellmembranet</li>
|
||||
<li>8 helixar ovanför</li>
|
||||
<li>slicad i mitten av hydrofob/fil</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h3>Uppbyggnaden av katjonkanaler är konserverad</h3>
|
||||
<p><img src='../content/attachments/Pasted image 20251125135429.png'/><br />
|
||||
- central por av helix S5 och S6<br />
|
||||
- S1-4 bildar paddel utanför por</p>
|
||||
<p>S4 positivt laddad, känner av ändring i membranpotential<br />
|
||||
padel fälls upp vid aktivering</p>
|
||||
<hr />
|
||||
<h3>
|
||||
<script type="math/tex">K^+</script>-kanalen passar <script type="math/tex">K^+</script> perfekt om dehydratisering sker</h3>
|
||||
<p>Selektivitetsfilter K+-kanalen<br />
|
||||
Det känner igen storlek, konkurrerar mot Na och Ka.<br />
|
||||
<script type="math/tex">NA^+</script> 0.95 Å <br />
|
||||
<script type="math/tex">K^+</script> 1.33 Å</p>
|
||||
<p>För att passa den här kanalen som är 3 Å, <br />
|
||||
Dehydratiseras, bort med vatten<br />
|
||||
Binder till röda grupper som är karbonylgrupper<br />
|
||||
Dehydratisering av <script type="math/tex">K^+</script> ger lika många bindingar i filtret som till <script type="math/tex">H_2O</script>
|
||||
<br />
|
||||
1000 gr höre selektivitet för <script type="math/tex">K^+</script> än <script type="math/tex">Na^+</script>
|
||||
</p>
|
||||
<p>Kostar energi att föra igenom Na+, då blir det inte effektivt<br />
|
||||
Transport via repulsion i fyra bindingsställning (skjutsa vidare)</p>
|
||||
<p>Na⁺ är mindre → har mycket högre laddningstäthet → binder vatten hårdare. Att ta bort vatten kostar därför mer energi för Na⁺ än för K⁺.</p>
|
||||
<p><strong>Varför kan K⁺ passera utan kostnad?</strong><br />
|
||||
Selektivitetsfiltret är byggt exakt för K⁺-storlek: karbonylgrupperna sitter så att de ersätter <em>precis</em> de vattenbindningar K⁺ förlorar. Energin blir nästan neutral.</p>
|
||||
<hr />
|
||||
<h3>Jonkanal stängs snabbt efter att ha öppnats</h3>
|
||||
<p>Bolldomän i cytoplasman med en länk med ett bindningsställe i den aktiverade, öppna kanalen den kan binda in till<br />
|
||||
- I öppen kanal blir <em>bindningen</em>→inaktiverad<br />
|
||||
- States<br />
|
||||
- Closed hänger och slänger<br />
|
||||
- Open precis utanför<br />
|
||||
- Inactivated inne i hållet</p>
|
||||
<p>Kanalen stängs efter ms efter aktivering</p>
|
||||
<p>Acetylkolinreceptorn är en receptor för ormgift<br />
|
||||
Alkaliner, cuarve, hämar transport av jonkanaler</p>
|
||||
<p>kanaler och transportförer har olika mekanismer för att öppna och stänga</p>
|
||||
<hr />
|
||||
<h3>Kanalfogar</h3>
|
||||
<p>(gap junctions)</p>
|
||||
<p>Möliggör snabb transport mellan celler<br />
|
||||
Förbinder cytoplasman<br />
|
||||
Uppbyggda av konnexinringar<br />
|
||||
Fri passage för <em>små</em> hydrofila molekyler/joner < kDa</p>
|
||||
<p>Näringsöverföring: lins & ben<br />
|
||||
Synkronisering: <br />
|
||||
- finns mkt i hjärtat så allt drar åt sig samtidigt<br />
|
||||
- livmoder för forlossning, för sammandrarning<br />
|
||||
- stängs av <script type="math/tex">[Ca^{2+}]</script> går upp eller <script type="math/tex">[H^+]</script>
|
||||
</p>
|
||||
<hr />
|
||||
<h1>Aktiv transport</h1>
|
||||
<p>mot gradient<br />
|
||||
kräver energitillsförsel</p>
|
||||
<p>Det finns jongradienter i däggdjursceller<br />
|
||||
- Na+ lågt i högt utanför<br />
|
||||
- K högt inne, lågt utanför<br />
|
||||
- Cl lågt inne, högt utanför</p>
|
||||
<h4>Na+–K+ ATPaset, en jonpump</h4>
|
||||
<p>1/3 av all energi i alla celler används till det här<br />
|
||||
(mer i vissa celler än andra)</p>
|
||||
<ul>
|
||||
<li>Nervsignalering</li>
|
||||
<li>för att få in aminosyror/andra byggstenar</li>
|
||||
<li>Pendlar mellan två konformationer (öppna åt olika håll, in/ut, ut/in)<ul>
|
||||
<li>de fosfyliseras, tar upp en P från ATP från Aspartat</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>6 steg<ul>
|
||||
<li>1: 3 Na+ binder på cyt-sidan</li>
|
||||
<li>2: Fosforylering</li>
|
||||
<li>3: Eversion (vänder sig), frisläppning av Na+ extra cellulärt</li>
|
||||
<li>4: 2 Ka+ binder in på ECM-sidan</li>
|
||||
<li>5: Defosfylering</li>
|
||||
<li>6: Eversion, K+ frisläpps i cytoplasman</li>
|
||||
<li>Alltid Na+ cytoplasma→ECM och Ka+ ECM→cytoplasma<br />
|
||||
Finns 70 st andra kända pumpar</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h4>Kardiotona steoider hämmar Na+-K+ ATPaset</h4>
|
||||
<p>Används som läkemedel för personer som har hjärtsvikt, leder till starkar kontraktioner av hjärtmuskler<br />
|
||||
Läkemedel heter Digitoxin, Onabain som man kan plocka från växter</p>
|
||||
<p>Behöver veta vad det här proteinet gör</p>
|
||||
<hr />
|
||||
<h4>ABC-transportörer ändrar konformation när de binder och hydrolyserar ATP</h4>
|
||||
<p>ATP-bindande kasett<br />
|
||||
Kräver två ATP per transportcykel<br />
|
||||
Används för att transportera ut socker i eukaryota (i prokaryoter in)<br />
|
||||
1. Substrat binder från cytoplasman<br />
|
||||
2. Konformationsändring - ökad affinitet för ATP<br />
|
||||
3. ATP binder - eversion (vänder)<br />
|
||||
4. Substrat frisläpps ECM<br />
|
||||
5. Defosfylering 2 ATP → 2 ADP, konformationsändring, eversion</p>
|
||||
<p>Ställer till besvär inom medicinen, skickar in hydrofoba föreningar. Många läkemedel är hydrofoba. Men sådana här proteiner finns det som inducerar läkemedel, multidrog-resistans, när de fått en så skickar de ut. Men de skickar ut andra läkemedel också</p>
|
||||
<h4>MDR-multidrogresistens</h4>
|
||||
<ul>
|
||||
<li>ABC-transportör</li>
|
||||
<li>Skickar ut xenobiotika=kroppsfrämmande</li>
|
||||
<li>Induceras t.ex. av läkemedel</li>
|
||||
<li>Blir fler om de utsätts av mkt<br />
|
||||
CFTR-muterat cystisk firos, ABC-transportör. Segare slem i lungorna, olika mkt vatten som attraheras till det här slemmet.</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h3>Tre grupper av membrantransportör</h3>
|
||||
<p>Kan vara både passiva och transporta</p>
|
||||
<ul>
|
||||
<li>Uniporter<ul>
|
||||
<li><em>passiv transport</em></li>
|
||||
<li>en förening, två håll</li>
|
||||
<li>t.ex. glukostransportören</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Symport<ul>
|
||||
<li><em>sekundär aktiv transport</em><ul>
|
||||
<li>p-typ ATP eller ABC-transportörer heter <em>primär aktiv transport</em></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>två föreningar, samma håll</li>
|
||||
<li>använder en gradient för att skapa en annan</li>
|
||||
<li>händer t.ex. epitelceller där det krävs mkt in</li>
|
||||
<li>Na+ hjälper glukos in mot sin gradient</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Antiporter<ul>
|
||||
<li><em>sekundär aktiv transport</em></li>
|
||||
<li>två föreningar, olika håll<ul>
|
||||
<li>en med gradient - nästan alltid <script type="math/tex">Na^+_{(in)}</script>
|
||||
</li>
|
||||
<li>en mot gradient - tex <script type="math/tex">Ca^{2+}_{(in)}</script>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
<h3>Glukos kan tas upp mot koncentrationsgradient med sekundär aktiv transport Glukosupptag</h3>
|
||||
<hr />
|
||||
<h3>Glukosupptag från tarmarna involverar transportörer av olika typer Begrepp</h3>
|
||||
<p>I samma cell kan man ha olika typer av transport av samma typ av</p>
|
||||
<h1>Summary</h1>
|
||||
<p>transportör med gradient<br />
|
||||
hyperton mer joner, ut vatten<br />
|
||||
hypoton mindre joner, in vatten<br />
|
||||
aquaporiner släpper bara igenom vatten<br />
|
||||
jonkanaler behöver aktiveras 3 st (ligand, potential, mekaniska dragningar)<br />
|
||||
primärt om ATP är med i reaktionen<br />
|
||||
sekundär om ATP hjälpt till att bygga upp gradienten<br />
|
||||
kanalfogar binder ihop små celler, t.ex. näring i benceller<br />
|
||||
Jongradienter Na/Kalium mkt inne/ut på av ATPaset-pump<br />
|
||||
ABC kräver 2 ATP fosfo+defosfo<br />
|
||||
MDR inblandat i pumpar</p>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user